ApiPost 预处理Sign脚本示例

清风 工具 2021-08-16

这里主要记录一个常规sign校验生成脚本

一、增加执行脚本

便于API开发时多接口的sign值自动生成,为了方便通常在目录级设置“目录公用预执行脚本”(图中代码仅供参考,实际代码以下方完整代码为准)

ApiPost 预处理Sign脚本示例

以下是`预执行脚本`完整代码

const _sign = function(key){
    this._key = key;
}

_sign.prototype.isEmpty = function(obj)
{
    if(typeof obj === "undefined" || obj === null || obj === ''){
        return true;
    }else{
        return false;
    }
};

_sign.prototype.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';
    }
};

_sign.prototype.getParam = function(request)
{
    if ( request.method === 'GET' ){
        param = request.request_querys;
    }else{
        param = request.request_bodys;
    }
    return param;
};

_sign.prototype.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];
        }
    }
    return param;
};

_sign.prototype.create = function(){
    let param = this.getParam(request);
    
    if(this.isJson(param) && typeof param == 'string'){
        //BODY不是JSON格式
        param = JSON.parse(param)
    }

    // 替换变量
    param = this.replaceVar(param);
    console.log('请求参数:')
    console.log(param)

    //Post
    //取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') + '#' + this._key;
    console.log('sign加密前:');
    console.log(sign);
    sign = CryptoJS.MD5(sign).toString();
    sign = sign.toUpperCase();
    console.log('sign加密后:');
    console.log(sign);
    return sign;
};

$.sign = function(key){
    return new _sign(key);
};


// 调用示例
let _signKey  = apt.variables.get("sign_key");
let _thisSign = $.sign(_signKey).create();
apt.variables.set("sign", _thisSign);


二、在`目录公用Body`或`目录公用Query`增加一条字段属性

ApiPost 预处理Sign脚本示例

保存后,该目录下的请求会自动生成对应请求sign值,并通过{{sign}}变量同其他参数一同发给后端

中文版Postman,rap文档管理

评论