> For the complete documentation index, see [llms.txt](https://payment.gitbook.io/mpay/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://payment.gitbook.io/mpay/summary/signrule.md).

# 1.2.2 签名规则

### 签名

> 开户时给的配置文件里商户号和私钥key，请自行保存

**生成签名**

**签名生成规则**

* 筛选 获取所有请求参数，不包括字节类型参数，如文件、字节流，剔除sign字段。
* 排序 将筛选得到的参数按照第一个字符的键值ASCII码递增排序（字母升序排序），如果遇到相同字符 则按照第二个字符的键值ASCII码递增排序，以此类推。
* 拼接 将排序后的参数与其对应值，组合成"参数=参数值"的格式，并且把这些参数用&字符连接起来， 最后再拼接"\&key={商户私钥key}",此时生成的字符串为待签名字符串。
* 签名 用MD5算法对生成的待签名字符串逬行加密，获得签名。

**案例**

```php
<?php
function sign($data){
    //解码
    foreach ($data as $key => &$value) {
        $value = urldecode($value);
    }
    unset($value);
    //如果有sign，去除sign
    if (isset($data['sign'])){
        unset($data['sign']);
    }
    $key = '121111as2d12a2s1da1das'; //商户秘钥
    ksort($data); //数组正序排序
    $params_str = urldecode(http_build_query($data)); //拼接
    $params_str =  $params_str.'&key='.$key; //拼接商户秘钥在最后面
    return md5($params_str); //返回md5结果
}
```

**验证签名**

* 首先取出参数`sign`，然后把获得的参数（剔除`sign`)按照接口签名的规则生成待 签名字符串。 &#x20;
* 通过DM5算法对生成的待签名字符串逬行加密，得到的签名再与原`sign`对比。 &#x20;
