const { APP_API_BASE_URL, WECHAT_APP_ID } = require('../config/env.js') const TOKEN_KEY = 'qipai_access_token' function request(path, options = {}) { return new Promise((resolve, reject) => { const token = wx.getStorageSync(TOKEN_KEY) wx.request({ url: `${APP_API_BASE_URL}${path}`, method: options.method || 'GET', data: options.data, header: { 'x-wechat-appid': WECHAT_APP_ID, ...(token ? { authorization: `Bearer ${token}` } : {}), ...(options.headers || {}), }, success(response) { if (response.statusCode >= 200 && response.statusCode < 300) { resolve(response.data) return } reject(new Error(response.data?.message || `请求失败:${response.statusCode}`)) }, fail: reject, }) }) } function uploadImage(path, filePath, headers = {}) { return new Promise((resolve, reject) => { const token = wx.getStorageSync(TOKEN_KEY) wx.getFileSystemManager().readFile({ filePath, success(result) { wx.request({ url: `${APP_API_BASE_URL}${path}`, method: 'POST', data: result.data, header: { 'x-wechat-appid': WECHAT_APP_ID, 'x-file-name': filePath.split('/').pop() || `cleaning-${Date.now()}.jpg`, 'x-image-content-type': guessImageType(filePath), 'content-type': 'application/octet-stream', ...(token ? { authorization: `Bearer ${token}` } : {}), ...(headers || {}), }, success(response) { if (response.statusCode >= 200 && response.statusCode < 300) { try { resolve(typeof response.data === 'string' ? JSON.parse(response.data) : response.data) } catch (error) { reject(error) } return } reject(new Error(response.data?.message || `上传失败:${response.statusCode}`)) }, fail: reject, }) }, fail: reject, }) }) } function login() { return new Promise((resolve, reject) => { wx.login({ success: async ({ code }) => { try { const response = await request('/auth/wechat-login', { method: 'POST', data: { code }, }) wx.setStorageSync(TOKEN_KEY, response.data.accessToken) resolve(response.data) } catch (error) { reject(error) } }, fail: reject, }) }) } function ensureLogin() { const token = wx.getStorageSync(TOKEN_KEY) if (token) return Promise.resolve({ accessToken: token }) return login() } function clearSession() { wx.removeStorageSync(TOKEN_KEY) } function cents(value) { return `¥${((Number(value || 0)) / 100).toFixed(2)}` } function clientRequestId(prefix) { return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}` } function requestWechatPayment(params) { return new Promise((resolve, reject) => { if (!params || !params.timeStamp || !params.nonceStr || !params.package || !params.paySign) { reject(new Error('微信支付参数不完整')) return } wx.requestPayment({ timeStamp: String(params.timeStamp), nonceStr: params.nonceStr, package: params.package, signType: params.signType || 'RSA', paySign: params.paySign, success: resolve, fail: reject, }) }) } function guessImageType(filePath) { const lower = String(filePath || '').toLowerCase() if (lower.endsWith('.png')) return 'image/png' if (lower.endsWith('.webp')) return 'image/webp' return 'image/jpeg' } module.exports = { request, uploadImage, login, ensureLogin, clearSession, cents, clientRequestId, requestWechatPayment, }