深入认识 http_build_query 函数
事件起因
今天在调用一个同事的接口时候,遇到了一个问题,这个接口是通过用户登录名获取该用户登录后的token的,该登录名可能是手机号也可能是邮箱。于是按照他的接口加密方式进行签名调用发现一个问题,手机号是可以获取成功的,但是使用邮箱的时候却报签名错误。
查找原因
我怀疑是由于邮箱因为@符号,导致我的签名在他那里不能通过,然后我看了一下签名方法,大概就是把参数数组进行排序,然后拼接私钥就行md5加密,然后拼接的时候用到了 http_build_query
函数,难道是这里出问题了?我去php官方手册查看了下这个函数的介绍
这个函数最后生成的是一个经过URL-encode 之后的请求字符串,看到这里我们就明白了,@符号肯定是被转义了,我把拼接后的字符串打印了一下,果然@
符号呗转义成%40
。那么我应该在md5之前把%40
还原成@
.
解决办法
1.既然http_build_query
函数结果是url-encode,那么我只要decode回来就可以了,所以可以选用urldecode()
函数处理完了然后在md5加密,最后也证实成功了。
2.或者我们直接不用http_build_query
函数处理,用循环然后拼接的方式,这样就可以不用担心特殊符号被转义了。
总结
有时候我们使用php编程的时候,有些函数我们只知道是用来干嘛的,但是没有仔细看官方文档,不是真正了解这个函数转化的结果类型等。下面贴出一些常见网址URL中特殊字符转义编码
本作品采用《CC 协议》,转载必须注明作者和本文链接