封装FlyIO且POST请求添加加密签名
前些天帮朋友一块解决了一个小程序中所有POST请求中携带加密签名并且要拼接时间戳的问题,以此文章来记录,首先需要安装必要的库,因为是小程序,选择使用了FlyIO,加密方法使用的是CryptoJs,代码如下
import FlyIO from "flyio/dist/npm/wx";
import CryptoJs from "crypto-js";
// 创建新的 FlyIO 实例
const http = new FlyIO();
// 设置超时(服务器性能偏差)
http.config.timeout = 30000;
// 设置请求基地址
http.config.baseURL = "https://xxxxxxx.com"; // 基地址因为涉及公司接口域名,用xxx来代替
// post请求公共参数
const tData = {
// deviceId: "xxxxx", //设备ID
// deviceType: "android", //设备类型
// deviceName: "huawei", //设备名称
// os: "12", //操作系统
// appversion: "1.9.9.81746", //版本号
deviceType: "phone",
deviceId: "xxxxx",
deviceName: "iphone",
os: "ios",
appversion: "10.0.1",
};
let time = new Date().getTime(); //时间戳
/**
* 封装加密签名
* @param {Object} params 需要加密的参数
* @returns 加密的结果
*/
const encryptParamsWithTimestamp = (params) => {
Object.assign(params, tData);
// 获取当前时间戳
params.timestamp = time;
params.nonce = time + "";
// 对参数按键名进行排序
const sortedKeys = Object.keys(params).sort();
console.log(Object.keys, "map");
// 按排序后的键名顺序构建参数字符串
let paramString = "";
sortedKeys.forEach((key) => {
paramString += `${key}=${params[key]}&`;
});
// 去除最后一个多余的"&"符号
paramString = paramString.slice(0, -1);
// 使用sha256加密后转换大写
paramString = CryptoJs.enc.Utf8.parse(paramString);
// 转成字符串并全部转为大写
const hash = CryptoJs.SHA256(paramString)
.toString(CryptoJs.enc.Hex)
.toUpperCase();
// 返回加密后的结果
return hash;
};
// 请求拦截器
http.interceptors.request.use((request) => {
uni.showLoading({
title: "拼命加载中",
});
// 配置默认请求头
request.headers = {
"Content-Type": "application/json;charset=UTF-8",
Accept: "application/json",
};
// post请求携带签名
if (request.method === "POST") {
request.body = {
...tData,
timestamp: time,
nonce: time + "",
sign: encryptParamsWithTimestamp(request.body),
...request.body,
};
}
return request;
});
// 响应拦截器
http.interceptors.response.use(
(response) => {
// 显示加载框
uni.hideLoading();
// 只取返回的数据字段
return response.data;
},
(err) => {
uni.hideLoading();
return Promise.reject(err);
}
);
// 导出
export default http;
评论
0 评论