修复订单列表不显示 source_type=3 订单的问题,支持对对碰等玩法订单 优化订单标题显示逻辑,移除内部标识并添加保底显示 优化订单详情页,当没有实物商品时显示活动信息 重构订单类型判断逻辑,支持更多玩法类型
128 lines
3.6 KiB
JavaScript
128 lines
3.6 KiB
JavaScript
/**
|
||
* 通用支付流程工具函数
|
||
*
|
||
* 用于统一 一番赏、无限赏、对对碰 三种玩法的支付流程
|
||
*/
|
||
|
||
import { createWechatOrder } from '../api/appUser'
|
||
|
||
/**
|
||
* 从API响应中提取订单号
|
||
* @param {Object} res - API 响应
|
||
* @returns {string|null}
|
||
*/
|
||
export function extractOrderNo(res) {
|
||
if (!res) return null
|
||
return res.order_no || res.orderNo || res.data?.order_no || res.data?.orderNo || res.result?.order_no || res.result?.orderNo || null
|
||
}
|
||
|
||
/**
|
||
* 执行微信支付流程
|
||
*
|
||
* @param {Object} options
|
||
* @param {string} options.orderNo - 订单号(必须)
|
||
* @param {string} [options.openid] - 用户 openid(可选,默认从 storage 读取)
|
||
* @returns {Promise<void>} - 支付完成(成功)时 resolve,取消或失败时 reject
|
||
*/
|
||
export async function doWechatPayment({ orderNo, openid }) {
|
||
if (!orderNo) {
|
||
throw new Error('订单号不能为空')
|
||
}
|
||
|
||
const finalOpenid = openid || uni.getStorageSync('openid')
|
||
if (!finalOpenid) {
|
||
throw new Error('缺少OpenID,请重新登录')
|
||
}
|
||
|
||
// 1. 获取微信支付参数
|
||
const payRes = await createWechatOrder({ openid: finalOpenid, order_no: orderNo })
|
||
if (!payRes || !payRes.package) {
|
||
throw new Error('获取支付参数失败')
|
||
}
|
||
|
||
// 2. 调起微信支付
|
||
return new Promise((resolve, reject) => {
|
||
uni.requestPayment({
|
||
provider: 'wxpay',
|
||
timeStamp: payRes.timeStamp || payRes.timestamp,
|
||
nonceStr: payRes.nonceStr || payRes.noncestr,
|
||
package: payRes.package,
|
||
signType: payRes.signType || 'RSA',
|
||
paySign: payRes.paySign,
|
||
success: resolve,
|
||
fail: (err) => {
|
||
if (err?.errMsg && String(err.errMsg).includes('cancel')) {
|
||
const cancelErr = new Error('支付已取消')
|
||
cancelErr.cancelled = true
|
||
reject(cancelErr)
|
||
} else {
|
||
reject(err)
|
||
}
|
||
}
|
||
})
|
||
})
|
||
}
|
||
|
||
/**
|
||
* 完整支付流程(创建订单 + 支付)
|
||
*
|
||
* @param {Object} options
|
||
* @param {Function} options.createOrder - 创建订单的函数,返回 Promise,结果需包含 order_no
|
||
* @param {string} [options.openid] - 用户 openid
|
||
* @param {Function} [options.onOrderCreated] - 订单创建后的回调,参数为 (orderNo, response)
|
||
* @returns {Promise<{orderNo: string, orderResponse: any}>}
|
||
*/
|
||
export async function executePaymentFlow({ createOrder, openid, onOrderCreated }) {
|
||
// 1. 创建订单
|
||
const orderResponse = await createOrder()
|
||
const orderNo = extractOrderNo(orderResponse)
|
||
|
||
if (!orderNo) {
|
||
throw new Error('未获取到订单号')
|
||
}
|
||
|
||
// 2. 回调通知(用于保存游戏数据等)
|
||
if (typeof onOrderCreated === 'function') {
|
||
await onOrderCreated(orderNo, orderResponse)
|
||
}
|
||
|
||
// 3. 执行支付
|
||
await doWechatPayment({ orderNo, openid })
|
||
|
||
return { orderNo, orderResponse }
|
||
}
|
||
|
||
/**
|
||
* 检查登录状态
|
||
* @returns {{ok: boolean, openid?: string, message?: string}}
|
||
*/
|
||
export function checkLoginStatus() {
|
||
const token = uni.getStorageSync('token')
|
||
const phoneBound = !!uni.getStorageSync('phone_bound')
|
||
const openid = uni.getStorageSync('openid')
|
||
|
||
if (!token || !phoneBound) {
|
||
return { ok: false, message: '请先登录并绑定手机号' }
|
||
}
|
||
if (!openid) {
|
||
return { ok: false, message: '缺少OpenID,请重新登录' }
|
||
}
|
||
return { ok: true, openid }
|
||
}
|
||
|
||
/**
|
||
* 显示登录提示弹窗
|
||
*/
|
||
export function showLoginPrompt() {
|
||
uni.showModal({
|
||
title: '提示',
|
||
content: '请先登录并绑定手机号',
|
||
confirmText: '去登录',
|
||
success: (res) => {
|
||
if (res.confirm) {
|
||
uni.navigateTo({ url: '/pages/login/index' })
|
||
}
|
||
}
|
||
})
|
||
}
|