124 lines
11 KiB
JavaScript
124 lines
11 KiB
JavaScript
import CryptoJS from 'crypto-js'
|
||
import EnvConfig from '@/common/env'
|
||
|
||
|
||
let routeMapSecretKey = EnvConfig.routeMapSecretKey;
|
||
let normalizeSecretKeys = EnvConfig.normalizeResponseKeys;
|
||
/**
|
||
* 解密 route_map 字符串
|
||
* @param {string} encryptedBase64 加密后的 Base64 字符串
|
||
* @param {string} secretKey 与后端一致的密钥(16字节)
|
||
* @returns {Object|null} 解密后的 JSON 对象(映射表),失败则为 null
|
||
*/
|
||
export function decryptRouteMap(encryptedBase64, secretKey = '') {
|
||
if (secretKey == '') {
|
||
secretKey = routeMapSecretKey;
|
||
}
|
||
try {
|
||
// 与 PHP 中 substr(md5(secretKey), 0, 16) 相同
|
||
const iv = CryptoJS.enc.Utf8.parse(CryptoJS.MD5(secretKey).toString().substring(0, 16))
|
||
const key = CryptoJS.enc.Utf8.parse(secretKey)
|
||
|
||
// base64 解码
|
||
const encryptedHex = CryptoJS.enc.Base64.parse(encryptedBase64)
|
||
|
||
// 解密
|
||
const decrypted = CryptoJS.AES.decrypt({ ciphertext: encryptedHex }, key, {
|
||
iv,
|
||
mode: CryptoJS.mode.CBC,
|
||
padding: CryptoJS.pad.Pkcs7
|
||
})
|
||
|
||
const decryptedText = decrypted.toString(CryptoJS.enc.Utf8)
|
||
return JSON.parse(decryptedText)
|
||
} catch (e) {
|
||
console.error('❌ 解密失败:', e)
|
||
return null
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 解密 payload 字段
|
||
* @param {Object} res 接口返回的数据对象
|
||
* @returns {Object} 处理后的对象(直接修改原对象)
|
||
*/
|
||
export function normalizeResponseKeys(res) {
|
||
if (!res || typeof res !== 'object') return res;
|
||
|
||
// 安全处理 res.data
|
||
if (!res.data || typeof res.data !== 'object') {
|
||
res.data = {};
|
||
}
|
||
|
||
// 将安卓专属字段映射为通用字段
|
||
if (res.data.ret != null) {
|
||
res.data.status = res.data.ret;
|
||
delete res.data.ret;
|
||
}
|
||
|
||
if (res.data.note != null) {
|
||
res.data.msg = res.data.note;
|
||
delete res.data.note;
|
||
}
|
||
|
||
// 解密 payload 字段(如果存在)
|
||
if (res.data.payload != null && typeof res.data.payload === 'string') {
|
||
try {
|
||
const base64EncryptedData = res.data.payload;
|
||
|
||
// 先 base64 解码(CryptoJS 需要的是 WordArray)
|
||
const encryptedHexStr = CryptoJS.enc.Base64.parse(base64EncryptedData);
|
||
|
||
// 解密 key 和 iv
|
||
const secretKey = normalizeSecretKeys;
|
||
const key = CryptoJS.enc.Utf8.parse(secretKey);
|
||
const iv = CryptoJS.enc.Utf8.parse(CryptoJS.MD5(secretKey).toString().substring(0, 16));
|
||
|
||
// 进行解密
|
||
const decrypted = CryptoJS.AES.decrypt(
|
||
{ ciphertext: encryptedHexStr },
|
||
key,
|
||
{
|
||
iv: iv,
|
||
mode: CryptoJS.mode.CBC,
|
||
padding: CryptoJS.pad.Pkcs7
|
||
}
|
||
);
|
||
|
||
const decryptedText = decrypted.toString(CryptoJS.enc.Utf8);
|
||
try {
|
||
res.data.data = JSON.parse(decryptedText);
|
||
} catch (e) {
|
||
res.data.data = decryptedText;
|
||
}
|
||
} catch (e) {
|
||
console.error('解密 payload 失败:', res.data.payload, e);
|
||
res.data.data = null; // 解密失败时给 null 或原值
|
||
}
|
||
}
|
||
|
||
if (res.data.ts != null) {
|
||
res.data.timestamp = res.data.ts;
|
||
}
|
||
|
||
return res;
|
||
}
|
||
|
||
const routeMapText = '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';
|
||
const route_map = decryptRouteMap(routeMapText);
|
||
console.log(route_map);
|
||
export { route_map };
|
||
|
||
/**
|
||
* 获取路由映射
|
||
* @param {string} route 路由名称
|
||
* @returns {string} 映射后的路由名称
|
||
*/
|
||
export function getRouteMap(route) {
|
||
// 去除 route 中的 开头/
|
||
if (route.startsWith('/')) {
|
||
route = route.substring(1);
|
||
}
|
||
// 如果 route 中不包含 / 则返回 route_map[route]
|
||
return route_map[route] || route;
|
||
} |