## 签名规则
签名算法
签名生成的通用步骤如下:
- 第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序), 使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
◆ 参数名ASCII码从小到大排序(字典序);
◆ 参数的值为空或null、sign签名字段不参与签名;
◆ 参数名区分大小写;
◆ 验证调用返回或码付宝主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
◆ 码付宝接口可能增加字段,验证签名时必须支持增加的扩展字段
- 第二步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,得到sign值signValue。
◆ key:“应用管理”-“应用管理”-“选择对应应用-详情”中获取SECRET
举例:
假设传送的参数如下:
```bash
a:1
b:2
sign:86452f3b9aa613299f2e00224a3dfef1
```
第一步:对参数按照key=value的格式,并按照参数名ASCII字典序排序如下:
```bash
stringA = "a=1&b=2"
```
第二步:拼接API密钥:
```bash
stringB = stringA+"&key=sdfwewlslsxxwesf" // 注: key为应用的SECRET
sign = md5(stringB) // md5加密, 结果为 86452f3b9aa613299f2e00224a3dfef1
```
## php代码示例
```php
~~~
/**
* 生成支付签名
* @param array $option 所有参数
* @param string $partnerKey 私钥
* @return string 签名
*/
function getPaySign($option, $partnerKey)
{
ksort($option);
$sign = '';
foreach ($option as $k => $v) {
if ($k == 'sign' || $v === '' || $v === null) {
continue;
}
$sign .= "$k=$v&";
}
return md5($sign . 'key=' . $partnerKey);
}
/**
* 验证支付签名
* @param array $option 所有参数
* @param string $partnerKey 私钥
* @return bool
*/
function checkPaySign($option, $partnerKey)
{
$sign = $option["sign"];
return getPaySign($option, $partnerKey) == $sign;
}
~~~
```