feat: resolve payment results by resume token

This commit is contained in:
IanShaw027
2026-04-20 20:53:46 +08:00
parent c0b24aefba
commit 9bebf1c1a6
7 changed files with 225 additions and 1 deletions

View File

@@ -150,7 +150,17 @@ onMounted(async () => {
}
}
if (orderId) {
if (!order.value && !orderId && resumeToken) {
try {
const result = await paymentAPI.resolveOrderPublicByResumeToken(resumeToken)
order.value = result.data
orderId = result.data.id
} catch (_err: unknown) {
// Resume token recovery failed, continue to legacy fallback paths.
}
}
if (!order.value && orderId) {
try {
order.value = await paymentStore.pollOrderStatus(orderId)
} catch (_err: unknown) {

View File

@@ -9,6 +9,7 @@ const routerPush = vi.hoisted(() => vi.fn())
const pollOrderStatus = vi.hoisted(() => vi.fn())
const verifyOrderPublic = vi.hoisted(() => vi.fn())
const verifyOrder = vi.hoisted(() => vi.fn())
const resolveOrderPublicByResumeToken = vi.hoisted(() => vi.fn())
vi.mock('vue-router', async () => {
const actual = await vi.importActual<typeof import('vue-router')>('vue-router')
@@ -39,6 +40,7 @@ vi.mock('@/api/payment', () => ({
paymentAPI: {
verifyOrderPublic,
verifyOrder,
resolveOrderPublicByResumeToken,
},
}))
@@ -67,6 +69,7 @@ describe('PaymentResultView', () => {
pollOrderStatus.mockReset()
verifyOrderPublic.mockReset()
verifyOrder.mockReset()
resolveOrderPublicByResumeToken.mockReset()
window.localStorage.clear()
})
@@ -129,4 +132,27 @@ describe('PaymentResultView', () => {
expect(verifyOrderPublic).toHaveBeenCalledWith('legacy-123')
expect(wrapper.text()).toContain('payment.result.success')
})
it('resolves order by resume token when local recovery snapshot is missing', async () => {
routeState.query = {
resume_token: 'resume-77',
}
resolveOrderPublicByResumeToken.mockResolvedValue({
data: orderFactory('PAID'),
})
const wrapper = mount(PaymentResultView, {
global: {
stubs: {
OrderStatusBadge: true,
},
},
})
await flushPromises()
expect(resolveOrderPublicByResumeToken).toHaveBeenCalledWith('resume-77')
expect(wrapper.text()).toContain('payment.result.success')
expect(verifyOrderPublic).not.toHaveBeenCalled()
})
})