我的支付结果通知的逻辑是,收到通知后,检查订单状态是否已支付:
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条以上的结果通知,而我只在收到第一条时给用户发模板消息,可用户大多数时候收到的是两条消息。
有两点:
1,我在这边无从判断微信后台是否接收到我发出的<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>
2,发一次模板消息怎么会收到两条消息?
收到通知,校验签名 if (签名正确){ if (未通知过){ 更新为已通知 } echo <xml>..success........ } else { exit ; } |
就是因为判断不了微信是否成功收到返回结果,所以自己加个字段标识是否已通知
你平常使用微信支付后,都会收到微信发的通知,所以支付功能不需要调用模板消息!!
自己加个字段状态判断吧
https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_7
支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。
对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。 (通知频率为15/15/30/180/1800/1800/1800/1800/3600,单位:秒)
__注意:同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。 __
推荐的做法是,当收到通知进行处理时,首先检查对应业务数据的状态,判断该通知是否已经处理过,如果没有处理过再进行处理,如果处理过直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱。
特别提醒:商户系统对于支付结果通知的内容一定要做签名验证,并校验返回的订单金额是否与商户侧的订单金额一致,防止数据泄漏导致出现“假通知”,造成资金损失。