签名认证:
现在接口互通除了使用access_token之外,还有许多喜欢使用sign进行数据二次验证。本次所说的就是sign的坑。
sign签名一般验证条件:
- 密钥secret
- 请求参数
开始加密
步骤一:对请求数据根据参数名进行ASCII码排序
# 密钥
$secret = '123456';
# 参数
$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);
二:将请求参数拼接为字符串,具体根据请求文档,这里根据key=value连接。
拼接为字符串有两种模式,推荐使用方法二
- 方法一:是由系统函数 http_build_query()生成。对中文和特殊字符不友好,会生成
URL-encode请求后的字符串 - 方法二:循环拼接,不会对中文特殊字符进行处理。
# 方法一:使用系统函数
$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 循环
$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
注意:根据上述代码可以看出,两种方式生成的字符串也不相同。这时生成的签名也就发生了改变。
三:将拼接后的字符最后拼接“&key={$secret}”进行MD5加密
由于步骤二有两种方式所以步骤三有两种情况
# 情况一:
# md5加密
$md5= md5($stringA."&key=".$secret);
# 签名一般统一大写,这里转大写
$sign = strtoupper($md5);
# E9CF0007B7223B9EDDD66423FC5B1420
# 情况二:
# md5加密
$md5= md5($stringB."&key=".$secret);
# 签名一般统一大写,这里转大写
$sign = strtoupper($md5);
# 33398632A0005A287C0533AC4DDBCF9E
劝告:敲代码不要想着偷懒,接口访问时请根据接口文档要求编写不要想当然。由于偷懒使用http_build_query()系统函数。导致签名不通过,加班排查很久,望大家引以为鉴。