78 lines
2.3 KiB
TypeScript
78 lines
2.3 KiB
TypeScript
import type { LocationQuery, LocationQueryRaw } from 'vue-router'
|
|
import type { SubscriptionPlan } from '@/types/payment'
|
|
import { normalizeVisibleMethod } from '@/components/payment/paymentFlow'
|
|
|
|
export interface ParsedWechatResumeRoute {
|
|
orderAmount: number
|
|
orderType: 'balance' | 'subscription'
|
|
paymentType: string
|
|
planId?: number
|
|
openid?: string
|
|
wechatResumeToken?: string
|
|
}
|
|
|
|
function readQueryString(query: LocationQuery, key: string): string {
|
|
const value = query[key]
|
|
if (Array.isArray(value)) {
|
|
return typeof value[0] === 'string' ? value[0] : ''
|
|
}
|
|
return typeof value === 'string' ? value : ''
|
|
}
|
|
|
|
export function parseWechatResumeRoute(
|
|
query: LocationQuery,
|
|
plans: SubscriptionPlan[],
|
|
fallbackBalanceAmount: number,
|
|
): ParsedWechatResumeRoute | null {
|
|
if (readQueryString(query, 'wechat_resume') !== '1') {
|
|
return null
|
|
}
|
|
|
|
const wechatResumeToken = readQueryString(query, 'wechat_resume_token')
|
|
if (wechatResumeToken) {
|
|
return {
|
|
wechatResumeToken,
|
|
paymentType: 'wxpay',
|
|
orderType: 'balance',
|
|
orderAmount: 0,
|
|
}
|
|
}
|
|
|
|
const openid = readQueryString(query, 'openid')
|
|
if (!openid) {
|
|
return null
|
|
}
|
|
|
|
const paymentType = normalizeVisibleMethod(readQueryString(query, 'payment_type')) || 'wxpay'
|
|
const orderType = readQueryString(query, 'order_type') === 'subscription' ? 'subscription' : 'balance'
|
|
const planId = Number.parseInt(readQueryString(query, 'plan_id'), 10)
|
|
const rawAmount = Number.parseFloat(readQueryString(query, 'amount'))
|
|
const orderAmount = Number.isFinite(rawAmount) && rawAmount > 0
|
|
? rawAmount
|
|
: (orderType === 'subscription'
|
|
? (plans.find(plan => plan.id === planId)?.price ?? 0)
|
|
: fallbackBalanceAmount)
|
|
|
|
return {
|
|
openid,
|
|
paymentType,
|
|
orderType,
|
|
orderAmount,
|
|
planId: Number.isFinite(planId) && planId > 0 ? planId : undefined,
|
|
}
|
|
}
|
|
|
|
export function stripWechatResumeQuery(query: LocationQuery): LocationQueryRaw {
|
|
const nextQuery: LocationQueryRaw = { ...query }
|
|
delete nextQuery.wechat_resume
|
|
delete nextQuery.wechat_resume_token
|
|
delete nextQuery.openid
|
|
delete nextQuery.state
|
|
delete nextQuery.scope
|
|
delete nextQuery.payment_type
|
|
delete nextQuery.amount
|
|
delete nextQuery.order_type
|
|
delete nextQuery.plan_id
|
|
return nextQuery
|
|
}
|