曾經(jīng)遇見的簽名坑:sgin

簽名認(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)致簽名不通過,加班排查很久,望大家引以為鑒。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容