回调验签一直失败,服务端算出来的签名和对方给的差几位。把请求体原样打印出来对比,发现空格和字段顺序都变了。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,验签用的是框架解析后的对象重新序列化出来的字符串,JSON 的键顺序、空格、转义都会变。签名针对的是原始字节,重新拼一遍就对不上,哪怕语义完全相同。

「回调验签原文」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。改完顺手把文档补一句,省得下次自己重新推一遍。

raw = await request.body()
expected = hmac.new(secret, raw, hashlib.sha256).hexdigest()

具体做法是,在框架解析之前把原始请求体读出来 用这段字节验签;中间件里缓存 raw body 别让后续解析覆盖掉;验签失败时打印原始串和签名 只打摘要不要泄露密钥;用同一条回调重放三次 确认签名稳定通过。

最后用这个标准收尾,用同一条回调重放 验签通过 改动请求体里任意一个字节后验签失败。

作者 9823189