ApiPost 预处理Sign脚本示例

清风 工具 2021-08-16

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

一、增加执行脚本

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

ApiPost 预处理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`增加一条字段属性

ApiPost 预处理Sign脚本示例

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

Apipost 私有化火热进行中

评论