← 返回喵窝资源铺 | 密封资源清单

易支付回调验签总失败?notify 日志排查的 5 个真实坑

本文来自一个真实在跑的收款站的排查记录,不是教程搬运。每一条都实际踩过、修过、复验过。

症状:客户付款成功,收银台显示已支付,但你的 orders.log 里要么没有记录,要么全部 验签=失败。按下面顺序查,基本能定位。

坑一:notify_url 指向的域名已经漂移

这是最贵的一坑。如果你用临时隧道域名(trycloudflare.com 之类),每次重启隧道域名都会变。落地页 JS 里的 notify_url 还是旧域名的话——客户付款 100% 成功,回调 100% 到不了你手里,货发不出、钱查不到、日志一片空白。

修法:把站点 URL 存在一个地方(如 system.json 的 infra.site_url),所有脚本从它读;换域名时一步同步 notify_url 和 return_url。

坑二:签名排序没排除空值和 sign/sign_type

易支付规则:按 key 排序后拼接,但空值参数和 sign、sign_type 两个键本身要剔除。常见错误是服务端验签时把 sign_type=MD5 也拼进去了——客户端签名时不带它,两边永远对不上。

# 正确
parts = sorted((k,v) for k,v in params.items() if v and k not in ('sign','sign_type'))
s = '&'.join(f'{k}={v}' for k,v in parts) + KEY
assert md5(s) == params['sign']

坑三:从日志里正则抓"第一个数字"当金额

订单号本身就是一长串数字。如果你的统计脚本 re.search(r'\d+', line),订单号会被当成金额,收入瞬间虚增几个数量级。必须解析显式字段(金额= / money=),并跳过验签失败的行。

坑四:notify_url 不是 HTTPS 或不可公网访问

网关要求回调地址 HTTPS 且公网可达。本机 localhost、内网 IP、被防火墙挡住的裸 IP 都不行——后者典型报错是收银台 1005。所有入站端口被封的机器,出路是出站隧道(named tunnel 固定域名优先)。

坑五:没回复 success,网关无限重发

易支付在收到非 success 响应(或超时)时会持续重试 notify。你的日志会塞满重复订单,统计脚本如果不按订单号去重,收入会翻好几倍。正确姿势:验签通过后立即返回纯文本 success,统计按唯一订单号。

一页排查清单(照抄即用)

  1. 手动 POST 一笔正确签名的测试单到 submit.php,确认 PID/KEY/签名规则本身没问题
  2. 看 orders.log:完全没有 notify → 回调地址不通(坑一/坑四);有记录但验签失败 → 签名规则(坑二)
  3. 统计收入只认:显式金额字段 + 验签通过 + 按订单号去重(坑三/坑五)
  4. 改过域名/隧道后,全站 grep 旧域名,一步替换干净
  5. 每次改完用真实浏览器走一遍完整下单流程,别只信静态检查

如果你也在自建收款站,可以看看我们的 自建易支付完整流程;需要代写脚本、排查配置,店里五档服务最低 ¥9.9 起,验证通过秒发。

虚拟物品交付后不退款;未收到或未达承诺免费补发/重做。