因為公司項目需要集成支付寶支付,所以這次我把我集成支付寶支付的過程記錄一下
1接入準備
接入準備:https://opensupport.alipay.com/support/helpcenter/190/201602469553?ant_source=antsupport
支付寶的開發(fā)文檔里的接入準備寫的很詳細烙丛,根據開發(fā)文檔一步步來就可以了
2服務端demo
我先放一下主要系統(tǒng)交互圖
我的理解服務端要做的事就是
1倍谜、準備好支付寶需要的各種參數傳入到支付寶給的接口中小压,然后支付寶返回給你支付請求玉工。然后IOS或者安卓獲取這串支付請求去調起支付寶的收銀界面,如果可以正常調起汁胆,那說明這一步沒問題梭姓。
2、支付完成后支付寶會去調用你設置的異步回調接口嫩码,你需要在回調接口中判斷用戶是否支付完成
首先我們先引入支付寶的依賴
<!--添加支付寶的依賴-->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.8.10.ALL</version>
</dependency>
服務端官網的開發(fā)文檔:https://opendocs.alipay.com/open/54/106370/
private final static String APP_ID = "你的支付寶APPID";
private final static String APP_PRIVATE_KEY = "你的應用私鑰";
private final static String CHARSET = "UTF-8";
private final static String ALIPAY_PUBLIC_KEY = "";
private final static String URL = "https://openapi.alipay.com/gateway.do";
private static String CER_PATH = "/opt/aliPay/"; //服務器支付寶證書
// private static String CER_PATH="E:\\ALiPayCert\\"; //本地Windows測試路徑
/**
* JAVA服務端 SDK 生成 APP支付訂單息
*/
public static String generatePayOrderInformation() throws AlipayApiException {
//構造client
CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
//設置網關地址
certAlipayRequest.setServerUrl(URL);
//設置應用Id
certAlipayRequest.setAppId(APP_ID);
//設置應用私鑰
certAlipayRequest.setPrivateKey(APP_PRIVATE_KEY );
//設置請求格式糊昙,固定值json
certAlipayRequest.setFormat("json");
//設置字符集
certAlipayRequest.setCharset(CHARSET);
//設置簽名類型
certAlipayRequest.setSignType("RSA2");
//設置應用公鑰證書路徑
certAlipayRequest.setCertPath(CER_PATH+"你的應用公鑰證書路徑");
//設置支付寶公鑰證書路徑
certAlipayRequest.setAlipayPublicCertPath(CER_PATH+"你的支付寶公鑰證書路徑");
//設置支付寶根證書路徑
certAlipayRequest.setRootCertPath(CER_PATH+"你的支付寶根證書路徑");
//構造client
AlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest);
//實例化具體API對應的request類,類名稱和接口名稱對應,當前調用接口名稱:alipay.trade.app.pay
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
//SDK已經封裝掉了公共參數,這里只需要傳入業(yè)務參數谢谦。以下方法為sdk的model入參方式(model和biz_content同時存在的情況下取biz_content)释牺。
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setBody("這是一雙鞋子"); //對一筆交易的具體描述信息
model.setSubject("鞋子"); //商品的標題/交易標題/訂單標題/訂單關鍵字等
model.setOutTradeNo("1231231"); //商戶網站唯一訂單號
model.setTimeoutExpress(30m); //該筆訂單允許的最晚付款時間,逾期將關閉交易回挽。取值范圍:1m~15d没咙。m-分鐘,h-小時千劈,d-天祭刚,1c-當天(1c-當天的情況下,無論交易何時創(chuàng)建,都在0點關閉)涡驮。該參數數值不接受小數點暗甥,如 1.5h,可轉換為 90m捉捅。
model.setTotalAmount(100); //訂單總金額撤防,單位為元,精確到小數點后兩位
model.setProductCode("QUICK_MSECURITY_PAY"); //銷售產品碼棒口,商家和支付寶簽約的產品碼寄月,APP支付功能中該值固定為:QUICK_MSECURITY_PAY
request.setBizModel(model);
request.setNotifyUrl("http://你的回調路徑/aliPaySuccess");//商戶外網可以訪問的異步地址
try {
//這里和普通的接口調用不同,使用的是sdkExecute
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
System.out.println(response.getBody());//就是orderString 可以直接給客戶端請求无牵,無需再做處理漾肮。
return response.getBody();
} catch (AlipayApiException e) {
e.printStackTrace();
return null;
}
}
我這里接口加簽方式選擇的是公鑰證書如果你選擇的是普通公鑰方式應該只需要把公鑰跟私鑰傳入代碼即可。上面獲取的response.getBody()就是傳給客戶端的支付請求茎毁,如果客戶端可以調出支付寶的收銀臺說明代碼沒問題克懊。我們也可以使用支付寶給的調試工具進行調試
調試工具:https://openclub.alipay.com/club/history/read/7695
截下來我們就要編寫上面我們設置的異步回調接口的代碼
/***
* 支付寶成功回調
* @param request
* @return
* @throws Exception
*/
@RequestMapping("aliPaySuccess")
public Object aliPaySuccess(HttpServletRequest request) {
Map<String, Object> map = new HashMap<>();
try {
Map<String, String> params = new HashMap<>();
Map requestParams = request.getParameterMap();
for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
String name = (String) iter.next();
String[] values = (String[]) requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
}
// 亂碼解決,這段代碼在出現亂碼時使用七蜘。
// valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
params.put(name, valueStr);
}
String orderNumber = request.getParameter("out_trade_no"); //獲取訂單號
String total_amount = request.getParameter("total_amount"); //獲取總金額
String trade_status = request.getParameter("trade_status"); //交易狀態(tài)
if(trade_status.equals("TRADE_FINISHED") || trade_status.equals("TRADE_SUCCESS")){
//判斷該筆訂單是否在商戶網站中已經做過處理(可參考“集成教程”中“3.4返回數據處理”)
//如果沒有做過處理保檐,根據訂單號(out_trade_no)在商戶網站的訂單系統(tǒng)中查到該筆訂單的詳細,并執(zhí)行商戶的業(yè)務程序
//如果有做過處理崔梗,不執(zhí)行商戶的業(yè)務程序
System.out.println("================================交易狀態(tài)為:"+trade_status+"====================================");
System.out.println("================================訂單編號為:"+orderNumber+"====================================");
System.out.println("================================訂單金額為:"+total_amount+"====================================");
//支付成功后進行修改訂單等操作
return "SUCCESS";
} else {
map.put("returnValue", 2);
map.put("errMsg", "訂單未支付完成");
System.out.println("================================訂單未支付完成====================================");
return map;
}
}catch (Exception e){
e.printStackTrace();
map.put("returnValue", 99);
map.put("errMsg", "系統(tǒng)錯誤,請不要違法垒在。");
System.out.println("================================系統(tǒng)錯誤====================================");
return map;
}
}
官網文檔:https://opendocs.alipay.com/open/204/105301/#s1
測試結果在控制臺打印出來蒜魄,金額,訂單號跟我們創(chuàng)建的訂單一樣說明服務端集成支付寶支付就算成功了场躯!