# 支付接口签名算法文档
## 签名生成的通用步骤如下:
### 第一步,设所有发送或者接收到的数据为集合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;
}