mi-assessment/uniapp/composables/usePayment.js
zpc 4387b15de0 feat(mine): 完成我的页面改造
- 实现未登录/已登录两种状态样式
- 添加常用功能入口:我的订单、往期测评、联系我们、邀请新用户
- 添加其他功能入口:关于、用户协议、隐私政策、退出登录
- 实现退出登录二次确认弹窗
- 修复 uni.scss 中 SCSS 导入路径问题
- 整理 .gitignore 文件,移除 unpackage 构建目录
2026-02-10 00:12:01 +08:00

159 lines
4.0 KiB
JavaScript

/**
* 支付相关组合式函数
*/
import { ref } from 'vue'
import { createOrder, pay, getPayResult } from '../api/order.js'
/**
* 支付相关功能
* @returns {Object}
*/
export function usePayment() {
const loading = ref(false)
const paymentError = ref('')
/**
* 创建订单
* @param {Object} params - 订单参数
* @param {number} params.productType - 产品类型
* @param {number} params.productId - 产品ID
* @param {Object} [params.userInfo] - 用户信息
* @returns {Promise<Object|null>}
*/
async function handleCreateOrder(params) {
loading.value = true
paymentError.value = ''
try {
const res = await createOrder(params)
if (res.code === 0 && res.data) {
return res.data
}
paymentError.value = res.message || '创建订单失败'
return null
} catch (e) {
paymentError.value = e.message || '创建订单失败'
return null
} finally {
loading.value = false
}
}
/**
* 发起微信支付
* @param {number} orderId - 订单ID
* @returns {Promise<boolean>}
*/
async function handlePay(orderId) {
loading.value = true
paymentError.value = ''
try {
// 获取支付参数
const res = await pay(orderId)
if (res.code !== 0 || !res.data) {
paymentError.value = res.message || '获取支付参数失败'
return false
}
const payParams = res.data
// 调用微信支付
return new Promise((resolve) => {
uni.requestPayment({
provider: 'wxpay',
timeStamp: payParams.timeStamp,
nonceStr: payParams.nonceStr,
package: payParams.package,
signType: payParams.signType || 'MD5',
paySign: payParams.paySign,
success: () => {
resolve(true)
},
fail: (err) => {
if (err.errMsg && err.errMsg.includes('cancel')) {
paymentError.value = '支付已取消'
} else {
paymentError.value = '支付失败'
}
resolve(false)
}
})
})
} catch (e) {
paymentError.value = e.message || '支付失败'
return false
} finally {
loading.value = false
}
}
/**
* 查询支付结果
* @param {number} orderId - 订单ID
* @param {number} [maxRetry=3] - 最大重试次数
* @param {number} [interval=1000] - 重试间隔(毫秒)
* @returns {Promise<Object|null>}
*/
async function checkPayResult(orderId, maxRetry = 3, interval = 1000) {
for (let i = 0; i < maxRetry; i++) {
try {
const res = await getPayResult(orderId)
if (res.code === 0 && res.data) {
if (res.data.paid) {
return res.data
}
}
// 等待后重试
if (i < maxRetry - 1) {
await new Promise(resolve => setTimeout(resolve, interval))
}
} catch (e) {
console.error('查询支付结果失败:', e)
}
}
return null
}
/**
* 完整支付流程
* @param {Object} orderParams - 订单参数
* @returns {Promise<{success: boolean, orderId?: number, error?: string}>}
*/
async function processPayment(orderParams) {
// 1. 创建订单
const order = await handleCreateOrder(orderParams)
if (!order) {
return { success: false, error: paymentError.value }
}
// 2. 发起支付
const paySuccess = await handlePay(order.orderId)
if (!paySuccess) {
return { success: false, orderId: order.orderId, error: paymentError.value }
}
// 3. 查询支付结果
const result = await checkPayResult(order.orderId)
if (result && result.paid) {
return { success: true, orderId: order.orderId }
}
return { success: false, orderId: order.orderId, error: '支付结果确认失败' }
}
return {
loading,
paymentError,
createOrder: handleCreateOrder,
pay: handlePay,
checkPayResult,
processPayment
}
}
export default usePayment