这里主要记录一个常规sign校验生成脚本
一、增加执行脚本
便于API开发时多接口的sign值自动生成,为了方便通常在目录级设置“目录公用预执行脚本”(图中代码仅供参考,实际代码以下方完整代码为准)
以下是`预执行脚本`完整代码
/**
* Sign生成器
*
* @param {String} signkey sign校验盐
* @param {String} fieldMode 字段模式:request(默认)、variable
* @param {String} varName 字段模式为variable时,设定要赋值的变量名称
*/
$.sign = function(signkey, fieldMode, varName) {
const _method = request.method;
const _signName = 'sign';
fieldMode = fieldMode?fieldMode:'request';
varName = varName?varName:'sign';
const _toolsUnit = {
/**
* 判断是否是空值
*
* @return {Boolean}
*/
isEmpty : function(obj)
{
if(typeof obj === "undefined" || obj === null || obj === ''){
return true;
}else{
return false;
}
},
/**
* 判断是否是JSON数据
*
* @param {String|Object} str 待验证数据
*
* @return {Boolean}
*/
isJson: function(str)
{
if (typeof str == 'string') {
try {
JSON.parse(str);
return true;
} catch(e) {
console.log(e);
return false;
}
}else{
return typeof str == 'object';
}
},
/**
* 获取请求参数
*
* @param {request} request
*
* @return {Object}
*/
getParam: function(request)
{
if ( _method === 'GET' ){
param = request.request_querys;
}else{
param = request.request_bodys;
}
if(this.isJson(param) && typeof param == 'string'){
//BODY不是JSON格式
param = JSON.parse(param)
}
// 替换变量
param = this.replaceVar(param);
return param;
},
/**
* 替换参数变量
*
* @param {Object} param
*
* @return {Object}
*/
replaceVar: function(param)
{
// 替换变量
for (let i in param){
if(this.isJson(param[i])){
let _tamp = JSON.stringify(param[i]);
var _var = _tamp.substring(2,_tamp.length-2);
_tamp = undefined;
}else{
var _var = param[i].substring(2,param[i].length-2);
}
if( apt.variables.get(_var) ){
param[i] = apt.variables.get(_var);
}else{
param[i] = param[i];
}
if( this.isEmpty(param[i]) ){
delete param[i];
}
}
for (let fName in param){
if( apt.globals.get(fName) ){
param[fName] = apt.globals.get(fName);
}else{
param[fName] = param[fName];
}
if( this.isEmpty(param[fName]) ){
delete param[fName];
}
}
return param;
},
/**
* 请求参数追加校验字段
*
* @param {String} sign
*
* @return {Boolean}
*/
autoSignAttach: function(sign)
{
if (fieldMode === 'request') {
if( _method === 'GET' ) {
apt.setRequestQuery(_signName, sign);
} else {
apt.setRequestBody(_signName, sign);//只针对 form-data、urlencode有效
}
}else{
apt.variables.set(varName, sign);
}
return true;
}
};
const _signUnit = function(){};
/**
* 创建Sign校验值
*
* @return {String}
*/
_signUnit.prototype.create = function()
{
let param = _toolsUnit.getParam(request);
//取key
var keys = [];
for (let k in param){
if (k == 'sign'){continue;}
keys.push(k);
}
//排序
keys.sort();
//取value
var kv = [];
var _tamp = '';
for (let k of keys){
if( k != 'timestamp' && k != 'biz_content' ){
kv.push(k + '=' + param[k])
}else{
_tamp = encodeURIComponent(param[k]);
_tamp = _tamp.replace(/\(/,'%28');
_tamp = _tamp.replace(/\)/,'%29');
kv.push(k + '=' + encodeURIComponent(param[k])); //urlencode编码
}
}
//拼接
var sign = kv.join('&');
sign = sign.replace(/\(/,'%28');
sign = sign.replace(/\)/,'%29') + '#' + signkey;
console.log('加密前:');
console.log(sign);
sign = CryptoJS.MD5(sign).toString();
sign = sign.toUpperCase();
console.log('加密后:');
console.log(sign);
// 追加到请求参数中
_toolsUnit.autoSignAttach(sign)
return sign;
};
return new _signUnit(signkey);
};
// 调用示例
let _signKey = apt.variables.get("sign_key");
$.sign(_signKey, 'request').create();
二、在`目录公用Body`或`目录公用Query`增加一条字段属性
保存后,该目录下的请求会自动生成对应请求sign值,并通过{{sign}}变量同其他参数一同发给后端