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

  • Post author:
  • Post category:其他


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 版权协议,转载请附上原文出处链接和本声明。