import { relogin } from "../core/auth/server/server-auth"; import { getCommonParams } from "../store/models/params.model"; import UserInfoModel from "../store/models/user.model"; import { decryptData, generateSign } from "./encrypted"; interface ApiOptions { url: string; data?: any; method?: 'GET' | 'POST' } interface ApiResponse { code: number; data: any; message: string; } const api = async ({ url, data, method = 'GET' }: ApiOptions): Promise => { try { return await request({ url, data, method }) } catch (error) { // 如果是401错误,尝试重新登录 if (error.code === 401) { console.log("登录过期,尝试重新登录..."); try { // 调用重新登录方法 await relogin(); console.log("重新登录成功,重新发起请求..."); // 重新获取登录信息 const newLoginInfo = UserInfoModel.getInstance().get(); // 重新发起请求 return new Promise((resolve, reject) => { wx.request({ url: url, header: { "Content-Type": "application/x-www-form-urlencoded", Authorization: `Bearer ${newLoginInfo.token}`, }, method: method, data, success: (res: any) => { if (res.statusCode === 200) { const responseData = res.data as ApiResponse; if (responseData.code === 200) { // 解密响应数据 responseData.data = decryptData(responseData.data); resolve(responseData.data); } else { reject({ code: responseData.code, msg: responseData.message, }); } } else { reject({ code: -1, msg: `网络请求失败 ${res.statusCode}`, }); } }, fail: (error) => { reject({ code: -1, msg: error.errMsg, }); }, }); }); } catch (loginError) { console.error("重新登录失败:", loginError); // 重新登录失败,返回原始错误 throw error; } } else { // 其他错误直接抛出 throw error; } } } const request = async ({ url, data, method = 'GET' }: ApiOptions): Promise => { return new Promise((resolve, reject) => { const token = UserInfoModel.getInstance().getToken(); const commonParams = getCommonParams() let params = { ...commonParams, ...data } params = generateSign(params) // signParams.sign = sign wx.request({ url, data: params, method, header: { "Content-Type": "application/x-www-form-urlencoded", Authorization: `Bearer ${token}` }, success: (res: any) => { if (res.statusCode === 200) { const responseData = res.data as ApiResponse; if (responseData.code === 200) { responseData.data = decryptData(responseData.data); resolve(responseData.data); } else if (responseData.code === 401) { reject({ code: 401, msg: responseData.message, }); } else { // wx.showModal({ // title: "网络错误", // icon:"none", // showCancel:false, // content: `${url}:${responseData.message}`, // }) // reject({ // code: responseData.code, // msg: responseData.message, // }); } return responseData; } else { reject({ code: -1, msg: `network error ${res.message}`, }); } }, fail: (error) => { reject({ code: -1, msg: `network error ${error.errMsg}`, }); }, }); }) } const get = (url: string, data?: any): Promise => { return api({ url: `${import.meta.env.SDK_API_BASE}${url}`, data, method: 'GET' }) } const post = (url: string, data?: any): Promise => { return api({ url: `${import.meta.env.SDK_API_BASE}${url}`, data, method: 'POST' }) } export default { get, post }