微信支付重复回调重复通知 常见问题与解决办法

昨天 @ch_jellck 问我个问题,他对接微信支付的时候怎么都过不了微信回调通知,我看了下折腾了半天才解决。

微信支付成功后会向回调 notify_url 发送通知信息,开发者根据业务逻辑做出正确的响应即可。但是好多人对接微信支付的时候都遇到过重复通知的问题,要么是 xml 内容,要么是响应头,或者响应码有问题,在此汇总解决一下。

正确答案

先说正确答案,微信支付回调本质是一个 HTTP 请求,按照 HTTP 请求的方式响应过去就对了。

  1. 返回正确的 xml 字符串,不能有 空格 换行,必须在一行
<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>
  1. 响应头中 content-type 必须为 text/xml,别搞什么 application/xml 或者不设,这个很重要

  2. 必须在 5 秒内成功响应,否则请求超时,把耗时操作放到异步去做

  3. 必须返回 SUCCESS

乱棍打死老师傅,以上我也不知道哪一条是对的,但是改了之后他说过了。

为什么会重复通知

微信支付回调会向预设的 URL 发起一个请求,服务器需要响应 成功 或 失败 信息。

  • 超时:不用说,传输上的请求失败
  • 响应体无法解析:微信支付回调解析不了你的响应信息,自然失败了,响应要使用 application/xml 类型才能解析
  • 没有返回 SUCCESS:只有 SUCCESS 了才算成功,没有返回必须重复给你请求、发通知

不处理的后果

没啥后果,微信支付管理后台也没见过,不知道处理跟不处理的区别。

实在处理不了就判断下订单状态,已经处理过了不理会支付回调通知即可。