1.調起支付流程:

第一步:創建應用並獲取APPID
去螞蟻金服開放平台(open.alipay.com),在開發者中心中創建應用,會生成應用唯一標識(APPID),申請開通支付功能。。
第二步:配置密鑰
- 支付寶公鑰:支付寶的RSA公鑰,商戶使用該公鑰驗證該結果是否是支付寶返回的。
- 2.下載阿里雲的RSA密鑰工具生成密鑰和公鑰(下載地址:https://docs.open.alipay.com/291/106097/)

- 3.上傳工具生成的公鑰到阿里雲,私鑰放到服務器,調用接口時使用

第三步:集成和開發
1:導入jar包
<!-- 阿里雲支付寶支付的jar -->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>3.3.87.ALL</version>
</dependency>
2:具體demo
a:阿里雲基本參數類:
public interface AliPayConfig { /** 支付寶支付的appid */ String APP_ID = ""; /** 應用私鑰 */ String PRIVATE_KEY = ""; //應用公鑰 String APP_PUBLIC_KEY = ""; //支付寶公鑰 String ALI_PUBLIC_KEY =""; //字符集 String CHARSET = "utf-8"; //數據格式 String FORMAT = "json"; //加密方式 String SIGN_TYPE = "RSA2"; /** 以下參數為調用地址 */ //接收支付寶回調地址notify_url //測試時候可以映射到本地地址可測試,不一定非要部署到線上 String NOTIFY_URL = ""; String GATEWAY_URL = "https://openapi.alipay.com/gateway.do"; }
b:統一下單接口
@ResponseBody @RequestMapping("/aliPayOrder") public JSONObject aliPayOrder(String outtradeno) { JSONObject returnValue = null; //實例化客戶端 AlipayClient alipayClient = new DefaultAlipayClient(AliPayConfig.GATEWAY_URL, AliPayConfig.APP_ID, AliPayConfig.PRIVATE_KEY, AliPayConfig.FORMAT, AliPayConfig.CHARSET, AliPayConfig.ALI_PUBLIC_KEY, AliPayConfig.SIGN_TYPE); //實例化具體API對應的request類,類名稱和接口名稱對應,當前調用接口名稱:alipay.trade.app.pay AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest(); //SDK已經封裝掉了公共參數,這里只需要傳入業務參數。以下方法為sdk的model入參方式(model和biz_content同時存在的情況下取biz_content)。 outtradeno = WeixinPayUtil.getOrderIdByTime(); AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); model.setBody("測試"); model.setSubject("App支付測試"); model.setOutTradeNo(outtradeno); model.setTimeoutExpress("30m"); model.setTotalAmount("0.01"); model.setProductCode("QUICK_MSECURITY_PAY"); request.setBizModel(model); request.setNotifyUrl(AliPayConfig.NOTIFY_URL); try { //這里和普通的接口調用不同,使用的是sdkExecute AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request); //就是orderString 可以直接給客戶端請求,無需再做處理。 returnValue = new JSONObject(); returnValue.put("errCode", ErrorCode.SUCCESS_RETRUN); returnValue.put("errMsg", "ok"); returnValue.put("data", response.getBody()); logger.info("【支付寶統一下單 --- 成功 】,訂單號為:{}",outtradeno); return returnValue; } catch (AlipayApiException e) { logger.info("【支付寶統一下單 --- 失敗 】,訂單號為:{},原因為:{}",outtradeno,e.getErrMsg().toString()); returnValue = ErrorCodeUtil.ERROR_FAILED("下單失敗"); return returnValue; } }
c:支付回調接口
@RequestMapping("aliPay_notify")
public void aliPay_notify(HttpServletRequest request, HttpServletResponse response) {
//獲取支付寶POST過來反饋信息
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] + ",";
}
params.put(name, valueStr);
}
try {
//驗證簽名
boolean flag = AlipaySignature.rsaCheckV1(params, AliPayConfig.ALI_PUBLIC_KEY, AliPayConfig.CHARSET, AliPayConfig.SIGN_TYPE);
if (flag) {
if ("TRADE_SUCCESS".equals(params.get("trade_status"))) { //業務邏輯處理
//付款金額
String amount = params.get("buyer_pay_amount");
//商戶訂單號
String out_trade_no = params.get("out_trade_no");
//支付寶交易號
String trade_no = params.get("trade_no");
//附加數據
String passback_params = params.get("passback_params");
response.getWriter().write("success");
}
}else {
logger.info("【支付寶支付--異步回調】回調失敗,簽名驗證失敗");
}
} catch (AlipayApiException e) {
logger.error("【支付寶支付--異步回調】回調失敗,阿里雲接口調用錯誤,原因為:{}",e.getMessage());
} catch (Exception e) {
logger.error("【支付寶支付--異步回調】回調失敗,原因為:{}",e.getMessage());
}
}
d:退款接口
@RequestMapping("aliPay_refund")
@ResponseBody
public JSONObject aliPay_refund(final String outTradeNo,final String transactionId){
JSONObject returnValue = null ;
try {
//實例化客戶端
AlipayClient alipayClient = new DefaultAlipayClient(AliPayConfig.GATEWAY_URL, AliPayConfig.APP_ID, AliPayConfig.PRIVATE_KEY, AliPayConfig.FORMAT, AliPayConfig.CHARSET, AliPayConfig.ALI_PUBLIC_KEY, AliPayConfig.SIGN_TYPE);
//實例化具體API對應的request類,類名稱和接口名稱對應,當前調用接口名稱:alipay.trade.refund
AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
//SDK已經封裝掉了公共參數,這里只需要傳入業務參數。以下方法為sdk的model入參方式(model和biz_content同時存在的情況下取biz_content)。
AlipayTradeRefundModel model = new AlipayTradeRefundModel();
//優先使用支付寶的訂單id
if(transactionId == null || transactionId.length() == 0){
model.setOutTradeNo(outTradeNo);
}else {
model.setTradeNo(transactionId);
}
//測試金額1分錢
String price = "0.01";
//測試退款理由
model.setRefundReason("測試退款");
//退款金額
model.setRefundAmount(price);
request.setBizModel(model);
AlipayTradeRefundResponse response = alipayClient.execute(request);
if(response.isSuccess()){
returnValue = ErrorCodeUtil.ERROR_FAILED("退款成功");
return returnValue ;
} else {
returnValue = ErrorCodeUtil.ERROR_FAILED(response.getSubMsg());
return returnValue ;
}
}catch (AlipayApiException e) {
logger.error("【支付寶支付 -- 退款失敗】原因為:{}",e.getMessage());
returnValue = ErrorCodeUtil.ERROR_FAILED("退款失敗");
return returnValue ;
}
}
e:關閉訂單
@ResponseBody @RequestMapping("aliPay_close") public JSONObject aliPay_close(final String outTradeNo,final String transactionId){ JSONObject returnValue = null ; try { //實例化客戶端 AlipayClient alipayClient = new DefaultAlipayClient(AliPayConfig.GATEWAY_URL, AliPayConfig.APP_ID, AliPayConfig.PRIVATE_KEY, AliPayConfig.FORMAT, AliPayConfig.CHARSET, AliPayConfig.ALI_PUBLIC_KEY, AliPayConfig.SIGN_TYPE); //實例化具體API對應的request類,類名稱和接口名稱對應,當前調用接口名稱:alipay.trade.close AlipayTradeCloseRequest request = new AlipayTradeCloseRequest(); //SDK已經封裝掉了公共參數,這里只需要傳入業務參數。以下方法為sdk的model入參方式(model和biz_content同時存在的情況下取biz_content)。 AlipayTradeCloseModel model = new AlipayTradeCloseModel(); //優先使用支付寶的訂單id if(transactionId == null || transactionId.length() == 0){ model.setOutTradeNo(outTradeNo); }else { model.setTradeNo(transactionId); } request.setBizModel(model); AlipayTradeCloseResponse response = alipayClient.execute(request); if(response.isSuccess()){ returnValue = ErrorCodeUtil.ERROR_FAILED("訂單關閉成功"); return returnValue ; } else { returnValue = ErrorCodeUtil.ERROR_FAILED(response.getSubMsg()); return returnValue ; } }catch (AlipayApiException e) { logger.error("【支付寶支付 -- 關閉訂單】關閉訂單失敗,原因為:{}",e.getMessage()); returnValue = ErrorCodeUtil.ERROR_FAILED("訂單關閉失敗"); return returnValue ; } }
f:查詢訂單狀態
@ResponseBody @RequestMapping("aliPay_query") public JSONObject aliPay_query(final String outTradeNo,final String transactionId){ JSONObject returnValue = null ; try { //實例化客戶端 AlipayClient alipayClient = new DefaultAlipayClient(AliPayConfig.GATEWAY_URL, AliPayConfig.APP_ID, AliPayConfig.PRIVATE_KEY, AliPayConfig.FORMAT, AliPayConfig.CHARSET, AliPayConfig.ALI_PUBLIC_KEY, AliPayConfig.SIGN_TYPE); //實例化具體API對應的request類,類名稱和接口名稱對應,當前調用接口名稱:alipay.trade.query AlipayTradeQueryRequest request = new AlipayTradeQueryRequest(); //SDK已經封裝掉了公共參數,這里只需要傳入業務參數。以下方法為sdk的model入參方式(model和biz_content同時存在的情況下取biz_content)。 AlipayTradeQueryModel model = new AlipayTradeQueryModel(); //優先使用支付寶的訂單id if(transactionId == null || transactionId.length() == 0){ model.setOutTradeNo(outTradeNo); }else { model.setTradeNo(transactionId); } request.setBizModel(model); AlipayTradeQueryResponse response = alipayClient.execute(request); if(response.isSuccess()){ if("WAIT_BUYER_PAY".equals(response.getTradeStatus())){ returnValue = ErrorCodeUtil.ERROR_FAILED("交易創建,等待買家付款"); return returnValue ; }else if("TRADE_CLOSED".equals(response.getTradeStatus())){ returnValue = ErrorCodeUtil.ERROR_FAILED("未付款交易超時關閉,或支付完成后全額退款"); return returnValue ; }else if("TRADE_SUCCESS".equals(response.getTradeStatus())){ returnValue = ErrorCodeUtil.ERROR_FAILED("交易支付成功"); return returnValue ; }else if("TRADE_FINISHED".equals(response.getTradeStatus())){ returnValue = ErrorCodeUtil.ERROR_FAILED("交易結束,不可退款"); return returnValue ; }else { returnValue = ErrorCodeUtil.ERROR_FAILED("未知狀態"); return returnValue ; } } else { returnValue = ErrorCodeUtil.ERROR_FAILED(response.getSubMsg()); return returnValue ; } }catch (AlipayApiException e) { logger.error("【支付寶支付 -- 查詢訂單】查詢訂單失敗,原因為:{}",e.getMessage()); returnValue = ErrorCodeUtil.ERROR_FAILED("訂單查詢失敗"); return returnValue ; } }
