本文是【淺析微信支付】系列文章的第七篇,主要講解微信商戶平臺的訂單查詢和關閉接口的使用。
淺析微信支付系列已經更新六篇了喲~,沒有看過的朋友們能夠看一下哦。php
淺析微信支付:統一下單接口github
聲明:這裏的查詢訂單
、關閉訂單
接口僅適用於 小程序支付、公共號支付、掃碼支付、APP支付
,刷卡支付
方式此處並不適用。api
如下爲微信官方的查詢訂單
文檔:服務器
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_2
該接口提供全部微信支付訂單的查詢,商戶能夠經過查詢訂單接口主動查詢訂單狀態,完成下一步的業務邏輯。微信
須要調用查詢接口的狀況: ◆ 當商戶後臺、網絡、服務器等出現異常,商戶系統最終未接收到支付通知; ◆ 調用支付接口後,返回系統錯誤或未知交易狀態狀況; ◆ 調用刷卡支付API,返回USERPAYING的狀態; ◆ 調用關單或撤銷接口API以前,需確認支付狀態;
https://api.mch.weixin.qq.com/pay/orderquery
不須要網絡
查詢訂單接口須要使用微信訂單號
或者商戶訂單號
來查詢,其餘參數爲商戶平臺信息的公共參數,爲常量,此處省略解釋。app
微信訂單號: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; }
以上爲查詢微信訂單的使用方式,具體的返回參數請參考官方文檔。
如下爲微信官方的關閉訂單
文檔:
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_3
如下狀況須要調用關單接口:
商戶訂單支付失敗須要生成新單號從新發起支付,要對原訂單號調用關單,避免重複支付; 系統下單後,用戶支付超時,系統退出再也不受理,避免用戶繼續,請調用關單接口。
注意:訂單生成後不能立刻調用關單接口,最短調用時間間隔爲5分鐘。
https://api.mch.weixin.qq.com/pay/closeorder
不須要
關閉訂單接口須要使用商戶訂單號
來查詢,其餘參數爲商戶平臺信息的公共參數,爲常量,此處省略解釋。
商戶訂單號: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
,標明 微信支付
可拉入微信支付討論羣與小夥伴一塊兒探討哦,必定要標明 微信支付
哦~
到此本文就結束了,關注公衆號查看更多推送!!!