参数里带加号的那批回调 100% 验签失败,把加号换成 %2B 重发就过了。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,拼待签串之前先对整个 query 做了一次 urldecode,加号被还原成空格。签名方按原始字节算,我方按解码后的值算,输入已经不同。表单编码里加号本来就代表空格,这一层歧义最容易踩。

「签名 URL 编码失真」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。别只看报错的最后一行,往上看几行,真正的起因通常在上面。

python -c "from urllib.parse import unquote;print(repr(unquote('a+b')))"
curl -X POST 'http://127.0.0.1:8080/callback?a=1%2B2' -d '{}'

同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。

具体做法是,验签只用收到的原始 query string 不要先解码;需要取值时单独解码 拼串仍用原值;对加号 %20 空格三种写法各写一条用例;确认后回归全量回调样本。

最后用这个标准收尾,带加号的样本重放验签通过 三种写法的用例结果一致。

作者 9823189