fix payment visible methods and resume recovery
This commit is contained in:
@@ -142,10 +142,11 @@ onMounted(async () => {
|
||||
const resumeToken = typeof route.query.resume_token === 'string'
|
||||
? route.query.resume_token
|
||||
: ''
|
||||
let orderId = Number(route.query.order_id) || 0
|
||||
const routeOrderId = Number(route.query.order_id) || 0
|
||||
const outTradeNo = String(route.query.out_trade_no || '')
|
||||
let orderId = 0
|
||||
|
||||
if (!orderId && resumeToken && typeof window !== 'undefined') {
|
||||
if (resumeToken && typeof window !== 'undefined') {
|
||||
const restored = readPaymentRecoverySnapshot(
|
||||
window.localStorage.getItem(PAYMENT_RECOVERY_STORAGE_KEY),
|
||||
{ resumeToken },
|
||||
@@ -155,17 +156,31 @@ onMounted(async () => {
|
||||
}
|
||||
}
|
||||
|
||||
if (!order.value && !orderId && resumeToken) {
|
||||
if (!order.value && resumeToken && orderId) {
|
||||
try {
|
||||
const result = await paymentAPI.resolveOrderPublicByResumeToken(resumeToken)
|
||||
order.value = result.data
|
||||
orderId = result.data.id
|
||||
order.value = await paymentStore.pollOrderStatus(orderId)
|
||||
} catch (_err: unknown) {
|
||||
// Resume token recovery failed, continue to legacy fallback paths.
|
||||
// Fall through to signed resume-token recovery below.
|
||||
}
|
||||
}
|
||||
|
||||
if (!order.value && orderId) {
|
||||
if (!order.value && resumeToken) {
|
||||
try {
|
||||
const result = await paymentAPI.resolveOrderPublicByResumeToken(resumeToken)
|
||||
order.value = result.data
|
||||
if (!orderId) {
|
||||
orderId = result.data.id
|
||||
}
|
||||
} catch (_err: unknown) {
|
||||
// Resume token recovery failed; do not trust legacy public out_trade_no fallback.
|
||||
}
|
||||
}
|
||||
|
||||
if (!resumeToken) {
|
||||
orderId = routeOrderId
|
||||
}
|
||||
|
||||
if (!order.value && !resumeToken && orderId) {
|
||||
try {
|
||||
order.value = await paymentStore.pollOrderStatus(orderId)
|
||||
} catch (_err: unknown) {
|
||||
@@ -173,7 +188,8 @@ onMounted(async () => {
|
||||
}
|
||||
}
|
||||
|
||||
if (!order.value && outTradeNo) {
|
||||
const hasLegacyFallbackContext = Boolean(route.query.trade_status || route.query.money || route.query.type)
|
||||
if (!order.value && !resumeToken && !orderId && outTradeNo && hasLegacyFallbackContext) {
|
||||
returnInfo.value = {
|
||||
outTradeNo,
|
||||
money: String(route.query.money || ''),
|
||||
@@ -191,14 +207,6 @@ onMounted(async () => {
|
||||
} catch (_e: unknown) { /* fall through */ }
|
||||
}
|
||||
}
|
||||
|
||||
if (!order.value && orderId) {
|
||||
try {
|
||||
order.value = await paymentStore.pollOrderStatus(orderId)
|
||||
} catch (_err: unknown) {
|
||||
// Order lookup failed, will show returnInfo fallback.
|
||||
}
|
||||
}
|
||||
loading.value = false
|
||||
})
|
||||
</script>
|
||||
|
||||
@@ -76,6 +76,7 @@ describe('PaymentResultView', () => {
|
||||
it('restores order id from a matching resume token and does not trust query success flags', async () => {
|
||||
routeState.query = {
|
||||
resume_token: 'resume-42',
|
||||
order_id: '999',
|
||||
status: 'success',
|
||||
}
|
||||
window.localStorage.setItem(PAYMENT_RECOVERY_STORAGE_KEY, JSON.stringify({
|
||||
@@ -110,6 +111,29 @@ describe('PaymentResultView', () => {
|
||||
expect(wrapper.text()).not.toContain('payment.result.success')
|
||||
})
|
||||
|
||||
it('does not fall back to public out_trade_no verification when resume_token recovery fails', async () => {
|
||||
routeState.query = {
|
||||
resume_token: 'resume-fail',
|
||||
out_trade_no: 'legacy-should-not-run',
|
||||
trade_status: 'TRADE_SUCCESS',
|
||||
}
|
||||
resolveOrderPublicByResumeToken.mockRejectedValueOnce(new Error('resume failed'))
|
||||
|
||||
mount(PaymentResultView, {
|
||||
global: {
|
||||
stubs: {
|
||||
OrderStatusBadge: true,
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
await flushPromises()
|
||||
|
||||
expect(resolveOrderPublicByResumeToken).toHaveBeenCalledWith('resume-fail')
|
||||
expect(verifyOrderPublic).not.toHaveBeenCalled()
|
||||
expect(verifyOrder).not.toHaveBeenCalled()
|
||||
})
|
||||
|
||||
it('keeps legacy out_trade_no verification as a fallback when no order context is available', async () => {
|
||||
routeState.query = {
|
||||
out_trade_no: 'legacy-123',
|
||||
|
||||
Reference in New Issue
Block a user