前提
項目開發中實現微信提現的功能。使用到了兩個接口
企業付款接口:https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers【https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2】
查詢企業付款接口:https://api.mch.weixin.qq.com/mmpaymkttransfers/gettransferinfo 【https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_3】

為什么有不能馬上知道付款結果的情況--遇到err_code=SYSTEMERROR?
根據支付文檔https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2,可知,主要看3個字段
return_code :通信標識,非交易標識,此字段是通信標識,非交易標識,交易是否成功需要查看result_code來判斷
result_code: 交易標識
err_code :錯誤編碼
只有在return_code 和 result_code 同時為SUCCESS時 才可判斷 交易成功
那么return_code ==SUCCESS result_code =FAIL的時候呢?根據文檔可知result_code 才是交易標識,這時應該判定位交易失敗才對,
然而,在實際應用中發現,真相並不是這樣的。
在一次付款日志中出現,return_code ==SUCCESS result_code =FAIL 有err_code時 【err_code=SYSTEMERROR:系統繁忙,請稍后再試】
我們判定了為交易失敗,但是微信方面卻在幾天后,成功支付了這筆錢,這就就導致了損失。
所以,付款API 除了有即時成功 即時失敗的情況外 還有一些意外的情況 :不能馬上判斷是成功了還是失敗了
對於那些不能馬上知道結果的交易訂單應該怎么處理?
對於那些不能即時成功的交易記錄,我們使用第二個微信接口:查詢企業付款接口:https://api.mch.weixin.qq.com/mmpaymkttransfers/gettransferinfo
定期去查詢這些記錄的微信處理結果,如果返回即時成功/失敗時 才在我們這邊處理金額數據。這樣就盡量避免了出現上面會造成損失的情況。
查詢企業付款接口遇到的err_code=NOT_FOUND問題
但是這個查詢企業付款接口 ,在實際應用中,我們又遇到了一個新的問題:
- 付款接口返回即時成功時,下一秒馬上使用查詢接口去查詢該訂單號的交易結果時,返回的卻是err_code=NOT_FOUND而不是成功。再隔一個時間去查詢時 就返回交易結果為成功了。
這種情況,因為付款成功到調用查詢接口的時間間隔太短 (只有1秒)導致的,這1秒期間微信那邊的訂單可能還沒有入庫,導致查詢結果為訂單號不存在,再隔一段時間去查就為成功了。
這是因為付款成功后,剛好就到了定時任務啟動的時間段,馬上就去執行查詢訂單結果的腳本的結果,這是使用定時任務無法避免的會出現的情況。
所以,有err_code=NOT_FOUND並不代表 真的交易失敗,err_code為NOT_FOUND時可能只是數據沒有入庫的原因。
總結上文工作中遇到的情況,可以歸納如下結果
- 付款接口
- return_code=result_code=SUCCESS -->可以 判定為即時交易成功
- return_code=FAIL -->可以判定為即時交易失敗
- err_code=SYSTEMERROR -->不可判定交易結果,需要定時去調用查詢付款接口取確定,直到明確結果
- 其他 明確失敗的err_code則 可以判定為即時失敗(err_code=NOAUTH/AMOUNT_LIMIT等)
- 其他不可判定交易結果,需要定時去調用查詢付款接口取再去確定,直到明確結果
- 查詢付款接口
- return_code=result_code=SUCCESS時:
status=SUCCESS 交易成功
status = FAILED 交易失敗
status=PROCESSING 交易處理中
2.return_code=SUCCESS,result_code=FAIL時:
err_code=NOT_FOUND 不可判定交易結果,需要定時去調用查詢付款接口取再去確定,直到明確結果
其他 明確失敗的err_code 則可以判定為即時失敗(err_code=NOAUTH/AMOUNT_LIMIT等)
3.其他不可判定交易結果,需要定時去調用查詢付款接口取再去確定,直到明確結果
