fix(frontend): stabilize wechat payment resume recovery
This commit is contained in:
@@ -409,6 +409,43 @@ async function redirectToPaymentResult(state: PaymentRecoverySnapshot): Promise<
|
||||
})
|
||||
}
|
||||
|
||||
function buildWechatOAuthAuthorizeUrl(
|
||||
authorizeUrl: string,
|
||||
context: { paymentType: string; orderType: OrderType; planId?: number; orderAmount: number },
|
||||
): string {
|
||||
const normalizedUrl = authorizeUrl.trim()
|
||||
if (!normalizedUrl || typeof window === 'undefined') {
|
||||
return normalizedUrl
|
||||
}
|
||||
|
||||
try {
|
||||
const targetUrl = new URL(normalizedUrl, window.location.origin)
|
||||
const redirectPath = targetUrl.searchParams.get('redirect') || '/purchase'
|
||||
const redirectUrl = new URL(redirectPath, window.location.origin)
|
||||
const paymentType = normalizeVisibleMethod(context.paymentType) || context.paymentType.trim() || 'wxpay'
|
||||
|
||||
redirectUrl.searchParams.set('payment_type', paymentType)
|
||||
redirectUrl.searchParams.set('order_type', context.orderType)
|
||||
|
||||
if (context.planId) {
|
||||
redirectUrl.searchParams.set('plan_id', String(context.planId))
|
||||
} else {
|
||||
redirectUrl.searchParams.delete('plan_id')
|
||||
}
|
||||
|
||||
if (context.orderAmount > 0) {
|
||||
redirectUrl.searchParams.set('amount', String(context.orderAmount))
|
||||
} else {
|
||||
redirectUrl.searchParams.delete('amount')
|
||||
}
|
||||
|
||||
targetUrl.searchParams.set('redirect', `${redirectUrl.pathname}${redirectUrl.search}`)
|
||||
return targetUrl.toString()
|
||||
} catch {
|
||||
return normalizedUrl
|
||||
}
|
||||
}
|
||||
|
||||
function onPaymentDone() {
|
||||
const wasSubscription = paymentState.value.orderType === 'subscription'
|
||||
resetPayment()
|
||||
@@ -676,7 +713,12 @@ async function createOrder(orderAmount: number, orderType: OrderType, planId?: n
|
||||
})
|
||||
|
||||
if (decision.kind === 'wechat_oauth' && decision.oauth?.authorize_url) {
|
||||
window.location.href = decision.oauth.authorize_url
|
||||
window.location.href = buildWechatOAuthAuthorizeUrl(decision.oauth.authorize_url, {
|
||||
paymentType: visibleMethod,
|
||||
orderType,
|
||||
planId,
|
||||
orderAmount,
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user