接入方用 json.dumps 默认参数拼串,我方用 sort_keys 加紧凑分隔符,同一份数据两边签名差 32 个字符。乍看像缓存或者权限的锅,追下去往往不是。

python -c "import json;print(json.dumps({'b':1,'a':2},sort_keys=True,separators=(',',':')))"

追下去是这么回事:默认序列化按插入顺序输出,字段顺序取决于上游构造字典的顺序。签名算法要求固定顺序,顺序不一致结果必然不同。

「JSON 字段顺序签名」这类改动最怕改一半,回滚脚本先准备好,再动生产。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。

线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。

权限不要一口气开到最大,先加到够用再往上试,范围小才好收。

具体做法是,待签串统一按键名升序序列化;分隔符固定成逗号和冒号 不带空格;把待签串样例写进联调文档;用同一份数据在两边比对签名。

验收就看一点,两边输出的待签串完全一致 签名相同 联调样例通过。

作者 9823189