簽名認(rèn)證:
現(xiàn)在接口互通除了使用access_token之外,還有許多喜歡使用sign進(jìn)行數(shù)據(jù)二次驗證。本次所說的就是sign的坑。
sign簽名一般驗證條件:
- 密鑰secret
- 請求參數(shù)
開始加密
步驟一:對請求數(shù)據(jù)根據(jù)參數(shù)名進(jìn)行ASCII碼排序
# 密鑰
$secret = '123456';
# 參數(shù)
$data = [
"name" => '張三',
"optType" => "5",
"uniqueId" => "2435",
"queryType" => "634",
"eWalletNum" => "323",
"monTrans" => "34",
"dealerNum" => "1008",
"dealTime" => '2022-12-15 21:43:08',
];
# 去除空元素
$data = array_filter($data);
# ASCII碼 排序
ksort($data);
二:將請求參數(shù)拼接為字符串,具體根據(jù)請求文檔,這里根據(jù)key=value連接。
拼接為字符串有兩種模式,推薦使用方法二
- 方法一:是由系統(tǒng)函數(shù) http_build_query()生成。對中文和特殊字符不友好,會生成
URL-encode請求后的字符串 - 方法二:循環(huán)拼接,不會對中文特殊字符進(jìn)行處理。
# 方法一:使用系統(tǒng)函數(shù)
$stringA = http_build_query($data);
# dealTime=2022-12-15+21%3A43%3A08&dealerNum=1008&eWalletNum=323&monTrans=34&name=%E5%BC%A0%E4%B8%89&optType=5&queryType=634&uniqueId=2435
# 方法二:foreach 循環(huán)
$str= '';
foreach ($data as $k=>$val){
$str.= $k .'=' . $val . '&';
}
$stringB = rtrim($str, '&');
# dealTime=2022-12-15 21:43:08&dealerNum=1008&eWalletNum=323&monTrans=34&name=張三&optType=5&queryType=634&uniqueId=2435
注意:根據(jù)上述代碼可以看出,兩種方式生成的字符串也不相同。這時生成的簽名也就發(fā)生了改變。
三:將拼接后的字符最后拼接“&key={$secret}”進(jìn)行MD5加密
由于步驟二有兩種方式所以步驟三有兩種情況
# 情況一:
# md5加密
$md5= md5($stringA."&key=".$secret);
# 簽名一般統(tǒng)一大寫,這里轉(zhuǎn)大寫
$sign = strtoupper($md5);
# E9CF0007B7223B9EDDD66423FC5B1420
# 情況二:
# md5加密
$md5= md5($stringB."&key=".$secret);
# 簽名一般統(tǒng)一大寫,這里轉(zhuǎn)大寫
$sign = strtoupper($md5);
# 33398632A0005A287C0533AC4DDBCF9E
勸告:敲代碼不要想著偷懶,接口訪問時請根據(jù)接口文檔要求編寫不要想當(dāng)然。由于偷懶使用http_build_query()系統(tǒng)函數(shù)。導(dǎo)致簽名不通過,加班排查很久,望大家引以為鑒。