mi-assessment/uniapp/composables/usePayment.js
zpc 7a54c91154 feat(assessment): 连接个人信息页与答题页数据流
- 新增 PendingRecordDto 模型,支持查询进行中的测评记录
- 后端新增 GetPendingRecord 接口,支持断点续答
- 邀请码路径改为调用 createOrder 创建订单和测评记录
- info 页面加载时检测未完成测评,支持继续上次或重新开始
- questions 页面改用 recordId 提交答案,匹配后端接口
- usePayment 返回 assessmentRecordId 供页面传递
2026-02-23 00:06:24 +08:00

161 lines
4.3 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 支付相关组合式函数
*/
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.orderType - 订单类型1测评订单 2规划订单
* @param {number} params.productId - 产品ID
* @param {Object} [params.assessmentInfo] - 测评信息(测评订单时必填)
* @param {Object} [params.plannerInfo] - 规划预约信息(规划订单时必填)
* @param {number} [params.inviteCodeId] - 邀请码ID
* @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, assessmentRecordId: order.assessmentRecordId }
}
return { success: false, orderId: order.orderId, error: '支付结果确认失败' }
}
return {
loading,
paymentError,
createOrder: handleCreateOrder,
pay: handlePay,
checkPayResult,
processPayment
}
}
export default usePayment