小程序模板網(wǎng)

淺析微信支付:查詢訂單和關(guān)閉訂單

發(fā)布時(shí)間:2018-11-12 08:43 所屬欄目:小程序開(kāi)發(fā)教程

淺析微信支付系列已經(jīng)更新六篇了喲~,沒(méi)有看過(guò)的朋友們可以看一下哦。

淺析微信支付:支付結(jié)果通知

淺析微信支付:統(tǒng)一下單接口

淺析微信支付:微信公眾號(hào)網(wǎng)頁(yè)授權(quán)

聲明:這里的查詢訂單、關(guān)閉訂單接口僅適用于 小程序支付、公共號(hào)支付、掃碼支付、APP支付,刷卡支付方式此處并不適用。

1、查詢訂單

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

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

1.1. 應(yīng)用場(chǎng)景

該接口提供所有微信支付訂單的查詢,商戶可以通過(guò)查詢訂單接口主動(dòng)查詢訂單狀態(tài),完成下一步的業(yè)務(wù)邏輯。

需要調(diào)用查詢接口的情況:
◆ 當(dāng)商戶后臺(tái)、網(wǎng)絡(luò)、服務(wù)器等出現(xiàn)異常,商戶系統(tǒng)最終未接收到支付通知;
◆ 調(diào)用支付接口后,返回系統(tǒng)錯(cuò)誤或未知交易狀態(tài)情況;
◆ 調(diào)用刷卡支付API,返回USERPAYING的狀態(tài);
◆ 調(diào)用關(guān)單或撤銷接口API之前,需確認(rèn)支付狀態(tài);

1.2. 接口鏈接

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

1.3. 是否需要證書

不需要

1.4. 調(diào)用接口

查詢訂單接口需要使用微信訂單號(hào)或者商戶訂單號(hào)來(lái)查詢,其他參數(shù)為商戶平臺(tái)信息的公共參數(shù),為常量,此處省略解釋。

微信訂單號(hào):transaction_id(微信的訂單號(hào),建議優(yōu)先使用)
商戶訂單號(hào):out_trade_no(商戶系統(tǒng)內(nèi)部訂單號(hào))

此兩個(gè)參數(shù)必填其中之一,微信推薦使用微信訂單號(hào)來(lái)查詢,下面為實(shí)現(xiàn)代碼:

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方法,具體實(shí)現(xiàn)請(qǐng)參考作者github源碼。

對(duì)于商戶關(guān)鍵信息的寫入,公共方法為wxPay.fillRequestData,實(shí)現(xiàn)如下:

/**
 * 向 Map 中添加 appid、mch_id、nonce_str、sign_type、sign <br>
 * 該函數(shù)適用于商戶適用于統(tǒng)一下單等接口,不適用于紅包、代金券接口
 *
 * @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;
}

以上為查詢微信訂單的使用方式,具體的返回參數(shù)請(qǐng)參考官方文檔。

2、關(guān)閉訂單

以下為微信官方的關(guān)閉訂單文檔:

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

2.1. 應(yīng)用場(chǎng)景

以下情況需要調(diào)用關(guān)單接口:

商戶訂單支付失敗需要生成新單號(hào)重新發(fā)起支付,要對(duì)原訂單號(hào)調(diào)用關(guān)單,避免重復(fù)支付;
系統(tǒng)下單后,用戶支付超時(shí),系統(tǒng)退出不再受理,避免用戶繼續(xù),請(qǐng)調(diào)用關(guān)單接口。

注意:訂單生成后不能馬上調(diào)用關(guān)單接口,最短調(diào)用時(shí)間間隔為5分鐘。

2.2. 接口鏈接

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

2.3. 是否需要證書

不需要

2.4. 調(diào)用接口

關(guān)閉訂單接口需要使用商戶訂單號(hào)來(lái)查詢,其他參數(shù)為商戶平臺(tái)信息的公共參數(shù),為常量,此處省略解釋。

商戶訂單號(hào):out_trade_no(商戶系統(tǒng)內(nèi)部訂單號(hào))

PS:關(guān)單接口只能使用微信訂單號(hào)來(lái)查詢,和查詢接口不同,下面為實(shí)現(xiàn)代碼:

private void doOrderClose() {
    System.out.println("關(guān)閉訂單");
    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();
    }
}

關(guān)單接口的公共參數(shù)設(shè)置和查詢訂單一致,這里就不重復(fù)解釋了,具體的返回參數(shù)請(qǐng)參考微信官方文檔。

PS:關(guān)單接口可能會(huì)調(diào)用失敗,已支付、已關(guān)閉等場(chǎng)景,所以需要開(kāi)發(fā)者注意官方文檔中的錯(cuò)誤碼,對(duì)異常情況進(jìn)行處理。

結(jié)語(yǔ)

以上為查詢訂單、關(guān)閉訂單的調(diào)用方式,如果是刷卡支付方式,他的關(guān)閉訂單接口為撤銷訂單:reverse,在作者sdk源碼中也有具體的實(shí)現(xiàn)方式。



易優(yōu)小程序(企業(yè)版)+靈活api+前后代碼開(kāi)源 碼云倉(cāng)庫(kù):starfork
本文地址:http://www.u-renovate.com/wxmini/doc/course/24941.html 復(fù)制鏈接 如需定制請(qǐng)聯(lián)系易優(yōu)客服咨詢:800182392 點(diǎn)擊咨詢
QQ在線咨詢
AI智能客服 ×