签名不通过时,先比较“双方实际签了什么”,再检查算法和密钥。空值、编码、字段遗漏或公私钥用途混淆,都可能让看起来相同的一笔请求得到不同结果。

按文档形成同一段字符串

本站签名说明要求取非空参数,排除数组、字节类型参数以及 sign、sign_type 字段,按参数名 ASCII 升序排列,再用“参数=参数值”并以 & 连接。请求签名采用 SHA256WithRSA。

排查时保存脱敏后的参数名列表与排序结果,确认没有额外空格、换行或漏字段。业务值中的零、中文、空格和特殊字符需要按协议语义处理,不要因为编程语言的真假值判断而意外删除有效值。

区分签名与验签的密钥

商户请求由商户私钥签名,平台响应与通知使用平台公钥验签。更换商户配置、迁移环境或更新密钥后,应核对两端的生效版本,不能以旧环境公钥验证新环境的数据。

检查 PEM 格式的换行、头尾标记和复制过程中多出的字符。密钥只保存在受控的服务端配置中,排查日志输出指纹或配置版本即可,不应将私钥全文发给客服或贴到公开测试网站。

对比编码前后的数据

表单、JSON、URL 编码和网关中间件可能改变参数表达。检查签名计算使用的是哪一层的数据,是否把编码后的字符串再解码、是否把加号和空格混淆、是否把数值格式从“10.00”改成“10”。

通知验签按文档纳入实际传入的应签字段,不能仅挑选自己认识的少数字段后重新拼串。新增业务字段时,旧逻辑如果硬编码了字段列表,也可能导致验签失败。

用可复现样本定位差异

  • 先核对接口版本与实际采用的签名协议。
  • 再检查参数过滤、排序及拼接结果。
  • 对照字符编码、金额格式与传输过程。
  • 最后核对算法、签名编码和密钥版本。

修正后分别测试普通字符、中文、特殊字符、空值和通知新增字段。验签只是确认消息可信的一环,仍需核对金额、商户、订单与状态,再按支付通知处理更新业务结果。