diff --git a/common/request.js b/common/request.js index 290d385..f5952e3 100644 --- a/common/request.js +++ b/common/request.js @@ -5,7 +5,7 @@ import EnvConfig from '@/common/env.js' import md5 from 'js-md5' - +import CryptoJS from 'crypto-js'; import { apiWhiteList } from '@/common/config.js' import RouterManager from '@/common/router.js' import { platform } from '@/common/platform/PlatformFactory' @@ -193,10 +193,9 @@ class RequestManager { header = { 'content-type': 'application/x-www-form-urlencoded', - client: client, + platform: client, token: token, - adid: uni.getStorageSync('_ad_id'), - clickid: uni.getStorageSync('_click_id') + version: "1.0.0" } } else { // GET请求,添加签名 @@ -229,7 +228,8 @@ class RequestManager { header = { 'content-type': 'application/json', token: token, - client: client, + platform: client, + version: "1.0.0" } } @@ -247,6 +247,7 @@ class RequestManager { header: header, data: data, success: res => { + res = RequestManager.normalizeResponseKeys(res); console.log("res.data.status", res.data.status) var pages = getCurrentPages() if (res.data.status == 1) { @@ -396,6 +397,72 @@ class RequestManager { Loading: !showLoading }) } + /** + * 转换接口返回的字段名为统一结构 + * 支持安卓特有字段 => 通用字段 + * + * @param {Object} res 接口返回的数据对象 + * @returns {Object} 处理后的对象(直接修改原对象) + */ + static 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; + } + + if (res.data.note != null) { + res.data.msg = 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 = 'g6R@9!zB2fL#1cVm'; + 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; + } } export default RequestManager; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 36a4d40..7406faf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,6 +6,7 @@ "": { "dependencies": { "@lucky-canvas/uni": "^0.0.14", + "crypto-js": "^4.2.0", "eruda": "^3.4.1", "js-md5": "^0.8.3", "uqrcodejs": "^4.0.7" @@ -19,6 +20,12 @@ "lucky-canvas": "~1.7.19" } }, + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", + "license": "MIT" + }, "node_modules/eruda": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/eruda/-/eruda-3.4.1.tgz", diff --git a/package.json b/package.json index 5302444..9b553e7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,7 @@ { "dependencies": { "@lucky-canvas/uni": "^0.0.14", + "crypto-js": "^4.2.0", "eruda": "^3.4.1", "js-md5": "^0.8.3", "uqrcodejs": "^4.0.7" diff --git a/pages/guize/guize.vue b/pages/guize/guize.vue index b2743f6..743a16c 100644 --- a/pages/guize/guize.vue +++ b/pages/guize/guize.vue @@ -1,119 +1,302 @@ \ No newline at end of file