zoukankan      html  css  js  c++  java
  • 微信企业支付--遇到不明确结果的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.其他不可判定交易结果,需要定时去调用查询付款接口取再去确定,直到明确结果

     

  • 相关阅读:
    PEP20: The Zen of Python
    画三角形
    前端优化总结
    Doctype的作用以及严格模式和混杂模式的区别
    JS循环添加事件
    数据库整理用到的
    ASP.NET中url路径中?和= 被转码成%3f 和 %3d带来的问题。
    ReSharper Abbreviations List, 怎么管理缩写列表
    怎样使用 ASP.NET Optimization Bundling压缩样式表和脚本
    jQuery 选择同时包含两个class的元素
  • 原文地址:https://www.cnblogs.com/lihuobao/p/5641790.html
Copyright © 2011-2022 走看看