youdas/common/system/routeMap.js
2025-06-20 16:06:03 +08:00

124 lines
11 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
}