139 lines
3.7 KiB
JavaScript
139 lines
3.7 KiB
JavaScript
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,
|
|
}
|