很多接口都有sign参数,规则是将地址栏的参数加密后生成,有时候前端的生成的sign跟服务端生成的不匹配,这个时候可以将前端的sign代码要过来,在postman执行js生成sign参数后去后台打断点对比。
编写js
位置:位置位于body右边的,Pre-request Script
注意,脚本生成了pwd变量并设置为全局变量,以便接口调用
如果将Pre-request Script写在接口文件夹根目录上,就可以实现全局调用
Postman唤醒console工具栏的快捷键是Alt+Ctrl+C
JS加密:
let sign_salt= '';//就是key
let sign_str= '';
let request_param = {'key1':'value1','key2':'value2'};
let now_time = Math.round(new Date().getTime()/1000).toString();
let sorted_key = Object.keys(request_param).sort()
for(let tok in sorted_key){
if(sorted_key[tok] == 'sign'){
continue;
}
sign_str += (sorted_key[tok] + '=' + request_param[sorted_key[tok]])
}
sign_str = sign_salt+sign_str+sign_salt;
sign_str = CryptoJS.MD5(sign_str).toString().toUpperCase()
postman.setGlobalVariable("sign", sign_str)//传递给postman
PHP加密:
ksort($request_params);
$sign_str = "";
foreach ($request_params as $key => $value) {
if(is_array($value)){
$value = json_encode($value);
}
$sign_str .= $key.'='.$value;
}
$sign_str = $app_secret.''.$sign_str.''.$app_secret;
unset($key,$value);
return strtoupper($sign_way($sign_str));
无用函数,忽略
function xorEncode(_key,_str) {
var keyUnicodeSum=_key;
var codedStr = "";
for( i = 0; i<_str.length; i++ ) {
//分别对每一个等加密字符串进行“位异或”运算
var _strXOR = _str.charCodeAt(i) ^ keyUnicodeSum;
//fromCharCode() 可接受一个指定的 Unicode 值,然后返回一个字符串。
codedStr += String.fromCharCode( _strXOR );
}
return codedStr;
}
var xorKey = "4523";
var sign = xorEncode(xorKey,"111111");
console.log(sign);
postman.setGlobalVariable("sign", sign)//传递给postman
//pm.globals.set("sign", sign);//另一种写法
注意
sign不一致,有一种可能是nginx伪静态后入参多了一个s参数,而前端没有。
解决方法:在nginx.conf中将rewrite ^(.*)$ /index.php?s=$1 last;
改成rewrite ^(.*)$ /index.php last;
使用
访问:http://127.0.0.1/api/login?sign={{sign}}