收藏
回答

支付后收到多次结果通知,发送一次小程序模板消息,很多时候会收到两条

问题模块
API和组件

我的支付结果通知的逻辑是,收到通知后,检查订单状态是否已支付:

1,若是,则发送

<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>

给结果通知,再return返回。

2,若未支付,则更新订单状态为已支付,然后发送模板消息给微信用户,最后发送

<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>

给结果通知。


从日志可以看到一个支付订单能收到5条以上的结果通知,而我只在收到第一条时给用户发模板消息,可用户大多数时候收到的是两条消息。

最后一次编辑于  2017-11-15  (未经腾讯允许,不得转载)
邀请回答
复制链接收藏投诉关注问题回答

6 个回答

  • 吴森
    吴森
    2017-11-15

    自己加个字段状态判断吧


    https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_7

    支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。

    对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。 (通知频率为15/15/30/180/1800/1800/1800/1800/3600,单位:秒)

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

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

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


    2017-11-15
    赞同
    回复
  • Yuzifu
    Yuzifu
    2017-11-15

    有两点:

    1,我在这边无从判断微信后台是否接收到我发出的<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>

    2,发一次模板消息怎么会收到两条消息?



    2017-11-15
    赞同
    回复
  • 吴森
    吴森
    2017-11-15
    收到通知,校验签名
    if(签名正确){
      if(未通知过){
        更新为已通知
      }
      echo <xml>..success........
    }else{
      exit;
    }

    就是因为判断不了微信是否成功收到返回结果,所以自己加个字段标识是否已通知

    你平常使用微信支付后,都会收到微信发的通知,所以支付功能不需要调用模板消息!!

    2017-11-15
    赞同
    回复
  • 吴森
    吴森
    2017-11-15

    除非你的模板消息需要带上其他信息

    2017-11-15
    赞同
    回复
  • 郑俊伟
    郑俊伟
    2017-11-15

    能否提供一个收到两条消息的具体case, 包括调用的时间点,请求的fromid以及openid

    2017-11-15
    赞同
    回复
  • Yuzifu
    Yuzifu
    2017-11-15

    嗯,谢谢,我已经给订单增加状态字段了,并凭此判断是否继续进行下一步动作,所以我才确认只会发一次模板消息。

    2017-11-15
    赞同
    回复