事件起因
今天在呼叫一個同事的介面時候,遇到了一個問題,這個介面是通過使用者登入名獲取該使用者登入後的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 協議》,轉載必須註明作者和本文連結