本文来自一个真实在跑的收款站的排查记录,不是教程搬运。每一条都实际踩过、修过、复验过。
症状:客户付款成功,收银台显示已支付,但你的 orders.log 里要么没有记录,要么全部 验签=失败。按下面顺序查,基本能定位。
这是最贵的一坑。如果你用临时隧道域名(trycloudflare.com 之类),每次重启隧道域名都会变。落地页 JS 里的 notify_url 还是旧域名的话——客户付款 100% 成功,回调 100% 到不了你手里,货发不出、钱查不到、日志一片空白。
修法:把站点 URL 存在一个地方(如 system.json 的 infra.site_url),所有脚本从它读;换域名时一步同步 notify_url 和 return_url。
易支付规则:按 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=),并跳过验签失败的行。
网关要求回调地址 HTTPS 且公网可达。本机 localhost、内网 IP、被防火墙挡住的裸 IP 都不行——后者典型报错是收银台 1005。所有入站端口被封的机器,出路是出站隧道(named tunnel 固定域名优先)。
易支付在收到非 success 响应(或超时)时会持续重试 notify。你的日志会塞满重复订单,统计脚本如果不按订单号去重,收入会翻好几倍。正确姿势:验签通过后立即返回纯文本 success,统计按唯一订单号。
如果你也在自建收款站,可以看看我们的 自建易支付完整流程;需要代写脚本、排查配置,店里五档服务最低 ¥9.9 起,验证通过秒发。
虚拟物品交付后不退款;未收到或未达承诺免费补发/重做。