版本

20220302

简介

开发者可以通过签名功能手动进行加签操作。生成签名(sign)后,开发者可与自己代码中请求生成的信息进行对比,了解数据是否正确,保护数据安全。

原理

  1. 获取所有 post 内容,不包括字节类型参数,如文件、字节流,剔除 sign 字段,并且该字段值不为空;
  2. 按照第一个字符的键值 ASCII 码递增排序(字母升序排序),如果遇到相同字符则按照第二个字符的键值 ASCII 码递增排序,以此类推;
  3. 将排序后的参数与其对应值,组合成 参数=参数值 的格式,并且把这些参数用 & 字符连接起来,此时生成的字符串为待签名字符串。
  4. 待签名字符串拼接自己设置的密钥,然后md5加密即可获得签名字符串。

 示例

[
	"id" => 124,
	"timestamp" => "1637847312",
	"meta" => 1,
];

排序拼接后得到:

id=124&meta=1&timestamp=1637847312

然后再拼接自己设置的密钥,MD5即可得到签名。

md5(id=124&meta=1&timestamp=1637847312密钥)

配置密钥

.env 文件添加以下代码

API_KEY=
API_SIGN_NAME=sign
API_KEY : API接口密钥,一定要设置的复杂一些,建议包含大小写字符及数字
API_SIGN_NAME : 签名参数名,可以自定义,一般为sign

接口测试

推荐使用postman进行测试。

postman 自动生成签名

将以下代码复制进 postman 的 script 中,如下图。

let salt = "密钥";
let param = request.data;   //post 参数
let queryParam = pm.request.url.query.members;  //get中的参数

//将post和get合并,并且移除sign参数
for (let i in queryParam) {
    if (queryParam[i].key == "sign" || queryParam[i].value == null || queryParam[i].value == '' || queryParam[i].disabled == true) {
        continue;
    }
    param[queryParam[i].key] = queryParam[i].value;
}
//时间戳参数
param.timestamp = parseInt((new Date()).getTime() / 1000).toString();

//排序
var string = objSortToString(param);

var md5Str = CryptoJS.MD5(string+salt).toString();
postman.setGlobalVariable("sign", md5Str);
postman.setGlobalVariable("timestamp", param.timestamp);

//排序方法
function objSortToString(obj)
{
    let keys = Object.keys(obj).sort();
    let arr = [];
    for (let i in keys) {
        arr.push(keys[i]+"="+obj[keys[i]]);
    }
    return arr.join("&");
}

然后在参数中添加签名字段和时间戳字段,注意,如果修改了签名的默认名 sign,那么请求参数是也要同时修改。