"use strict"; const common_vendor = require("../common/vendor.js"); const ENV = "prod"; const CONFIG = { dev: "http://localhost:8081", // 开发环境 local: "http://192.168.1.171:8081", prod: "https://www.whzhangsheng.cn/applet-api" // 生产环境 }; const BASE_URL = CONFIG[ENV]; const getImageUrl = (url) => { if (!url) return ""; if (url.startsWith("wxfile://") || url.startsWith("http://tmp/") || url.includes("/tmp/wx")) { console.warn("[getImageUrl] 检测到微信临时路径,无法显示:", url); return ""; } if (url.startsWith("http")) { return url; } if (url.startsWith("/static/images/")) { return BASE_URL + url.replace("/static/images/", "/images/"); } return BASE_URL + url; }; const getToken = () => { return common_vendor.index.getStorageSync("user_token") || null; }; const request = (options) => { return new Promise((resolve, reject) => { const token = getToken(); const header = options.header || {}; if (token) { header["Authorization"] = `Bearer ${token}`; } const publicApis = [ "/v1/stock/pool/list", "/v1/order/config" ]; const isPublicApi = publicApis.some((api) => options.url.includes(api)); common_vendor.index.request({ url: `${BASE_URL}${options.url}`, method: options.method || "GET", data: options.data || {}, header, success: (res) => { const newToken = res.header["New-Token"] || res.header["new-token"]; if (newToken) { console.log("检测到新token,自动续期"); common_vendor.index.setStorageSync("user_token", newToken); } if (res.statusCode === 200) { resolve(res.data); } else if (res.statusCode === 401) { if (isPublicApi) { reject(new Error("未授权")); return; } common_vendor.index.showToast({ title: "登录已过期,请重新登录", icon: "none", duration: 2e3 }); common_vendor.index.removeStorageSync("user_token"); common_vendor.index.removeStorageSync("user_info"); setTimeout(() => { common_vendor.index.showModal({ title: "登录提示", content: "登录已过期,请重新登录", confirmText: "去登录", cancelText: "取消", success: (modalRes) => { if (modalRes.confirm) { common_vendor.index.navigateTo({ url: "/pages/login/login" }); } } }); }, 2e3); reject(new Error("未授权")); } else { reject(new Error(res.data.message || "服务暂不可用")); } }, fail: () => { reject(new Error("网络异常")); } }); }); }; const wxSilentLoginApi = (params) => { return request({ url: "/v1/auth/wx/silent-login", method: "POST", header: { "content-type": "application/json" }, data: params }); }; const wxPhoneLoginApi = (params) => { return request({ url: "/v1/auth/wx/phone-verify", method: "POST", header: { "content-type": "application/json" }, data: params }); }; const wxCompleteUserInfoApi = (params) => { return request({ url: "/v1/auth/wx/register", method: "POST", header: { "content-type": "application/json" }, data: params }); }; const getUserInfoApi = () => { return request({ url: "/v1/user/info", method: "GET" }); }; const uploadFile = { url: `${BASE_URL}/v1/file/upload` }; const updateUserProfile = (data) => { return request({ url: "/v1/user/profile", method: "PUT", header: { "content-type": "application/json" }, data }); }; const getSuggestions = (keyword) => { return request({ url: "/v1/stock/suggestion", method: "GET", data: { keyword } }); }; const searchStocks = (keyword) => { return request({ url: "/v1/stock/search", method: "POST", header: { "content-type": "application/json" }, data: { keyword } }); }; const getStockQuotes = (codes) => { return request({ url: "/api/stock/fetch", method: "GET", data: { codes } }); }; const getIndexQuote = (code) => { return request({ url: "/api/stock/index", method: "GET", data: { code } }); }; const getUserStocks = () => { return request({ url: "/v1/user/stock/list", method: "GET" }); }; const addUserStock = (data) => { return request({ url: "/v1/user/stock/add", method: "POST", header: { "content-type": "application/json" }, data }); }; const deleteUserStock = (stockCode) => { return request({ url: `/v1/user/stock/delete?stockCode=${encodeURIComponent(stockCode)}`, method: "DELETE" }); }; const getStockPoolList = (poolType) => { return request({ url: "/v1/stock/pool/list", method: "GET", data: { poolType } }); }; const getPaymentConfig = (poolType) => { return request({ url: "/v1/order/config", method: "GET", data: { poolType } }); }; const createOrder = (data) => { return request({ url: "/v1/order/create", method: "POST", header: { "content-type": "application/json" }, data }); }; const queryOrder = (orderNo) => { return request({ url: "/v1/order/query", method: "GET", data: { orderNo } }); }; const getUserOrders = () => { return request({ url: "/v1/order/list", method: "GET" }); }; const repayOrder = (orderNo) => { return request({ url: `/v1/order/repay?orderNo=${encodeURIComponent(orderNo)}`, method: "POST" }); }; const checkSubscription = (poolType) => { return request({ url: "/v1/order/check-subscription", method: "GET", data: { poolType } }); }; const wxPay = (payParams) => { const totalFee = payParams.total_fee || payParams.totalFee; console.log("调起支付,参数:", JSON.stringify(payParams), "totalFee:", totalFee); if (!totalFee) { console.error("缺少 total_fee 参数,payParams:", payParams); } return new Promise((resolve, reject) => { common_vendor.index.requestPayment({ provider: "wxpay", timeStamp: payParams.timeStamp, nonceStr: payParams.nonceStr, package: payParams.packageValue, signType: payParams.signType, paySign: payParams.paySign, totalFee, // 开发者工具模拟支付需要 success: (res) => { resolve(res); }, fail: (err) => { console.log("支付失败:", err); if (err.errMsg && err.errMsg.includes("cancel")) { reject(new Error("用户取消支付")); } else { reject(new Error("支付失败:" + (err.errMsg || JSON.stringify(err)))); } } }); }); }; const getStockHistory = (params) => { return request({ url: "/v1/stock/history/list", method: "GET", data: params }); }; const getStockHistoryStats = (params) => { return request({ url: "/v1/stock/history/stats", method: "GET", data: params }); }; const searchStockHistory = (keyword, recordDate) => { const data = { keyword }; if (recordDate) { data.recordDate = recordDate; } return request({ url: "/v1/stock/history/search", method: "GET", data }); }; const submitFeedback = (data) => { console.log("[submitFeedback] 开始提交反馈,数据:", data); return request({ url: "/v1/user/feedback/submit", method: "POST", header: { "content-type": "application/json" }, data }); }; const uploadFeedbackImage = { url: `${BASE_URL}/v1/file/upload` }; exports.BASE_URL = BASE_URL; exports.addUserStock = addUserStock; exports.checkSubscription = checkSubscription; exports.createOrder = createOrder; exports.deleteUserStock = deleteUserStock; exports.getImageUrl = getImageUrl; exports.getIndexQuote = getIndexQuote; exports.getPaymentConfig = getPaymentConfig; exports.getStockHistory = getStockHistory; exports.getStockHistoryStats = getStockHistoryStats; exports.getStockPoolList = getStockPoolList; exports.getStockQuotes = getStockQuotes; exports.getSuggestions = getSuggestions; exports.getUserInfoApi = getUserInfoApi; exports.getUserOrders = getUserOrders; exports.getUserStocks = getUserStocks; exports.queryOrder = queryOrder; exports.repayOrder = repayOrder; exports.searchStockHistory = searchStockHistory; exports.searchStocks = searchStocks; exports.submitFeedback = submitFeedback; exports.updateUserProfile = updateUserProfile; exports.uploadFeedbackImage = uploadFeedbackImage; exports.uploadFile = uploadFile; exports.wxCompleteUserInfoApi = wxCompleteUserInfoApi; exports.wxPay = wxPay; exports.wxPhoneLoginApi = wxPhoneLoginApi; exports.wxSilentLoginApi = wxSilentLoginApi;