
最近对接一个第三方接口时遇到过一个很折腾的问题:请求参数看起来完全一样,本地生成的签名也固定,但对方接口一直返回"签名校验失败"。最开始怀疑密钥填错,重新申请、重新复制都没有变化,最后把双方参与签名的原始字符串逐字节打印出来,才找到真正原因。
这个接口要求先按参数名排序,再拼接成字符串计算 MD5。PHP 里原来的代码在签名前先执行了一次 urlencode,而对方文档要求的是原始参数参与签名,真正发送请求时才进行编码。普通数字和英文看不出区别,只要备注字段里出现中文、空格或者特殊符号,两边计算出来的结果就完全不同。
后来重新整理了整个签名流程:先保存一份未经处理的业务参数,过滤空值后排序,严格按照文档规定的格式拼接,再加入密钥计算签名。真正发 HTTP 请求时再根据接口要求转成 form 或 JSON。同时把"参与签名字符串"和最终请求体分别写入调试日志,出了问题可以直接比对,不再靠猜。
第三方接口验签失败时,我现在不会只盯着最终那一串签名值。真正需要核对的是参数顺序、空值规则、编码方式、时间戳、数字和字符串类型,以及签名前后有没有被二次处理。很多时候密钥没有任何问题,只是双方参与计算的原始内容并不完全一致。
#PHP开发 #接口对接 #接口签名 #系统开发