签名算法
## 签名算法
#### API系统 签名算法与微信官方签名算法一致
---
#### 第一步:
设所有发送或者接收到的数据为集合`M`,将集合`M`内非空参数值的参数按照参数名`ASCII`码从小到大排序(字典序),使用`URL`键值对的格式(即key1=value1&key2=value2…)拼接成字符串`stringA`。
特别注意以下重要规则:
>d ◆ 参数名ASCII码从小到大排序(字典序);
◆ 如果参数的值为空不参与签名;
◆ 参数名区分大小写;
#### 第二步:
在`stringA`最后拼接上`&client_secret_key=密钥`得到`stringSignTemp`字符串,并对`stringSignTemp`进行MD5运算,再将得到的字符串所有字符转换为大写,得到`sign`值
>w client_secret_key是指你的API秘钥
注意不要泄露,妥善保存
## 举例:
假设传送的参数如下:
`client_id:12345`
`param1:11111`
第一步:对参数按照`key=value`的格式,并按照参数名ASCII字典序排序如下:
`client_id=12345¶m1=11111`
第二步:对上一步中的字符串拼接`&client_secret_key=密钥`:
`client_id=12345¶m1=11111&client_secret_key=xxxxxxxxx`
第三步:对上一步中字符串取MD5值
`$sign = md5('client_id=12345¶m1=11111&client_secret_key=xxxxxxxxx'); `
第四步:对上面md5值转化为大写
`$sign = strtoupper($sign);`
## PHP代码示例
```php
// 签名方法
function sign(array $data, $client_secret_key) {
ksort($data);
$sign = strtoupper(md5(urldecode(http_build_query($data)).'&client_secret_key='.$client_secret_key));
return $sign;
}
// 用法示例
$data = [
'client_id' => '12345',
'param1' => 1,
];
// API系统通信密钥
$client_secret_key = 'xxxxxxxxxxx';
$sign = sign($data, $client_secret_key);
```
## JS或微信小程序代码示例
```php
// 签名方法
//data:请求参数 列:{param1:1}
//client_secret_key:后台系统的通讯秘钥
function sign(data, client_secret_key) {
//对参数排序 并拼接
var e = Object.keys(data).sort().map((function(e) {
return e + "=" + data[e]
}
)).join("&");
//拼接秘钥
e = e + "&client_secret_key=" + client_secret_key,
//MD5加密并转为大写 **注意:JS的MD5加密方法请自行寻找,这里只是简单带过**
return md5(e).toUpperCase()
}
```