支付完成后跳转群消息

This commit is contained in:
yml
2026-06-18 16:06:39 +08:00
parent 275663c4ea
commit a0b5ed2efb
5 changed files with 42 additions and 13 deletions
@@ -32,7 +32,7 @@ export function useMobilePaymentCashier() {
confirmButtonText: '知道了',
})
},
paidMessage: '支付成功,等待号主交接',
paidMessage: '支付成功,正在进入群消息',
pollIntervalMs: 2500,
qrWidth: 220,
openExternalURL: url => {
@@ -61,7 +61,7 @@ export interface UseOrderActionsOptions {
/**
* 打开收银台 UI(二维码弹窗 / App 浏览器跳转)。由调用方注入。
* 仅在 payment 未支付时被调用;payment 已支付的情况由 composable 自行提示并 loadOrder。
* onPaid:支付完成(轮询发现 paid)时的回调,通常传入 loadOrder
* onPaid:支付完成(轮询发现 paid)时的回调,通常跳转到群消息
*/
startCashier: (payment: PaymentOrder, onPaid: () => Promise<void>) => void | Promise<void>
/** 修改结账提交成功后触发(如关闭弹窗)。可选。 */
@@ -270,11 +270,11 @@ export function useOrderActions(options: UseOrderActionsOptions) {
try {
const payment = await startOrderPayment(order.value.id, { pay_way: payWay })
if (payment.paid) {
options.notifySuccess('支付成功,等待号主交接')
await loadOrder()
options.notifySuccess('支付成功,正在进入群消息')
await openOrderChatAfterPayment()
return
}
await options.startCashier(payment, loadOrder)
await options.startCashier(payment, openOrderChatAfterPayment)
} catch (error) {
options.notifyError(readError(error, '支付失败'))
} finally {
@@ -520,12 +520,30 @@ export function useOrderActions(options: UseOrderActionsOptions) {
async function openOrderChat() {
if (!order.value || openingChat.value) return
await navigateToOrderChat(order.value.id, '订单群聊暂不可用')
}
async function openOrderChatAfterPayment() {
if (!order.value) return
const opened = await navigateToOrderChat(
order.value.id,
'支付成功,但群消息暂不可用,请稍后从消息进入'
)
if (!opened) {
await loadOrder()
}
}
async function navigateToOrderChat(orderID: number, errorMessage: string) {
if (openingChat.value) return false
openingChat.value = true
try {
const chat = await fetchOrderChat(order.value.id)
const chat = await fetchOrderChat(orderID)
await router.push(`${options.chatPathPrefix}${chat.id}`)
return true
} catch {
options.notifyError('订单群聊暂不可用')
options.notifyError(errorMessage)
return false
} finally {
openingChat.value = false
}
@@ -28,7 +28,7 @@ export interface UseOrderPaymentCashierOptions {
* Mobile 用 vant dialog(带"知道了"按钮)做强提示,PC 用普通提示即可。
*/
notifyFallback: (message: string) => void
/** 支付完成的提示文案,默认 "支付成功,等待号主交接"。 */
/** 支付完成的提示文案,默认 "支付成功,正在进入群消息"。 */
paidMessage?: string
/** 轮询间隔,PC 3000 / Mobile 2500。 */
pollIntervalMs?: number
@@ -60,7 +60,7 @@ export function useOrderPaymentCashier(options: UseOrderPaymentCashierOptions) {
const pollIntervalMs = options.pollIntervalMs ?? 2500
const qrWidth = options.qrWidth ?? 220
const paidMessage = options.paidMessage ?? '支付成功,等待号主交接'
const paidMessage = options.paidMessage ?? '支付成功,正在进入群消息'
const payURL = computed(() => paymentPayURL(activePayment.value))
@@ -13,6 +13,7 @@ import {
} from '@/features/orders/api/orders'
import MobilePaymentCashierPopup from '@/features/orders/components/MobilePaymentCashierPopup.vue'
import { useMobilePaymentCashier } from '@/features/orders/composables/useMobilePaymentCashier'
import { fetchOrderChat } from '@/features/chats/api/chats'
import { centToYuan, formatMoney } from '@/shared/utils/money'
import { useSessionStore } from '@/stores/session'
import { formatDateMinute } from '@/shared/utils/time'
@@ -100,10 +101,10 @@ async function handlePay(order: Order) {
try {
const payment = await startOrderPayment(order.id, { pay_way: payWay })
if (payment.paid) {
showToast({ message: '支付成功,等待号主交接', icon: 'passed' })
await loadOrders()
showToast({ message: '支付成功,正在进入群消息', icon: 'passed' })
await openOrderChatAfterPayment(order)
} else {
await openMobilePaymentCashier(payment, loadOrders)
await openMobilePaymentCashier(payment, () => openOrderChatAfterPayment(order))
}
} catch (error) {
showToast({ message: readError(error, '支付失败'), icon: 'cross' })
@@ -112,6 +113,16 @@ async function handlePay(order: Order) {
}
}
async function openOrderChatAfterPayment(order: Order) {
try {
const chat = await fetchOrderChat(order.id)
await router.push(`/m/chats/${chat.id}`)
} catch {
showToast({ message: '支付成功,但群消息暂不可用,请稍后从消息进入', icon: 'warning-o' })
await loadOrders()
}
}
// selectPayWay 在列表快捷支付前让用户选择支付宝或微信。
async function selectPayWay(): Promise<PaymentPayWay | null> {
try {
@@ -23,7 +23,7 @@ const cashier = useOrderPaymentCashier({
notifyError: message => ElMessage.error(message),
notifyInfo: message => ElMessage.info(message),
notifyFallback: message => ElMessage.warning(message),
paidMessage: '支付成功,等待号主交接',
paidMessage: '支付成功,正在进入群消息',
pollIntervalMs: 3000,
qrWidth: 240,
})