hookehuyr

feat(支付): 新增支付成功后跳转逻辑与状态提示

提取支付成功跳转逻辑为独立工具函数,整合至支付确认页面;添加跳转防重复机制与对应状态文案,处理未找到我的菜单、链接为空及请求失败等异常场景。
......@@ -34,10 +34,12 @@
import { computed, ref, watch } from 'vue'
import { useLoad } from '@tarojs/taro'
import { useWechatMiniPay } from '@/composables/useWechatMiniPay'
import { redirectAfterPaySuccess } from '@/utils/paySuccessRedirect'
const order_id = ref('')
const amount = ref('')
const status_text = ref('')
const navigating_after_pay_success = ref(false)
const {
pay_loading,
......@@ -58,17 +60,50 @@ watch(last_result_text, (value) => {
}
})
const goUserWebviewAfterPaySuccess = async () => {
if (navigating_after_pay_success.value) return
navigating_after_pay_success.value = true
try {
status_text.value = '支付成功,正在跳转...'
const redirect_result = await redirectAfterPaySuccess()
if (redirect_result?.reason === 'missing-user-menu') {
status_text.value = '支付成功,未找到“我的”菜单,正在返回首页...'
return
}
if (redirect_result?.reason === 'empty-user-link') {
status_text.value = '支付成功,但“我的”菜单地址为空,正在返回首页...'
return
}
if (redirect_result?.target === 'home') {
status_text.value = '支付成功,但菜单获取失败,正在返回首页...'
}
} catch (error) {
status_text.value = '支付成功,但菜单获取失败,正在返回首页...'
} finally {
navigating_after_pay_success.value = false
}
}
const handlePay = async () => {
if (!order_id.value || pay_loading.value) return
status_text.value = ''
await pay_by_order_id(order_id.value, {
const pay_res = await pay_by_order_id(order_id.value, {
auto_auth: true,
on_status: (text) => {
status_text.value = text
},
})
if (pay_res?.status === 'success') {
await goUserWebviewAfterPaySuccess()
}
}
useLoad((options) => {
......
import Taro from '@tarojs/taro'
import { getTabbarConfigAPI } from '@/api/tabbar'
import { buildWebviewPreviewUrl } from '@/utils/webview'
/**
* @description 支付成功后跳转到“我的”菜单对应的 WebView;没有 user 菜单则回首页
* @returns {Promise<{ target: 'user-webview' | 'home', reason: 'success' | 'missing-user-menu' | 'empty-user-link' | 'request-failed' }>}
*/
export const redirectAfterPaySuccess = async () => {
try {
const response = await getTabbarConfigAPI()
const user_menu = response?.data?.user
if (!user_menu) {
await Taro.reLaunch({
url: '/pages/index/index',
})
return { target: 'home', reason: 'missing-user-menu' }
}
const user_link = String(user_menu?.link || '').trim()
if (!user_link) {
await Taro.reLaunch({
url: '/pages/index/index',
})
return { target: 'home', reason: 'empty-user-link' }
}
const user_title = String(user_menu?.title || '我的').trim() || '我的'
await Taro.redirectTo({
url: buildWebviewPreviewUrl(user_link, user_title),
})
return { target: 'user-webview', reason: 'success' }
} catch (error) {
console.error('支付成功后跳转目标获取失败:', error)
await Taro.reLaunch({
url: '/pages/index/index',
})
return { target: 'home', reason: 'request-failed' }
}
}