签名加密方式
特别注意以下重要规则:
- 参数名ASCII码从小到大排序(字典序);
- 如果参数的值为空不参与签名;
- 参数名区分大小写;
- header头部的参数不参与签名;
- 接口请求的路由参数r不参与签名;
- 签名失效时间为2分钟;
- 事件推送签名的密钥是令牌(token),接口请求签名的密钥是api_secret。
计算签名
其中nonce表示随机字符串,timestamps表示时间戳。
args表示消息体,非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string
ksort($args);
$string = '';
foreach ($args as $i => $arg) {
if ($arg === null || $arg === '') {
continue;
}
if (is_array($arg)) {
$arg = json_encode($arg);
}
$string .= ($i . '=' . $arg . '&');
}
$string = substr($string, 0, -1);
- 将密钥(secret)、字符串(string)和时间戳(timestamps)进行base64_encode转义下得到数据base64_temp;注意参数的顺序
string = 'a=1&b=2&c=3';
base64_temp = base64_encode(secret . string . timestamps);
- 然后再将字符串(string)、上一步获取的数据(base64_temp)、密钥(secret)和随机字符串(nonce)拼接起来再进行md5加密,注意参数的顺序,然后转成大写,就能得到一个签名dev_msg_signature。
string = 'a=1&b=2&c=3';
temp=md5(string . base64_temp . secret . nonce);
dev_msg_signature = strtoupper(temp)