接口参数签名效验设计讨论
想知道大家平日是如何设计接口参数签名效验的,大家讨论以下的签名方式如何?
本着简单明了、减少歧义、跨语言对接减少踩坑的原则来设计,降低对接沟通成本。
举例:某些语言md5后大小写都有。某些语言json编码会有不同的转义表现。
参数签名
Step 1:
将所有参数(除
sign
参数外)按键值字典序进行升序排序Step 2:
对数据进行json编码(不转义中文)得到字符串
Step 3:
字符串拼接上盐值
salt
后进行md5
加密并转化为小写
PHP Example:
<?php
// Step1:
$args = [
'TIMESTAMP' => '1566267610',
'device' => 'app',
'guid'=> 'eiXEW6VmtoqcLCYsQ04GRHnwpdub9r2K',
'sysLanguage' => 'zh',
'username' => '907640',
];
unset($args['sign']);
ksort($args); // 排序
// Step2:
$str = json_encode($args, JSON_UNESCAPED_UNICODE); // 不转中文
// Step3:
$salt = '1kQrjKS4dm5WVCsPX6hzYoUNIvDta7F9';
// 生成签名
$sign = strtolower(md5($str . $salt)); // md5并小写
echo 'sign = ' . $sign;
微信支付2.0 不就是这种
不要用json_encode,遇上整型和浮点有点坑