支付寶sdk
創(chuàng)建一個(gè)支付寶的util類
public class AlipayUtil {
public static final String APP_ID = "2016091100486489";//這個(gè)支付id為我的沙箱的app_id
private static final String APP_PRIVATE_KEY = "************";//支付寶的私鑰
public static final String ALIPAY_PUBLIC_KEY = "***********";//這個(gè)為你在支付寶上的商戶的公鑰秀存,而不是支付寶公鑰
public static final String ALIPAY_ZHI_KEY ="**********";//這個(gè)是支付寶的公鑰
public static final String SIGNTYPE = "RSA2";//算法
public static final String NOTIFYURL = "http://trivel.free.ngrok.cc/***";//支付寶回調(diào)的借口
private static AlipayClient alipayClient = null;
因?yàn)橹Ц秾歛lipayClient本身是線程安全的尸昧,因此只用創(chuàng)建一個(gè)关翎,創(chuàng)建成單例的模式
? ? public static AlipayClient getAlipayClient() {
? ? ? ? if (alipayClient == null) {
? ? ? ? ? ? synchronized (AlipayUtil.class) {//AlipayConstants.CHARSET_UTF8
? ? ? ? ? ? ? ? if (null == alipayClient) {//https://openapi.alipay.com/gateway.do https://openapi.alipaydev.com/gateway.do
? ? ? ? ? ? ? ? ? ? alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", APP_ID,
? ? ? ? ? ? ? ? ? ? APP_PRIVATE_KEY, AlipayConstants.FORMAT_JSON,AlipayConstants.CHARSET_UTF8,
? ? ? ? ? ? ? ? ? ? ALIPAY_ZHI_KEY,SIGNTYPE);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return alipayClient;
? ? }
}
使用支付寶的sdk,給app端發(fā)送一個(gè)簽名
public Map<String,String> alipayTradeAppPay() throws AlipayApiException, UnsupportedEncodingException{
AlipayTradeAppPayRequest aRequest = new AlipayTradeAppPayRequest();HashMapresult = new HashMap();
Map<String,String> result = new HashMap<String,String>();
AlipayTradeAppPayModel amodel = new AlipayTradeAppPayModel();
amodel.setBody("測試數(shù)據(jù)");
amodel.setSubject("名稱");
amodel.setGoodsType("1");//0虛擬產(chǎn)品1實(shí)物
amodel.setOutTradeNo("產(chǎn)品的訂單號(hào)");
amodel.setProductCode("QUICK_MSECURITY_PAY");
amodel.setTotalAmount("總錢數(shù)拙寡,注意應(yīng)為double類型");
amodel.setTimeoutExpress("30m");//支付寶支付的時(shí)間設(shè)置
aRequest.setBizModel(amodel);
aRequest.setNotifyUrl(AlipayUtil.NOTIFYURL);//設(shè)置回調(diào)的接口
AlipayTradeAppPayResponse? aResponse = AlipayUtil.getAlipayClient().sdkExecute(aRequest);
if(aResponse.isSuccess()){
?? result.put("result", aResponse.getBody());
?? result.put("status", "0");
?? result.put("msg","訂單生成成功");
} else {
?? result.put("status", "1");
?? result.put("msg", "訂單生成失敗");
}
return result;
}
給APP端返回的result,app端不用再去編碼,因?yàn)槠湟呀?jīng)是編碼過得,否則會(huì)起吊客戶端支付寶失敗
支付寶回調(diào)的接口设易,當(dāng)支付完成時(shí),支付寶會(huì)回調(diào)這個(gè)接口蛹头,并進(jìn)行簽名的認(rèn)證
public String alipayTradeNotifyUrl(HttpServletRequest request,HttpServletResponse response){
Mapparams = new HashMap();
//1.從支付寶回調(diào)的request域中取值
MaprequestParams = request.getParameterMap();
for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
? ? ? ? String name = iter.next();?
? ? ? ? String[] values = requestParams.get(name);?
? ? ? ? String valueStr = "";?
? ? ? ? for (int i = 0; i < values.length; i++) {?
? ? ? ? ? ? valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";?
? ? ? ? }?
? ? ? ? // 亂碼解決顿肺,這段代碼在出現(xiàn)亂碼時(shí)使用。如果mysign和sign不相等也可以使用這段代碼轉(zhuǎn)化?
? ? ? ? // valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");?
? ? ? ? params.put(name, valueStr);?
? ? }?
? ? ? //2.封裝必須參數(shù)
? ? String tradeStatus = request.getParameter("trade_status");? //交易狀態(tài)? ?
? ? //3.簽名驗(yàn)證(對(duì)支付寶返回的數(shù)據(jù)驗(yàn)證掘而,確定是支付寶返回的)
? ? boolean signVerified = false;?
? ? try {?
? ? ? ? //3.1調(diào)用SDK驗(yàn)證簽名
? ? ? ? signVerified = AlipaySignature.rsaCheckV1(params,AlipayUtil.ALIPAY_ZHI_KEY, AlipayConstants.CHARSET_UTF8,???? AlipayUtil.SIGNTYPE);
? ? ? ? } catch (AlipayApiException e) {?
? ? ? ? e.printStackTrace();?
? ? }?
? ? //4.對(duì)驗(yàn)簽進(jìn)行處理
? ? if (signVerified) {? ? //驗(yàn)簽通過?
? ? ? ? if(tradeStatus.equals("TRADE_SUCCESS")) {
? ? ? ? System.err.println("驗(yàn)簽失敗1");
? ? ? ? //只處理支付成功的訂單: 修改交易表狀態(tài),支付成功
? ? ? ?? return "success";
? ? ? ? }else{
? ? ? ? ? ? return "fail";
? ? ? ? }
? ? } else {? //驗(yàn)簽不通過?
? ? ? ? return "fail";
? ? }
}