参考文献
https://zhuanlan.zhihu.com/p/131298228

我们在设计签名验证的时候，请注意要满足以下几点：

可变性：每次的签名必须是不一样的。
时效性：每次请求的时效，过期作废等。
唯一性：每次的签名是唯一的。
完整性：能够对传入数据进行验证，防止篡改。

// 签名认证 yii框架配置
$behaviors['sign'] = [
    'class' => Sign::className(),
    'key' => Sign::generateSecret() // 密钥
];

一、签名参数sign生成的方法

第1步: 将所有参数（注意是所有参数），除去sign本身，以及值是空的参数，按参数名字母升序排序。

第2步: 然后把排序后的参数按参数1值1参数2值2…参数n值n（这里的参数和值必须是传输参数的原始值，不能是经过处理的，如不能将&quot;转成”后再拼接）的方式
拼接成k1=v1&k2=v2&time=vtime的一个字符串。

第3步: 把分配给接入方的验证密钥key拼接在第2步得到的字符串后面k1=v1&k2=v2&time=vtime&key=secret。

第2步: 在上一步得到的字符串前面加上验证密钥key(这里的密钥key是接口提供方分配给接口接入方的)，然后计算md5值，得到32位字符串，然后转成大写.

第4步: 计算第3步字符串的md5值(32位)，然后转成大写,得到的字符串作为sign的值。



二、签名验证方法：

根据前面描述的签名参数sign生成的方法规则，计算得到参数的签名值，和参数中通知过来的sign对应的参数值进行对比，如果是一致的，那么就校验通过，如果不一致，说明参数被修改过。