fix wxpay pending order reconciliation

This commit is contained in:
LiuZhouZhouJieLun
2026-05-19 16:56:31 +08:00
parent 2a242aec0f
commit dbd80a0465
9 changed files with 427 additions and 15 deletions
@@ -267,10 +267,15 @@ async function resolveOrderFromResumeToken(resumeToken: string): Promise<Payment
async function resolveOrderFromOutTradeNo(outTradeNo: string): Promise<PaymentOrder | null> {
try {
const result = await paymentAPI.verifyOrderPublic(outTradeNo)
const result = await paymentAPI.verifyOrder(outTradeNo)
return result.data
} catch (_err: unknown) {
return null
try {
const result = await paymentAPI.verifyOrderPublic(outTradeNo)
return result.data
} catch (_innerErr: unknown) {
return null
}
}
}
@@ -7,6 +7,7 @@ const routeState = vi.hoisted(() => ({
const routerPush = vi.hoisted(() => vi.fn())
const pollOrderStatus = vi.hoisted(() => vi.fn())
const verifyOrder = vi.hoisted(() => vi.fn())
const verifyOrderPublic = vi.hoisted(() => vi.fn())
const resolveOrderPublicByResumeToken = vi.hoisted(() => vi.fn())
@@ -37,6 +38,7 @@ vi.mock('@/stores/payment', () => ({
vi.mock('@/api/payment', () => ({
paymentAPI: {
verifyOrder,
verifyOrderPublic,
resolveOrderPublicByResumeToken,
},
@@ -86,6 +88,7 @@ describe('PaymentResultView', () => {
routeState.query = {}
routerPush.mockReset()
pollOrderStatus.mockReset()
verifyOrder.mockReset()
verifyOrderPublic.mockReset()
resolveOrderPublicByResumeToken.mockReset()
window.localStorage.clear()
@@ -329,6 +332,7 @@ describe('PaymentResultView', () => {
out_trade_no: 'legacy-123',
trade_status: 'TRADE_SUCCESS',
}
verifyOrder.mockRejectedValue(new Error('auth required'))
verifyOrderPublic.mockResolvedValue({
data: orderFactory('PAID'),
})
@@ -343,11 +347,36 @@ describe('PaymentResultView', () => {
await flushPromises()
expect(verifyOrder).toHaveBeenCalledWith('legacy-123')
expect(verifyOrderPublic).toHaveBeenCalledWith('legacy-123')
expect(pollOrderStatus).not.toHaveBeenCalled()
expect(wrapper.text()).toContain('payment.result.success')
})
it('prefers authenticated order verification before falling back to public lookup', async () => {
routeState.query = {
out_trade_no: 'auth-verify-123',
trade_status: 'TRADE_SUCCESS',
}
verifyOrder.mockResolvedValue({
data: orderFactory('COMPLETED'),
})
const wrapper = mount(PaymentResultView, {
global: {
stubs: {
OrderStatusBadge: true,
},
},
})
await flushPromises()
expect(verifyOrder).toHaveBeenCalledWith('auth-verify-123')
expect(verifyOrderPublic).not.toHaveBeenCalled()
expect(wrapper.text()).toContain('payment.result.success')
})
it('does not use public out_trade_no verification for bare order numbers without legacy return markers', async () => {
routeState.query = {
out_trade_no: 'legacy-bare',