回调一直失败,先盯住 notify_url 配置这几件事
微信支付异步通知收不到、或一直提示回调失败,最常见就是 notify_url 写错。2026年不少商户踩过这种坑:域名少了一个字母、路径漏了一级目录、环境配成测试域名但线上在收钱。
- 必须是公网可访问的 HTTPS,别用内网域名、别用 IP+自签证书。
- URL 不要带任何参数,比如 ?a=1 这种,很多接入会直接收不到通知或被判异常。
- 检查商户平台/接口参数里配置的地址,尤其是 大小写、斜杠:/pay/notify 和 /pay/notify/ 在部分框架里不是同一个路由。
小案例:有人把 /api/wxpay/notify 写成 /api/wxpay/notity,支付成功但后台永远等不到通知。
公网连通性与服务器拦截,是第二大元凶
微信服务器能不能打到你的接口,靠猜不行,直接测。
- 用手机 4G/5G 或外网机器执行:curl -I https://你的域名/notify,确认能返回 200/405 都行,别是 301 跳转到 http 或跳到登录页。
- 只开放 443 不够:还要确认云防火墙/WAF/网关没把微信的 POST 当成攻击拦了。去安全产品里查拦截日志,很多时候一眼就能看到。
- HTTPS 证书要完整链,别缺中间证书;TLS 版本太老也容易握手失败。
顺手把告警也开起来:有商户在 2026年通过“运维中心/接口报警”把消息丢到群里,回调失败能立刻定位到是网关拦截还是应用报错。
验签失败怎么排:V3 重点看“证书+请求头+原文”
能收到回调但验签失败,常见不是密钥错,就是你验的“原文”不对。
- 确认拿到的是微信回调的这些头:Wechatpay-Timestamp / Wechatpay-Nonce / Wechatpay-Signature / Wechatpay-Serial,少一个都会失败。
- 平台证书序列号要能匹配 Wechatpay-Serial;平台证书更新后没同步,也会突然全量失败。
- 验签拼接串要按规范:timestamp + "\n" + nonce + "\n" + body + "\n",body 必须是收到的原始字符串,别先 JSON 格式化。
- 解密 resource 用 APIv3 Key,不是 API 密钥;解密失败别急着怪签名。
- 回调处理完要返回 HTTP 200,并按V3要求回 {"code":"SUCCESS","message":"成功"},不然微信会继续重试。
给你一份能马上执行的排查清单
- 把 notify_url 复制出来逐字检查:HTTPS、公网、无参数、路径正确。
- 外网 curl 你的回调地址,确认不跳转、不拦截、响应稳定。
- 应用侧打三条日志:收到的请求头、原始 body、验签结果/异常堆栈。
- 同步一次微信平台证书,核对 Wechatpay-Serial 是否命中。
- 把回调接口做成“幂等”:同一订单通知来多次也只入账一次,避免你不敢回 200。