JS将参数生成签名,在请求头新增sign字段

pid = 20187834654
serviceName = queryorder
timestamp = 1502981841
bizContent ={"parkCode": "P123456", "tradeNo":"T201808131533631534"}
第⼀步:对参数按照参数名 ASCII 字典序排序,并按照 key=value 的格式拼接成字符串,如下:
StringTemp =bizContent={"parkCode": "P123456",
"tradeNo":"T201808131533631534"}&pid=20187834654&serviceName=queryorder&timestamp=1502981841
第⼆步:拼接密钥 Key: signTemp=StringTemp+"&key= 192006250b4c09247ec02edce69f6a2d"
第三步:对 signTemp 进⾏ MD5 运算
sign=MD5(signTemp).toUpperCase()
按照上述步骤,签名结果为: 6DF21A9F1893339FB38414556AFFB5EC
 

//在utils.js文件中写一下代码,这是一个公共的js文件

import forge from 'node-forge' //各种加密算法插件,本项目用MD5

//MD5加密

export function md5(str) {

  //这应该是md5内部封装的方法

  var md = forge.md.md5.create()

  md.update(str, 'utf8')

  return md.digest().toHex()

}

export function paramsStrSort(paramsStr,kAppKey,kAppSecret){

  let url = paramsStr;

  //切割后用&拼接字符串

  let urlStr = url.split('&').sort().join('&');

  //再加上后端给的key值

  let newUrl = urlStr + '&key=' + '99a2eb85f315d136f064cb7d4bcdc884';

  return md5(newUrl).toUpperCase();

}

//传入需要签名的参数

export function getSign(params) {

  let _sign = '';

  if(typeof params == 'string') {//如果是字符串

    //则直接调用paramsStrSort方法

    _sign= paramsStrSort(params);

  }else if(typeof params == 'object'){//如果是对象

   //先转成数组

    let arr = [];

    for(let i in params){

      if(params[i]!=''&&params[i]!=undefined&&params[i]!=null){//判断非空,undefined,null

        //将key=value的形式存在数组里

        arr.push((i + '=' + params[i]));

      }

    }

   

    //再把数组用&拼接成字符串,再调用paramsStrSort方法

    _sign= arr.length ? paramsStrSort(arr.join(('&'))) :'';

  }

  // console.log('==_sign===',_sign);

  //返回生成的签名

  return _sign;

//在api文件夹中的index.js文件中

import { getSign } from "@/utils/utils";

//这是接口的共用请求头

request.interceptors.request.use((url, options) => {

//调用getSign方法,就是上面生成签名的方法

const _sign = getSign(options.params) || '';

  const lang = sessionStorage.getItem("lang") || "en";

  const headers = {

    "Content-Type": "application/json; charset=utf-8",

    Accept: "application/json",

    "Accept-Language": lang,

    "Accept-Sign": _sign,//新增Accept-Sign字段给后端,后端也会生成一样的签名,看与前端的这个Accept-Sign的值是否相等

  };

  console.log('===options===',options,headers,_sign);

  // console.log('====https======',options);

  return { url, options: {...options,headers } };

});


版权声明:本文为qq_45031347原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>