签名算法

## 签名算法 #### 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&param1=11111` 第二步:对上一步中的字符串拼接`&client_secret_key=密钥`: `client_id=12345&param1=11111&client_secret_key=xxxxxxxxx` 第三步:对上一步中字符串取MD5值 `$sign = md5('client_id=12345&param1=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() } ```