SignUtils.ts 2.62 KB
import { Md5 } from "../lib/md5";
import { GAMEDATA } from "../base/SDKConst";
import SDKUtils from "./SDKUtils";

export default class SignUtils {
    private static instance: any;

    static get I(): SignUtils {
        return this.instance || (this.instance = new SignUtils());
    }

    createSign(params: any) {
        let signStr = this.createQuery(params) + '' + GAMEDATA.appkey;
        //console.error("signStr",signStr)
        return Md5.hashStr(signStr);
    }

    private ksort(inputArr: any) {
        let tmp_arr = {},
            keys: any[] = [],
            sorter, i, k: any,
            strictForIn = false,
            populateArr = {};

        sorter = function (a, b) {
            let aFloat = parseFloat(a),
                bFloat = parseFloat(b),
                aNumeric = aFloat + '' === a,
                bNumeric = bFloat + '' === b;
            if (aNumeric && bNumeric) {
                return aFloat > bFloat ? 1 : aFloat < bFloat ? -1 : 0;
            } else if (aNumeric && !bNumeric) {
                return 1;
            } else if (!aNumeric && bNumeric) {
                return -1;
            }
            return a > b ? 1 : a < b ? -1 : 0;
        };

        // Make a list of key names
        for (k in inputArr) {
            if (inputArr.hasOwnProperty(k)) {
                keys.push(k);
            }
        }
        keys.sort(sorter);

        // Rebuild array with sorted key names
        for (i = 0; i < keys.length; i++) {
            k = keys[i];
            tmp_arr[k] = inputArr[k];
            if (strictForIn) {
                delete inputArr[k];
            }
        }
        for (i in tmp_arr) {
            if (tmp_arr.hasOwnProperty(i)) {
                populateArr[i] = tmp_arr[i];
            }
        }

        return strictForIn || populateArr;
    }

    private createQuery(params) {
        params = params || {};
        // 1、ksort排序参数对象
        let keys = Object.keys(this.ksort(params));
        // 2、拼贴字符串
        let key = '';
        let query = '';
        for (let i = 0, len = keys.length; i < len; i++) {
            // 为空,为 0的参数不参与签名,参数名为ver,pkv的参数不参与签名, 字符集为 utf-8
            if (params[keys[i]] === '' || params[keys[i]] === '0' || params[keys[i]] === 0 || keys[i] === 'ver'|| keys[i] === 'pkv') continue
            key = keys[i];
            i && (query += '');
            if(SDKUtils.isArray(params[key])){
                query += `${key}=${JSON.stringify(params[key])}`;
            }else{
                query += `${key}=${params[key]}`;
            }
        }
        return query;
    }
}