接口加密

This commit is contained in:
小李 2026-07-20 10:10:55 +08:00
parent 738f058281
commit d9459b1bd0
8 changed files with 217 additions and 278 deletions

55
App.vue
View File

@ -142,26 +142,40 @@
*/ */
initFromExtraData(extraData) { initFromExtraData(extraData) {
// Storage I/O // Storage I/O
const storageData = { let storageData={}
host: extraData.host, if(uni.getStorageSync('isTest')){
header: { storageData = {
"x-token": extraData['x-token'], host: extraData.host,
"x-version": extraData['x-version'], header: {
"x-platform": extraData['x-platform'], "x-token": extraData['x-token'],
"x-device-id": extraData['x-device-id'], "x-version": extraData['x-version'],
"x-mobile-brand": extraData['x-mobile-brand'], "x-platform": extraData['x-platform'],
"x-mobile-model": extraData['x-mobile-model'], "x-device-id": extraData['x-device-id'],
"x-channel": extraData['x-channel'], "x-mobile-brand": extraData['x-mobile-brand'],
"x-package": extraData['x-package'], "x-mobile-model": extraData['x-mobile-model'],
"x-click-id": extraData['x-click-id'], "x-channel": extraData['x-channel'],
// #ifdef APP-PLUS "x-package": extraData['x-package'],
"header": { "x-click-id": extraData['x-click-id'],
"version": this.$version, // #ifdef APP-PLUS
"header": {
"version": this.$version,
}
// #endif
},
encrypt: extraData['encrypt'],
decrypt: extraData['decrypt']
}
}else{
storageData = {
host: extraData.host,
header: {
// #ifdef APP-PLUS
"header": {
"version": this.$version,
}
// #endif
} }
// #endif }
},
encrypt: extraData['encrypt'],
decrypt: extraData['decrypt']
} }
// //
@ -171,6 +185,9 @@
if (extraData['isCombo']) { if (extraData['isCombo']) {
uni.setStorageSync('isCombo', extraData['isCombo']) uni.setStorageSync('isCombo', extraData['isCombo'])
} }
if (extraData['paytype']) {
uni.setStorageSync('isCombo', extraData['paytype'] == 'combo' ? 'ok' : '')
}
}, },
/** /**

Binary file not shown.

56
main.js
View File

@ -28,9 +28,59 @@ export function createApp() {
// #ifdef APP-PLUS // #ifdef APP-PLUS
app.config.globalProperties.$system = plus.os.name; app.config.globalProperties.$system = plus.os.name;
// #endif // #endif
app.config.globalProperties.$systemInfo = systemInfo app.config.globalProperties.$systemInfo = systemInfo;
uni.setStorageSync('version', '1.0.6.sp22') uni.setStorageSync('version', '1.0.6.sp22');
app.config.globalProperties.$version = uni.getStorageSync('version') app.config.globalProperties.$version = uni.getStorageSync('version');
// 环境development→测试production→正式跟构建环境走无需手改
const isTest = process.env.NODE_ENV === 'development';
app.config.globalProperties.$isTest = isTest;
// #ifdef APP-PLUS
const version = plus.runtime.version;
// #endif
const compareVersion = (v1, v2) => {
const a = String(v1).split('.')
const b = String(v2).split('.')
const len = Math.max(a.length, b.length)
for (let i = 0; i < len; i++) {
const n1 = parseInt(a[i] || '0', 10)
const n2 = parseInt(b[i] || '0', 10)
if (n1 > n2) return 1
if (n1 < n2) return -1
}
return 0
}
//安卓和ios
// #ifdef APP-PLUS && !APP-HARMONY
if (plus.os.name == 'iOS') {
if (compareVersion(version, '1.9') >= 0 && !isTest) {
uni.setStorageSync('isTest', false)
} else {
uni.setStorageSync('isTest', true)
}
} else {
if (compareVersion(version, '2.2.0') >= 0 && !isTest) {
uni.setStorageSync('isTest', false)
} else {
uni.setStorageSync('isTest', true)
}
}
// #endif
//鸿蒙
// #ifdef APP-PLUS && APP-HARMONY
if (isTest) {
uni.setStorageSync('isTest', true)
} else {
uni.setStorageSync('isTest', false)
}
// #endif
//h5环境
// #ifndef APP-PLUS
uni.setStorageSync('isTest', true)
// #endif
app.use(globalMethods); app.use(globalMethods);
return { return {
app app

7
package-lock.json generated
View File

@ -8,6 +8,7 @@
"name": "video-player 视频播放器 html5视频播放器-解决频层级、覆盖", "name": "video-player 视频播放器 html5视频播放器-解决频层级、覆盖",
"version": "2.0.0", "version": "2.0.0",
"dependencies": { "dependencies": {
"@batiao/batiao-sdk-uniapp-unimp": "1.0.374",
"crypto-js": "^4.2.0", "crypto-js": "^4.2.0",
"lottie-web": "^5.13.0", "lottie-web": "^5.13.0",
"uuid": "^13.0.0" "uuid": "^13.0.0"
@ -19,6 +20,12 @@
"lint-staged": "^16.4.0" "lint-staged": "^16.4.0"
} }
}, },
"node_modules/@batiao/batiao-sdk-uniapp-unimp": {
"version": "1.0.374",
"resolved": "http://maven.batiao8.com/repository/mpnpm-releases/@batiao/batiao-sdk-uniapp-unimp/-/batiao-sdk-uniapp-unimp-1.0.374.tgz",
"integrity": "sha512-jEQBgTwaZewB2ZzJHYQjWsA4UhZnd7xnSIzUdoYTLKJ3B+gXHmGWSNhJ5MzaXKH3Uxbot2mmWT+TSw8WSZN2Sg==",
"license": "UNLICENSED"
},
"node_modules/@eslint-community/eslint-utils": { "node_modules/@eslint-community/eslint-utils": {
"version": "4.9.1", "version": "4.9.1",
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz",

View File

@ -18,6 +18,7 @@
] ]
}, },
"dependencies": { "dependencies": {
"@batiao/batiao-sdk-uniapp-unimp": "1.0.374",
"crypto-js": "^4.2.0", "crypto-js": "^4.2.0",
"lottie-web": "^5.13.0", "lottie-web": "^5.13.0",
"uuid": "^13.0.0" "uuid": "^13.0.0"

176
test.js

File diff suppressed because one or more lines are too long

View File

@ -7,6 +7,7 @@ import pageData from "@/static/json/page.json"
import { import {
jsonString jsonString
} from "../uni_modules/uv-ui-tools/libs/function/test"; } from "../uni_modules/uv-ui-tools/libs/function/test";
import '@batiao/batiao-sdk-uniapp-unimp';
export default { export default {
install(app, options) { install(app, options) {
@ -156,48 +157,67 @@ export default {
}; };
// 请求 // 请求
app.config.globalProperties.$requestPromise = async (data, isCode = true) => { app.config.globalProperties.$requestPromise = async (data,isCode=true) => {
//头部header let isTest = uni.getStorageSync('isTest')
let header = uni.getStorageSync('header') //头部header浅拷贝避免改到 storage 缓存对象)
let header = { ...(uni.getStorageSync('header') || {}) }
//请求地址 //请求地址
let host = uni.getStorageSync('host') + data.url let host
// #ifdef H5
host = data.url
// #endif
// #ifndef H5
host = uni.getStorageSync('host') + data.url
// #endif
// 签名 // 签名
if (isCode) { if(isCode){
data = sign(data) if(isTest){
} else { data = sign(data)
host = "http://10.3.0.24:9209/" + data.url }
header['x-token'] = "bdf87a98-eef0-47df-9faf-41d547b0457e"
}else{
host="http://10.3.0.24:9209/"+ data.url
header['x-token']="bdf87a98-eef0-47df-9faf-41d547b0457e"
} }
// 排序 // 排序
const sortedKeys = Object.keys(data.data).sort(); const sortedKeys = Object.keys(data.data).sort();
let str = '' let str = ''
for (const key of sortedKeys) { for (const key of sortedKeys) {
if (!(data.url == 'api/image/segment/base64' && key == 'file')) { str += '&' + key + '=' + encodeURIComponent(
str += '&' + key + '=' + encodeURIComponent(data.data[key]); data.data[key] == null ? '' : String(data.data[key])
} );
} }
str = str.replace('&', '?') str = str.replace('&', '?')
host = host + str // 拼接URL
console.log(host) if(isTest){
console.log(data) host = host + str
}
// 鸿蒙 GET/DELETE 若再传 data 会二次拼进 query导致参数异常参数已在 URL 中
let requestData = data.data
// #ifdef APP-HARMONY
const method = (data.method || 'GET').toUpperCase()
if (method === 'GET' || method === 'DELETE') {
requestData = {}
}
// #endif
// 测试环境用 uni.request正式环境用宿主 nativeRequest
const api = isTest
? uni.request
: (uni.nativeRequest || uni.request)
const response = await new Promise((resolve, reject) => { const response = await new Promise((resolve, reject) => {
uni.request({ api({
url: host, url: host,
method: data.method, method: data.method,
data: data.data, data: requestData,
params: requestData,
header, header,
success: res => { success: res => {
console.log(res)
try { try {
if (isCode) { if(isCode&&isTest){
res.data = deCode(res.data.data) res.data = deCode(res.data.data)
console.log(res.data)
} else {
res.data = res.data.data
} }
} catch (err) { } catch (err) {
console.log(err);
} }
resolve(res.data); resolve(res.data);
}, },

View File

@ -4,7 +4,8 @@ import {
} from "../uni_modules/uv-ui-tools/libs/function/index.js"; } from "../uni_modules/uv-ui-tools/libs/function/index.js";
import CryptoJS from "crypto-js"; import CryptoJS from "crypto-js";
// import pageData from "@/static/json/page.json" import '@batiao/batiao-sdk-uniapp-unimp';
import pageData from "@/static/json/page.json";
async function apiUserEvent(type, adminData, uniData) { async function apiUserEvent(type, adminData, uniData) {
let uni_version = uni.getStorageSync("version") let uni_version = uni.getStorageSync("version")
@ -118,61 +119,68 @@ function generateUUID() {
// 主请求函数 // 主请求函数
const request = (method = 'GET', serverUrl, domainUrl, params, dataType = "json") => { const request = (method = 'GET', serverUrl, domainUrl, params, dataType = "json") => {
let isTest = uni.getStorageSync('isTest')
let currentUrl let currentUrl
// try { try {
// let pages = getCurrentPages(); let pages = getCurrentPages();
// let currentPage = pages[pages.length - 2]; let currentPage = pages[pages.length - 2];
// currentUrl = currentPage.route; currentUrl = currentPage.route;
// currentUrl = pageData[currentUrl] currentUrl = pageData[currentUrl]
// } catch (e) { } catch (e) {
// } }
let q = serverUrl let q=serverUrl
// 头部header // 头部header
let header = uni.getStorageSync('header') || {}; let header = uni.getStorageSync('header') || {};
// 请求地址 // 请求地址
serverUrl = uni.getStorageSync('host') || serverUrl; serverUrl = uni.getStorageSync('host') || serverUrl;
if (q == 'test') { if(q=='test'){
serverUrl = "http://10.3.0.24:9209/" serverUrl="http://10.3.0.24:9209/"
header['x-token'] = "bdf87a98-eef0-47df-9faf-41d547b0457e" header['x-token']="bdf87a98-eef0-47df-9faf-41d547b0457e"
} }
let url = domianUrl(serverUrl, domainUrl); let url = domianUrl(serverUrl, domainUrl);
if (q != 'test') { if(q!='test'){
params = deepClone(params); params = deepClone(params);
} }
var key = uni.getStorageSync('encrypt') || "default_encrypt_key"; var key = uni.getStorageSync('encrypt') || "default_encrypt_key";
let data = {}; let data = {};
console.log("传参", method === "GET" || method === "DELETE" || q == 'q') if (method === "GET" || method === "DELETE"||q=='q') {
if (method === "GET" || method === "DELETE" || q == 'q') { let urls = url
params.timestamp = Math.floor(new Date().getTime() / 1000); if(isTest){
params.nonce = generateUUID(); params.timestamp = Math.floor(new Date().getTime() / 1000);
let keys = Object.keys(params); params.nonce = generateUUID();
keys.sort(); let keys = Object.keys(params);
for (let i in keys) { keys.sort();
keys[i] = keys[i] + "=" + encodeURIComponent(params[keys[i]]); for (let i in keys) {
keys[i] = keys[i] + "=" + encodeURIComponent(params[keys[i]]);
}
let temp = keys.join("&") + "&" + CryptoJS.MD5(key).toString();
params.signature = CryptoJS.MD5(temp).toString();
urls = url + "?" + (isTest ? encodeParam(params): encodeParam(params));
} }
let temp = keys.join("&") + "&" + CryptoJS.MD5(key).toString();
params.signature = CryptoJS.MD5(temp).toString();
data = { data = {
url: url + "?" + encodeParam(params), url:urls,
method, method,
data: params,
header: header // setheader(dataType, header), header: header // setheader(dataType, header),
}; };
} else if (method === "POST" || method === "PUT") { } else if (method === "POST" || method === "PUT") {
let temp = decodeParam(url); if(isTest){
temp.timestamp = Math.floor(new Date().getTime() / 1000); let temp = decodeParam(url);
temp.nonce = generateUUID(); temp.timestamp = Math.floor(new Date().getTime() / 1000);
let keys = Object.keys(temp); temp.nonce = generateUUID();
keys.sort(); let keys = Object.keys(temp);
for (let i in keys) { keys.sort();
keys[i] = keys[i] + "=" + encodeURIComponent(temp[keys[i]]); for (let i in keys) {
keys[i] = keys[i] + "=" + encodeURIComponent(temp[keys[i]]);
}
let s = keys.join("&");
s += "&" + JSON.stringify(params);
s += "&" + CryptoJS.MD5(key).toString();
temp.signature = CryptoJS.MD5(s).toString();
url = url.split("?")[0] + "?" + temp;
url = url.split("?")[0] + "?" + encodeParam(temp);
} }
let s = keys.join("&");
s += "&" + JSON.stringify(params);
s += "&" + CryptoJS.MD5(key).toString();
temp.signature = CryptoJS.MD5(s).toString();
url = url.split("?")[0] + "?" + encodeParam(temp);
data = { data = {
url, url,
@ -182,20 +190,21 @@ const request = (method = 'GET', serverUrl, domainUrl, params, dataType = "json"
}; };
} }
console.log("传参详情", data) console.log("传参详情",data)
// 测试环境用 uni.request正式环境用宿主 nativeRequest
const api = isTest
? uni.request
: (uni.nativeRequest || uni.request)
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
uni.request(data).then(res => { api(data).then(res => {
console.log(deCode(res.data.data))
if (res.statusCode == 200) { if (res.statusCode == 200) {
if (res.data.encrypt) { if (res.data.encrypt) {
if (q != 'test') { if(q!='test'&&isTest){
res.data = deCode(res.data.data); res.data = deCode(res.data.data);
} else {
res.data = res.data.data
} }
console.log(res.data)
// res.data = res.data.data
} }
console.log(res.data)
if (res.data.code == 1001003 || res.data.code == 1001004 || res.data.code == 1001005) { if (res.data.code == 1001003 || res.data.code == 1001004 || res.data.code == 1001005) {
uni.hideLoading(); uni.hideLoading();
uni.showToast({ uni.showToast({
@ -205,7 +214,6 @@ const request = (method = 'GET', serverUrl, domainUrl, params, dataType = "json"
return reject(res); return reject(res);
} else if (res.data.code != 0) { } else if (res.data.code != 0) {
if (data.method == 'POST' && domainUrl == 'api/order') { if (data.method == 'POST' && domainUrl == 'api/order') {
apiUserEvent('all', { apiUserEvent('all', {
type: "event", type: "event",
key: "order_fail", key: "order_fail",
@ -227,7 +235,6 @@ const request = (method = 'GET', serverUrl, domainUrl, params, dataType = "json"
title: res.data.message title: res.data.message
}) })
} }
uni.hideLoading(); uni.hideLoading();
return resolve(res); return resolve(res);
} }
@ -249,11 +256,11 @@ const request = (method = 'GET', serverUrl, domainUrl, params, dataType = "json"
} }
}) })
} }
console.log(123)
resolve(res.data); resolve(res.data);
} else { } else {
// InnerApp.addRequestLog(url, data, res) // InnerApp.addRequestLog(url, data, res)
reject(res); resolve(res);
} }
}).catch(err => { }).catch(err => {
if (err.errMsg == 'request:fail timeout') { if (err.errMsg == 'request:fail timeout') {
@ -272,12 +279,26 @@ const request = (method = 'GET', serverUrl, domainUrl, params, dataType = "json"
err: JSON.stringify(err) err: JSON.stringify(err)
} }
}) })
// uni.showModal({
// title: '提示',
// content: JSON.stringify(err),
// success: function (res) {
// if (res.confirm) {
// console.log('用户点击确定');
// } else if (res.cancel) {
// console.log('用户点击取消');
// }
// }
// });
// uniToast('服务器繁忙');
} }
// InnerApp.addRequestLog(url, data, err)
reject(err); reject(err);
}); });
}); });
}; };
/** /**
* 处理请求头 * 处理请求头
* @param dataType 是否json格式 * @param dataType 是否json格式
@ -330,16 +351,15 @@ const setheader = (dataType, baseHeader = {}) => {
* @param domainUrl 接口路径 * @param domainUrl 接口路径
*/ */
const domianUrl = (serveUrl, domainUrl) => { const domianUrl = (serveUrl, domainUrl) => {
let finalUrl=''
// #ifdef H5 // #ifdef H5
// H5环境下使用相对路径走 vite 代理,避免 CORS 跨域问题 // H5环境下使用相对路径走 vite 代理,避免 CORS 跨域问题
const finalUrl = domainUrl.startsWith('/') ? domainUrl : '/' + domainUrl; finalUrl = domainUrl.startsWith('/') ? domainUrl : '/' + domainUrl;
console.log('[H5代理] 原始URL:', domainUrl, '→ 代理URL:', finalUrl); console.log('[H5代理] 原始URL:', domainUrl, '→ 代理URL:', finalUrl);
return finalUrl;
// #endif // #endif
// #ifndef H5 // #ifndef H5
// 非H5环境APP、小程序等使用完整URL // 非H5环境APP、小程序等使用完整URL
let finalUrl;
if (serveUrl.endsWith('/') && domainUrl.startsWith('/')) { if (serveUrl.endsWith('/') && domainUrl.startsWith('/')) {
finalUrl = serveUrl + domainUrl.substring(1); finalUrl = serveUrl + domainUrl.substring(1);
} else if (!serveUrl.endsWith('/') && !domainUrl.startsWith('/')) { } else if (!serveUrl.endsWith('/') && !domainUrl.startsWith('/')) {
@ -348,8 +368,8 @@ const domianUrl = (serveUrl, domainUrl) => {
finalUrl = serveUrl + domainUrl; finalUrl = serveUrl + domainUrl;
} }
console.log('[非H5] 完整URL:', finalUrl); console.log('[非H5] 完整URL:', finalUrl);
return finalUrl;
// #endif // #endif
return finalUrl;
}; };
/** /**