曾经遇见的签名坑:sgin

签名认证:
现在接口互通除了使用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()系统函数。导致签名不通过,加班排查很久,望大家引以为鉴。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容