# 支付接口簽名算法文檔
## 簽名生成的通用步驟如下:
### 第一步,設所有發送或者接收到的數據為集合M,將集合M內非空參數值的參數按照參數名ASCII碼從小到大排序(字典序),使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
### 特別注意以下重要規則:
~~~
1.◆ 參數名ASCII碼從小到大排序(字典序);
2.◆ 如果參數的值為空不參與簽名;
3.◆ 參數名區分大小寫;
~~~
### 第二步,在stringA最后拼接上 \*\*商戶密鑰?\*\*得到stringSignTemp字符串,并對stringSignTemp進行MD5運算,再將得到的字符串所有字符轉換為大寫,得到sign值signValue。
~~~
◆ **商戶密鑰?** 在后臺商戶配置里面
例子:
假設傳送的參數如下
appid:????????? wxd930ea5d5a258f4f
mch_id: 10000100
device_info: 1000
body: test
nonce_str: ibuaiVcKdpRxkhJA
~~~
#### 第一步:對參數按照key=value的格式,并按照參數名ASCII字典序排序如
~~~
$stringA="appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_id=10000100&nonce_str=ibuaiVcKdpRxkhJA";
~~~
#### 第二步:拼接\*\*商戶密鑰?\*\*:
~~~
$stringSignTemp = $stringA . "&key=192006250b4c09247ec02edce69f6a2d"; // 拼接商戶密鑰
$sign = md5($stringSignTemp); // md5加密
~~~
最后把加密后的字符串全部轉成大寫,得到的就是簽名串
PHP簽名函數
/\*\*
* @author LvGang
* @Note 生成簽名
* @param $data 參與簽名的數據
* @return string
\*/
public function makeSign($data)
{
// 去空
$data = array\_filter($data);
//簽名步驟一:按字典序排序參數
ksort($data);
$string\_a = http\_build\_query($data);
$string\_a = urldecode($string\_a);
//簽名步驟二:在string后加入KEY
$config = $this->config;
$string\_sign\_temp = $string\_a . "&key=" . $config\['KEY'\];
//簽名步驟三:MD5加密
$sign = md5($string\_sign\_temp);
// 簽名步驟四:所有字符轉為大寫
$result = strtoupper($sign);
return $result;
}