微信企業支付--遇到不明確結果的err_code:SYSTEMERROR,NOT_FOUND


前提

項目開發中實現微信提現的功能。使用到了兩個接口

企業付款接口: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時可能只是數據沒有入庫的原因。

 

總結上文工作中遇到的情況,可以歸納如下結果

  • 付款接口
  1. return_code=result_code=SUCCESS   -->可以 判定為即時交易成功
  2. return_code=FAIL           -->可以判定為即時交易失敗 
  3. err_code=SYSTEMERROR       -->不可判定交易結果,需要定時去調用查詢付款接口取確定,直到明確結果
  4. 其他 明確失敗的err_code則 可以判定為即時失敗(err_code=NOAUTH/AMOUNT_LIMIT等)
  5. 其他不可判定交易結果,需要定時去調用查詢付款接口取再去確定,直到明確結果

 

  • 查詢付款接口
  1. 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.其他不可判定交易結果,需要定時去調用查詢付款接口取再去確定,直到明確結果

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM