## 簽名規則
簽名算法
簽名生成的通用步驟如下:
- 第一步,設所有發送或者接收到的數據為集合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;
}
~~~
```