收藏
回答

微信支付回调同一时间进入两次,请帮忙看下

具体情况是:最近两天各有一笔同一时间回调两次的情况,同一时间是指同一秒:如都是 2020-09-24 21:13:53 这个时间,而且都是2次。24号和25号两天都发生在21点;

问题是:由于回调是同一时间进来两次,业务上无法判断业务订单是否更改,造成回调逻辑执行了两次。

因为是连着两天发生的,觉得不是偶然性,其他大部分订单回调正常,所以请帮忙及时解答下,感谢

最后一次编辑于  2020-09-26
回答关注问题邀请回答
收藏

3 个回答

  • 北望沣渭
    北望沣渭
    2020-09-26

    支付成功回调可能有很多次(不止两次),我给你搬砖: https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7&index=8

    应用场景

    支付完成后,微信会把相关支付结果及用户信息通过数据流的形式发送给商户,商户需要接收处理,并按文档规范返回应答。

    注意:

    1、同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。

    2、后台通知交互时,如果微信收到商户的应答不符合规范或超时,微信会判定本次通知失败,重新发送通知,直到成功为止(在通知一直不成功的情况下,微信总共会发起多次通知,通知频率为15s/15s/30s/3m/10m/20m/30m/30m/30m/60m/3h/3h/3h/6h/6h - 总计 24h4m),但微信不保证通知最终一定能成功。

    3、在订单状态不明或者没有收到微信支付结果通知的情况下,建议商户主动调用微信支付【查询订单API】确认订单状态。

    特别提醒:

    1、商户系统对于支付结果通知的内容一定要做签名验证,并校验返回的订单金额是否与商户侧的订单金额一致,防止数据泄漏导致出现“假通知”,造成资金损失。

    2、当收到通知进行处理时,首先检查对应业务数据的状态,判断该通知是否已经处理过,如果没有处理过再进行处理,如果处理过直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱。

    3、技术人员可登进微信商户后台扫描加入接口报警群,获取接口告警信息。


    2020-09-26
    有用 2
    回复 6
    • 海斌
      海斌
      2020-09-26
      感谢,但是这个文档对我描述的问题没有用。问题的关键不在于多次,是 同一 时间进入两次;并不是间隔微信通知频率时间后再回调。
      2020-09-26
      回复
    • 北望沣渭
      北望沣渭
      发表于移动端
      2020-09-26回复海斌
      按文档提示,加数据锁做并发控制,只有获取到锁的那个线程可能处理回调业务,这个锁你可能需要分布式锁的形式,多点部署时,在不同应用实例间需要共享锁
      2020-09-26
      回复
    • 海斌
      海斌
      2020-09-27回复北望沣渭
      好的,感谢,我理解一下。
      2020-09-27
      回复
    • 海斌
      海斌
      2020-09-28
      使用了redis inc解决,再次感谢
      2020-09-28
      1
      回复
    • 旷日积晷
      旷日积晷
      2023-01-12回复海斌
      您最后是怎样解决同时回调两次的?
      2023-01-12
      回复
    查看更多(1)
  • 王者荣耀
    王者荣耀
    10-14

    为什么用了数据锁,两个毫秒级别时差的回调都获取到了锁?

    10-14
    有用
    回复
  • 微信支付技术助手8
    微信支付技术助手8
    2020-09-27

    您好,首先感谢楼上回复,说的很nice,微信支付为保证回调通知触达有效性,会有保障策略,在第一次通知如果网络链路返回无法连接或者状态不明,微信支付会换一条链路进行通知。此时可能会造成您这边收到两次通知。微信文档已强调同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。辛苦正确对自己数据进行状态唯一性处理。

    2020-09-27
    有用
    回复 1
    • 海斌
      海斌
      2020-09-27
      好的,感谢
      2020-09-27
      回复
登录 后发表内容
问题标签