fix(h5/cashier): 支付发起后立即同步锁定态,避免同页仍可切换支付项

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
bootx
2026-07-22 17:33:35 +08:00
parent 91543117ce
commit 4ce75af6e8
2 changed files with 75 additions and 0 deletions

View File

@@ -407,6 +407,36 @@ async function handleJsapi(payload: string) {
startPoll(orderNo)
}
/**
* 支付发起成功后同步锁定态
*
* 后端已将订单置为 paying 并写入 method, 需刷新 locked 以禁用切换其他项;
* 刷新失败时兜底把当前选中项标为 locked, 避免同页仍可点选
*/
async function syncLockedPayMethods() {
const currentId = selectId.value
try {
payMethods.value = await listCashierItems({
orderNo,
cashierType: 'h5',
clientEnv: clientEnvParam,
})
if (lockedItemId.value) {
selectId.value = lockedItemId.value
}
}
catch {
// 刷新失败: 本地兜底锁定当前选中项
if (currentId) {
payMethods.value = payMethods.value.map(item => ({
...item,
locked: item.id === currentId,
}))
selectId.value = currentId
}
}
}
/**
* 发起收银台支付
*/
@@ -414,6 +444,10 @@ async function pay() {
if (paying.value || paid.value || !selectId.value || expired.value) {
return
}
// 本地已锁定时禁止用非锁定项发起支付
if (lockedItemId.value && selectId.value !== lockedItemId.value) {
return
}
paying.value = true
showQrcode.value = false
qrContent.value = ''
@@ -437,6 +471,10 @@ async function pay() {
openId,
})
const action = resolvePayResult(result)
// 未直接成功时同步锁定态(JSAPI 取消/二维码等仍停留本页的场景)
if (action.type !== 'success') {
await syncLockedPayMethods()
}
switch (action.type) {
case 'success':
order.value.status = 'paid'

View File

@@ -238,10 +238,43 @@ async function loadPage() {
}
}
/**
* 支付发起成功后同步锁定态
*
* 后端已将订单置为 paying 并写入 method, 需刷新 locked 以禁用切换其他项;
* 刷新失败时兜底把当前选中项标为 locked, 避免同页仍可点选
*/
async function syncLockedPayMethods() {
const currentId = selectId.value
try {
payMethods.value = await listCashierItems({
orderNo,
cashierType: 'web',
})
if (lockedItemId.value) {
selectId.value = lockedItemId.value
}
}
catch {
// 刷新失败: 本地兜底锁定当前选中项
if (currentId) {
payMethods.value = payMethods.value.map(item => ({
...item,
locked: item.id === currentId,
}))
selectId.value = currentId
}
}
}
async function pay() {
if (paying.value || paid.value || !selectId.value || expired.value) {
return
}
// 本地已锁定时禁止用非锁定项发起支付
if (lockedItemId.value && selectId.value !== lockedItemId.value) {
return
}
paying.value = true
payError.value = ''
showQrcode.value = false
@@ -254,6 +287,10 @@ async function pay() {
device: 'pc',
})
const action = resolvePayResult(result)
// 未直接成功时同步锁定态(取消/二维码等仍停留本页的场景)
if (action.type !== 'success') {
await syncLockedPayMethods()
}
switch (action.type) {
case 'success':
order.value.status = 'paid'