1. 程式人生 > >淺析微信支付:查詢訂單和關閉訂單

淺析微信支付:查詢訂單和關閉訂單

本文是【淺析微信支付】系列文章的第七篇,主要講解微信商戶平臺的訂單查詢和關閉介面的使用。

淺析微信支付系列已經更新六篇了喲~,沒有看過的朋友們可以看一下哦。

宣告:這裡的查詢訂單關閉訂單介面僅適用於 小程式支付、公共號支付、掃碼支付、APP支付刷卡支付方式此處並不適用。

1、查詢訂單

以下為微信官方的查詢訂單文件:

https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_2

1.1. 應用場景

該介面提供所有微信支付訂單的查詢,商戶可以通過查詢訂單介面主動查詢訂單狀態,完成下一步的業務邏輯。

需要呼叫查詢介面的情況:
◆ 當商戶後臺、網路、伺服器等出現異常,商戶系統最終未接收到支付通知;
◆ 呼叫支付介面後,返回系統錯誤或未知交易狀態情況;
◆ 呼叫刷卡支付API,返回USERPAYING的狀態;
◆ 呼叫關單或撤銷介面API之前,需確認支付狀態;

1.2. 介面連結

https://api.mch.weixin.qq.com/pay/orderquery

1.3. 是否需要證書

不需要

1.4. 呼叫介面

查詢訂單介面需要使用微信訂單號或者商戶訂單號來查詢,其他引數為商戶平臺資訊的公共引數,為常量,此處省略解釋。

微信訂單號:transaction_id(微信的訂單號,建議優先使用)
商戶訂單號:out_trade_no(商戶系統內部訂單號)

此兩個引數必填其中之一,微信推薦使用微信訂單號來查詢,下面為實現程式碼:

private void doOrderQuery() {
    System.out.println("查詢訂單");
    HashMap<String, String> data = new HashMap<String, String>();
    // data.put("out_trade_no", out_trade_no);
    data.put("transaction_id", "4008852001201608221962061594");
    try {
        WXPay wxPay = new WXPay(WXPayConfigImpl.getInstance());
        Map<String, String> r = wxPay.orderQuery(data);
        System.out.println(r);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

wxPay.orderQuery方法為封裝的sdk方法,具體實現請參考作者github原始碼。

對於商戶關鍵資訊的寫入,公共方法為wxPay.fillRequestData,實現如下:

/**
 * 向 Map 中新增 appid、mch_id、nonce_str、sign_type、sign <br>
 * 該函式適用於商戶適用於統一下單等介面,不適用於紅包、代金券介面
 *
 * @param reqData r
 * @return map
 * @throws Exception e
 */
public Map<String, String> fillRequestData(Map<String, String> reqData) throws Exception {
    reqData.put("appid", config.getAppID());
    reqData.put("mch_id", config.getMchID());
    reqData.put("nonce_str", WXPayUtil.generateNonceStr());
    if (SignType.MD5.equals(this.signType)) {
        reqData.put("sign_type", WXPayConstants.MD5);
    } else if (SignType.HMACSHA256.equals(this.signType)) {
        reqData.put("sign_type", WXPayConstants.HMACSHA256);
    }
    reqData.put("sign", WXPayUtil.generateSignature(reqData, config.getKey(), this.signType));
    return reqData;
}

以上為查詢微信訂單的使用方式,具體的返回引數請參考官方文件。

2、關閉訂單

以下為微信官方的關閉訂單文件:

https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_3

2.1. 應用場景

以下情況需要呼叫關單介面:

商戶訂單支付失敗需要生成新單號重新發起支付,要對原訂單號呼叫關單,避免重複支付;
系統下單後,使用者支付超時,系統退出不再受理,避免使用者繼續,請呼叫關單介面。

注意:訂單生成後不能馬上呼叫關單介面,最短呼叫時間間隔為5分鐘。

2.2. 介面連結

https://api.mch.weixin.qq.com/pay/closeorder

2.3. 是否需要證書

不需要

2.4. 呼叫介面

關閉訂單介面需要使用商戶訂單號來查詢,其他引數為商戶平臺資訊的公共引數,為常量,此處省略解釋。

商戶訂單號:out_trade_no(商戶系統內部訂單號)

PS:關單介面只能使用微信訂單號來查詢,和查詢介面不同,下面為實現程式碼:

private void doOrderClose() {
    System.out.println("關閉訂單");
    HashMap<String, String> data = new HashMap<String, String>();
    data.put("out_trade_no", out_trade_no);
    try {
        WXPay wxPay = new WXPay(WXPayConfigImpl.getInstance());
        Map<String, String> r = wxPay.closeOrder(data);
        System.out.println(r);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

關單介面的公共引數設定和查詢訂單一致,這裡就不重複解釋了,具體的返回引數請參考微信官方文件。

PS:關單介面可能會呼叫失敗,已支付、已關閉等場景,所以需要開發者注意官方文件中的錯誤碼,對異常情況進行處理。

結語

以上為查詢訂單關閉訂單的呼叫方式,如果是刷卡支付方式,他的關閉訂單介面為撤銷訂單:reverse,在作者sdk原始碼中也有具體的實現方式。

預告:下一篇文章 申請退款和退款回撥介面,敬請期待!!!

​如果想要提前一覽原始碼的小夥伴,可以先看看我的 github,地址如下:

​https://github.com/YClimb/wxpay-sdk/blob/master/README.md

加作者私人微信,作者微訊號如下 yclimb,標明 微信支付 可拉入微信支付討論群與小夥伴一起探討哦,一定要標明 微信支付 哦~

到此本文就結束了,關注公眾號檢視更多推送!!!

關注我的公眾號