pid = 20187834654
serviceName = queryorder
timestamp = 1502981841
bizContent ={“parkCode”: “P123456”, “tradeNo”:”T201808131533631534″}
第⼀步:对参数按照参数名 ASCII 字典序排序,并按照 key=value 的格式拼接成字符串,如下:
StringTemp =bizContent={“parkCode”: “P123456”,
“tradeNo”:”T201808131533631534″}&pid=20187834654&serviceName=queryorder×tamp=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]!=”&¶ms[i]!=undefined&¶ms[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 } };
});