支付回调每天约 8 万笔,其中 200 多笔返回 invalid signature,渠道后台点重发又能通过,同一笔第一次必失败。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,渠道在重发时会补齐可选字段并重新排序,第一次推来的 body 和重发的不是同一份字节。我方按收到的原始 body 重算 HMAC,字段缺失那次自然对不上。签名比的从来不是业务值,而是那一串原始文本。

「回调验签偶发失败」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。报错里带路径的,先去看那个路径在不在、权限对不对。

curl -s -X POST http://127.0.0.1:8080/callback -H 'X-Sign: xxx' --data-binary @event.json
python -c "import hmac,hashlib;print(hmac.new(b'k',open('event.json','rb').read(),hashlib.sha256).hexdigest())"

同一份配置存在多处的,先确认改的是被加载的那一份。

具体做法是,把失败样本的 body 和签名头一起落盘 保留原始字节不要解码;用同一条 body 离线重算 HMAC 判断是算法还是输入不同;对比重发成功那次的字段数量和长度;确认后按渠道文档补齐可选字段再验签。

最后用这个标准收尾,连续观察三天 invalid signature 归零 重发也能一次通过。

作者 9823189