diff --git a/src/app/api/user/route.ts b/src/app/api/user/route.ts index 824e352..d25d56c 100644 --- a/src/app/api/user/route.ts +++ b/src/app/api/user/route.ts @@ -3,6 +3,7 @@ import { getUser } from '@/lib/sub2api/client'; import { getEnv } from '@/lib/config'; import { queryMethodLimits } from '@/lib/order/limits'; import { initPaymentProviders, paymentRegistry } from '@/lib/payment'; +import { PAYMENT_TYPE_META } from '@/lib/pay-utils'; export async function GET(request: NextRequest) { const userId = Number(request.nextUrl.searchParams.get('user_id')); @@ -16,8 +17,28 @@ export async function GET(request: NextRequest) { const enabledTypes = paymentRegistry.getSupportedTypes(); const [user, methodLimits] = await Promise.all([getUser(userId), queryMethodLimits(enabledTypes)]); - // 收集 sublabel 覆盖(仅包含用户实际配置的项) + // 收集 sublabel 覆盖 const sublabelOverrides: Record = {}; + + // 1. 检测同 label 冲突:多个启用渠道有相同的显示名,自动标记默认 sublabel(provider 名) + const labelCount = new Map(); + for (const type of enabledTypes) { + const meta = PAYMENT_TYPE_META[type]; + if (!meta) continue; + const types = labelCount.get(meta.label) || []; + types.push(type); + labelCount.set(meta.label, types); + } + for (const [, types] of labelCount) { + if (types.length > 1) { + for (const type of types) { + const meta = PAYMENT_TYPE_META[type]; + if (meta) sublabelOverrides[type] = meta.provider; + } + } + } + + // 2. 用户手动配置的 PAYMENT_SUBLABEL_* 优先级最高,覆盖自动生成的 if (env.PAYMENT_SUBLABEL_ALIPAY) sublabelOverrides.alipay = env.PAYMENT_SUBLABEL_ALIPAY; if (env.PAYMENT_SUBLABEL_ALIPAY_DIRECT) sublabelOverrides.alipay_direct = env.PAYMENT_SUBLABEL_ALIPAY_DIRECT; if (env.PAYMENT_SUBLABEL_WXPAY) sublabelOverrides.wxpay = env.PAYMENT_SUBLABEL_WXPAY; diff --git a/src/lib/pay-utils.ts b/src/lib/pay-utils.ts index fee9849..80680ef 100644 --- a/src/lib/pay-utils.ts +++ b/src/lib/pay-utils.ts @@ -92,7 +92,6 @@ export interface PaymentTypeMeta { export const PAYMENT_TYPE_META: Record = { [PAYMENT_TYPE.ALIPAY]: { label: '支付宝', - sublabel: '易支付', provider: '易支付', color: '#00AEEF', selectedBorder: 'border-cyan-400', @@ -104,7 +103,6 @@ export const PAYMENT_TYPE_META: Record = { }, [PAYMENT_TYPE.ALIPAY_DIRECT]: { label: '支付宝', - sublabel: '官方', provider: '支付宝', color: '#1677FF', selectedBorder: 'border-blue-500', @@ -116,7 +114,6 @@ export const PAYMENT_TYPE_META: Record = { }, [PAYMENT_TYPE.WXPAY]: { label: '微信支付', - sublabel: '易支付', provider: '易支付', color: '#2BB741', selectedBorder: 'border-green-500', @@ -128,7 +125,6 @@ export const PAYMENT_TYPE_META: Record = { }, [PAYMENT_TYPE.WXPAY_DIRECT]: { label: '微信支付', - sublabel: '官方', provider: '微信支付', color: '#07C160', selectedBorder: 'border-green-600', @@ -140,7 +136,6 @@ export const PAYMENT_TYPE_META: Record = { }, [PAYMENT_TYPE.STRIPE]: { label: 'Stripe', - sublabel: '信用卡 / 借记卡', provider: 'Stripe', color: '#635bff', selectedBorder: 'border-[#635bff]', @@ -151,11 +146,16 @@ export const PAYMENT_TYPE_META: Record = { }, }; -/** 获取支付方式的显示名称(如 '支付宝(官方)') */ +/** 获取支付方式的显示名称(如 '支付宝(易支付)'),用于管理后台等需要区分的场景 */ export function getPaymentTypeLabel(type: string): string { const meta = PAYMENT_TYPE_META[type]; if (!meta) return type; - return meta.sublabel ? `${meta.label}(${meta.sublabel})` : meta.label; + if (meta.sublabel) return `${meta.label}(${meta.sublabel})`; + // 无 sublabel 时,检查是否有同名渠道需要用 provider 区分 + const hasDuplicate = Object.entries(PAYMENT_TYPE_META).some( + ([k, m]) => k !== type && m.label === meta.label, + ); + return hasDuplicate ? `${meta.label}(${meta.provider})` : meta.label; } /** 获取支付渠道和提供商的结构化信息 */