之前做过一个数据接口,由于该接口采用通知的方式向客户机提交数据,所以客户机需要校验数据来源的合法性。
之前只是采用了简单的验证密钥的方式,所以没什么问题。
最近升级接口,采用URL数据签名的方式校验合法性。在Linux系统的客户机上没问题,但是有一台windows客户机出问题了,计算的签名与服务器提交的签名不一致。
由于该客户机是windows操作系统,一开始怀疑是编码问题,转换编码后问题依旧。
在本地windows机器上配置了相同的环境,但是没有出现问题。
折腾了2个小时也没找到问题
后来调试发现客户机打印的 待签名 的字符串长度与实际不符,要比实际长度长。
于是逐个打印了一遍字符,这才发现字符串中的&符实际上是html实体:& 所以才导致了签名不一致。
因为待签名的字符串是用PHP自带的函数 http_build_query($arr)
生成的;
添加第三个参数来指定分隔符就可以了:http_build_query($arr,'','&');
大家以后使用 http_build_query()
函数时要注意