支付回调不通?按这个顺序排查
「钱扣了,订单没变」——这个问题必须快速解决,因为每拖一分钟都在产生客服工单。
先确认问题在哪一段
支付流程分三段,先定位是哪段断了:
客户支付 → [1] 支付平台收到钱 → [2] 平台回调你的站点 → [3] 站点处理订单
去支付平台后台看这笔交易是否存在:
- 不存在 → 问题在 [1],钱可能根本没付成功
- 存在,但回调记录显示失败 → 问题在 [2],往下看
- 回调成功但订单没变 → 问题在 [3],看站点日志
绝大多数情况是 [2]。
按概率排查 [2]
一、回调地址填错
去支付渠道后台核对回调地址。最常见的错误:
- 站点已经切了 HTTPS,回调地址还是
http:// - 换过域名,回调地址还是旧的
- 地址末尾多了或少了斜杠
二、CDN 拦截
:::danger 这是套了 CDN 之后最常见的原因 CDN 会把回调请求当成异常流量拦掉,或者缓存了响应。
解法:给回调单独开一个不走 CDN 的子域名。 :::
三、防火墙 / WAF 拦截
支付平台的回调 IP 可能被你的安全策略拦了。查 Nginx 访问日志,看有没有这个请求:
tail -n 200 /www/wwwlogs/yourdomain.com.log | grep -i notify
- 日志里没有这条请求 → 请求根本没到 Nginx,是网络层拦的(安全组、云 WAF)
- 有请求但状态码是 403 → 是站点的 WAF 规则拦的
- 状态码 200 → 请求到了,问题在 [3]
四、伪静态没配
回调地址通常是 /pay/notify/xxx 这种,没有伪静态会 404。检查站点伪静态配置是否存在。
五、SSL 证书链不完整
支付平台校验证书比浏览器严格。浏览器显示正常不代表没问题,用命令验证:
curl -vI https://yourdomain.com/ 2>&1 | grep -i "SSL certificate"
或者用 SSL Labs 在线检测,看有没有 Chain issues。
排查表
| 现象 | 最可能的原因 |
|---|---|
| 所有渠道都不回调 | CDN 或防火墙 |
| 只有某一个渠道不回调 | 该渠道回调地址填错 |
| 切 HTTPS 之后开始的 | 回调地址还是 http,或证书链不全 |
| 时好时坏 | 挂机版掉线,见挂机版配置 |
| 换域名之后开始的 | 回调地址是旧域名 |
临时止血
排查期间,用后台「补单」功能先把已付款的订单手动完成,别让客户等。
评论 0