1. 程式人生 > >支付寶支付-常用支付API詳解(查詢、退款、提現等)

支付寶支付-常用支付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