支付寶支付-常用支付API詳解(查詢、退款、提現等)
本文章已同步釋出到簡書 http://www.jianshu.com/p/b6e6291709c7
1、前言 此專案已開源歡迎Start、PR、發起Issues一起討論交流共同進步
https://github.com/Javen205/IJPay http://git.oschina.net/javen205/IJPay
前面幾篇檔案詳細介紹了 支付寶提現、掃碼支付、條碼支付、Wap支付、App支付
支付寶支付-提現到個人支付寶
支付寶支付-掃碼支付
支付寶支付-刷卡支付(條碼支付)
支付寶Wap支付你瞭解多少?
Android版-支付寶APP支付
一張二維碼整合微信、支付寶支付
其中也斷斷續續的提到了一些介面。本片文章主要是總結支付寶支付中常用的一些介面
2、常用的介面總結 這裡使用表格的方式列出 官方介面列表以及詳細的引數說明
3、使用服務端SDK封裝介面 3.1 服務端SDK下載及其使用方法 參考 開放平臺服務端SDK
Maven專案引用JAR包可以參考 支付寶Wap支付你瞭解多少? 裡面有詳細的介紹
重要說明 1、介面使用的編碼格式為 UTF-8 2、介面資料互動使用的是 json 3、介面加密的模式使用官方推薦的 RSA2 4、本片文章主要是介紹Java的使用方法與封裝
3.2 初始化SDK 在SDK呼叫前需要進行初始化
AlipayClient alipayClient = new DefaultAlipayClient(URL, APP_ID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE); 關鍵引數說明:
3.3 API介面封裝 3.3.1 alipay.trade.query介面封裝 該介面提供所有支付寶支付訂單的查詢,商戶可以通過該介面主動查詢訂單狀態,完成下一步的業務邏輯。 需要呼叫查詢介面的情況: 當商戶後臺、網路、伺服器等出現異常,商戶系統最終未接收到支付通知; 呼叫支付介面後,返回系統錯誤或未知交易狀態情況; 呼叫alipay.trade.pay,返回INPROCESS的狀態; 呼叫alipay.trade.cancel之前,需確認支付狀態;
/** * 交易查詢介面 * https://doc.open.alipay.com/docs/api.htm?spm=a219a.7395905.0.0.8H2JzG&docType=4&apiId=757 * @param bizContent * @return * @throws AlipayApiException */ public static boolean isTradeQuery(AlipayTradeQueryModel model) throws AlipayApiException{ AlipayTradeQueryResponse response = tradeQuery(model); if(response.isSuccess()){ return true; } return false; }
public static AlipayTradeQueryResponse tradeQuery(AlipayTradeQueryModel model) throws AlipayApiException{ AlipayTradeQueryRequest request = new AlipayTradeQueryRequest(); request.setBizModel(model); return alipayClient.execute(request); } 3.3.2 alipay.trade.refund 介面封裝 當交易發生之後一段時間內,由於買家或者賣家的原因需要退款時,賣家可以通過退款介面將支付款退還給買家,支付寶將在收到退款請求並且驗證成功之後,按照退款規則將支付款按原路退到買家帳號上。 交易超過約定時間(簽約時設定的可退款時間)的訂單無法進行退款 支付寶退款支援單筆交易分多次退款,多次退款需要提交原支付訂單的商戶訂單號和設定不同的退款單號。一筆退款失敗後重新提交,要採用原來的退款單號。總退款金額不能超過使用者實際支付金額 /** * 退款 * https://doc.open.alipay.com/docs/api.htm?spm=a219a.7395905.0.0.SAyEeI&docType=4&apiId=759 * @param content * @return * @throws AlipayApiException */ public static String tradeRefund(AlipayTradeRefundModel model) throws AlipayApiException{ AlipayTradeRefundResponse response = tradeRefundToResponse(model); return response.getBody(); } public static AlipayTradeRefundResponse tradeRefundToResponse(AlipayTradeRefundModel model) throws AlipayApiException{ AlipayTradeRefundRequest request = new AlipayTradeRefundRequest(); request.setBizModel(model); return alipayClient.execute(request); }
3.3.3 alipay.trade.fastpay.refund.query介面封裝 商戶可使用該介面查詢自已通過alipay.trade.refund提交的退款請求是否執行成功。 該介面的返回碼10000,僅代表本次查詢操作成功,不代表退款成功。如果該介面返回了查詢資料,則代表退款成功,如果沒有查詢到則代表未退款成功,可以呼叫退款介面進行重試。重試時請務必保證退款請求號一致。
/** * 退款查詢 * https://doc.open.alipay.com/docs/api.htm?spm=a219a.7629065.0.0.KQeTSa&apiId=1049&docType=4 * @param model * @return * @throws AlipayApiException */ public static String tradeRefundQuery(AlipayTradeFastpayRefundQueryModel model) throws AlipayApiException{ AlipayTradeFastpayRefundQueryResponse response = tradeRefundQueryToResponse(model); return response.getBody(); }
public static AlipayTradeFastpayRefundQueryResponse tradeRefundQueryToResponse(AlipayTradeFastpayRefundQueryModel model) throws AlipayApiException{ AlipayTradeFastpayRefundQueryRequest request = new AlipayTradeFastpayRefundQueryRequest(); request.setBizModel(model); return alipayClient.execute(request); } 3.3.4 alipay.trade.pay介面封裝 收銀員使用掃碼裝置讀取使用者手機支付寶“付款碼”/聲波獲取裝置(如麥克風)讀取使用者手機支付寶的聲波資訊後,將二維碼或條碼資訊/聲波資訊通過本介面上送至支付寶發起支付。
/** * 條形碼支付、聲波支付 * https://doc.open.alipay.com/docs/api.htm?spm=a219a.7629065.0.0.XVqALk&apiId=850&docType=4 * @param notifyUrl * @throws AlipayApiException */ public static String tradePay(AlipayTradePayModel model, String notifyUrl) throws AlipayApiException { AlipayTradePayResponse response = tradePayToResponse(model,notifyUrl); return response.getBody(); }
public static AlipayTradePayResponse tradePayToResponse(AlipayTradePayModel model, String notifyUrl) throws AlipayApiException{ AlipayTradePayRequest request = new AlipayTradePayRequest(); request.setBizModel(model);// 填充業務引數 request.setNotifyUrl(notifyUrl); return alipayClient.execute(request); // 通過alipayClient呼叫API,獲得對應的response類 } 3.3.5 alipay.trade.precreate 介面封裝 收銀員通過收銀臺或商戶後臺呼叫支付寶介面,生成二維碼後,展示給使用者,由使用者掃描二維碼完成訂單支付。
/** * 掃碼支付 * https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.i0UVZn&treeId=193&articleId=105170&docType=1#s4 * @param notifyUrl * @return * @throws AlipayApiException */ public static String tradePrecreatePay(AlipayTradePrecreateModel model, String notifyUrl) throws AlipayApiException{ AlipayTradePrecreateResponse response = tradePrecreatePayToResponse(model,notifyUrl); return response.getBody(); } public static AlipayTradePrecreateResponse tradePrecreatePayToResponse(AlipayTradePrecreateModel model, String notifyUrl) throws AlipayApiException{ AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest(); request.setBizModel(model); request.setNotifyUrl(notifyUrl); return alipayClient.execute(request); } 3.3.6 alipay.trade.cancel 介面封裝 支付交易返回失敗或支付系統超時,呼叫該介面撤銷交易。如果此訂單使用者支付失敗,支付寶系統會將此訂單關閉;如果使用者支付成功,支付寶系統會將此訂單資金退還給使用者。 注意:只有發生支付系統超時或者支付結果未知時可呼叫撤銷,其他正常支付的單如需實現相同功能請呼叫申請退款API。提交支付交易後呼叫【查詢訂單API】,沒有明確的支付結果再呼叫【撤銷訂單API】。
/** * 交易撤銷介面 * https://doc.open.alipay.com/docs/api.htm?spm=a219a.7395905.0.0.XInh6e&docType=4&apiId=866 * @param bizContent * @return * @throws AlipayApiException */ public static boolean isTradeCancel(AlipayTradeCancelModel model) throws AlipayApiException{ AlipayTradeCancelResponse response = tradeCancel(model); if(response.isSuccess()){ return true; } return false; }
public static AlipayTradeCancelResponse tradeCancel(AlipayTradeCancelModel model) throws AlipayApiException{ AlipayTradeCancelRequest request = new AlipayTradeCancelRequest(); request.setBizModel(model); AlipayTradeCancelResponse response = alipayClient.execute(request); return response; } 3.3.7 alipay.trade.create 介面封裝 商戶通過該介面進行交易的建立下單
/** * 統一收單交易建立介面 * https://doc.open.alipay.com/docs/api.htm?spm=a219a.7629065.0.0.21yRUe&apiId=1046&docType=4 * @param model * @param notifyUrl * @return * @throws AlipayApiException */ public static AlipayTradeCreateResponse tradeCreate(AlipayTradeCreateModel model, String notifyUrl) throws AlipayApiException{ AlipayTradeCreateRequest request = new AlipayTradeCreateRequest(); request.setBizModel(model); request.setNotifyUrl(notifyUrl); return alipayClient.execute(request); }
3.3.8 alipay.trade.close 介面封裝 用於交易建立後,使用者在一定時間內未進行支付,可呼叫該介面直接將未付款的交易進行關閉。
/** * 關閉訂單 * https://doc.open.alipay.com/docs/api.htm?spm=a219a.7629065.0.0.21yRUe&apiId=1058&docType=4 * @param model * @return * @throws AlipayApiException */ public static boolean isTradeClose(AlipayTradeCloseModel model) throws AlipayApiException{ AlipayTradeCloseResponse response = tradeClose(model); if(response.isSuccess()){ return true; } return false; }
public static AlipayTradeCloseResponse tradeClose(AlipayTradeCloseModel model) throws AlipayApiException{ AlipayTradeCloseRequest request = new AlipayTradeCloseRequest(); request.setBizModel(model); return alipayClient.execute(request);
} 3.3.9 alipay.trade.order.settle介面封裝 用於線上下場景交易支付後,進行結算
/** * 交易結算介面 * https://doc.open.alipay.com/docs/api.htm?spm=a219a.7395905.0.0.nl0RS3&docType=4&apiId=1147 * @param bizContent * @return * @throws AlipayApiException */ public static boolean isTradeOrderSettle(AlipayTradeOrderSettleModel model) throws AlipayApiException{ AlipayTradeOrderSettleResponse response = tradeOrderSettle(model); if(response.isSuccess()){ return true; } return false; }
public static AlipayTradeOrderSettleResponse tradeOrderSettle(AlipayTradeOrderSettleModel model) throws AlipayApiException{ AlipayTradeOrderSettleRequest request = new AlipayTradeOrderSettleRequest(); request.setBizModel(model); return alipayClient.execute(request); } 3.3.10 alipay.fund.trans.toaccount.transfer介面封裝 可以參考 支付寶支付-提現到個人支付寶
3.3.11 alipay.fund.trans.order.query介面封裝 可以參考 支付寶支付-提現到個人支付寶
3.3.12 alipay.data.dataservice.bill.downloadurl.query 介面封裝 為方便商戶快速查賬,支援商戶通過本介面獲取商戶離線賬單下載地址
/** * 查詢對賬單下載地址 * @param bizContent * @return * @throws AlipayApiException */ public static String billDownloadurlQuery(AlipayDataDataserviceBillDownloadurlQueryModel model) throws AlipayApiException{ AlipayDataDataserviceBillDownloadurlQueryResponse response = billDownloadurlQueryToResponse(model); return response.getBillDownloadUrl(); }
public static AlipayDataDataserviceBillDownloadurlQueryResponse billDownloadurlQueryToResponse (AlipayDataDataserviceBillDownloadurlQueryModel model) throws AlipayApiException{ AlipayDataDataserviceBillDownloadurlQueryRequest request = new AlipayDataDataserviceBillDownloadurlQueryRequest(); request.setBizModel(model); return alipayClient.execute(request); } 4、非同步通知封裝 將非同步通知的引數轉化為Map為驗籤做準備
/** * 將非同步通知的引數轉化為Map * @param request * @return */ public static Map<String, String> toMap(HttpServletRequest request) { System.out.println(">>>>" + request.getQueryString()); Map<String, String> params = new HashMap<String, String>(); Map<String, String[]> requestParams = request.getParameterMap(); for (Iterator<String> 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); } return params; } 使用AlipaySignature.rsaCheckV1(....)介面進行驗證簽名
public void notify_url() { try { // 獲取支付寶POST過來反饋資訊 Map<String, String> params = AliPayApi.toMap(getRequest());
for (Map.Entry<String, String> entry : params.entrySet()) { System.out.println(entry.getKey() + " = " + entry.getValue()); }
boolean verify_result = AlipaySignature.rsaCheckV1(params, AliPayApi.ALIPAY_PUBLIC_KEY, AliPayApi.CHARSET, AliPayApi.SIGN_TYPE);
if (verify_result) {// 驗證成功 // TODO 請在這裡加上商戶的業務邏輯程式程式碼 非同步通知可能出現訂單重複通知 需要做去重處理 System.out.println("notify_url 驗證成功succcess"); renderText("success"); return; } else { System.out.println("notify_url 驗證失敗"); // TODO renderText("failure"); return; } } catch (AlipayApiException e) { e.printStackTrace(); renderText("failure"); } } 此專案已開源歡迎Start、PR、發起Issues一起討論交流共同進步
https://github.com/Javen205/IJPay http://git.oschina.net/javen205/IJPay