密钥无误但Webhook仍报Invalid signature。多数签名基于原始字节,对解析后的JSON重新序列化一定会改变内容。
实际处理步骤
- 从php://input或请求对象取得原始body并只读取一次;不能对decode后的对象再次encode再验签。
- 确认代理没有解压重压、转换字符集或把JSON包装成表单,Content-Type和签名头完整透传。
- 按网关文档组合timestamp与rawBody,用常量时间比较,并检查服务器时钟和允许窗口。
- 验签后再解析业务字段,按event_id/transaction_id幂等处理。
检查命令
# PHP伪代码:$raw=$request->getContent(); verify($timestamp.'.'.$raw,$header,$secret)
timedatectl status验证结果
官方测试事件通过;重放同一事件只执行一次,篡改一个字节或过期timestamp均被拒绝。

