feat(payment): add complete payment system with multi-provider support
Add a full payment and subscription system supporting EasyPay (Alipay/WeChat), Stripe, and direct Alipay/WeChat Pay providers with multi-instance load balancing.
This commit is contained in:
@@ -4182,6 +4182,7 @@ export default {
|
||||
email: 'Email',
|
||||
backup: 'Backup',
|
||||
data: 'Sora Storage',
|
||||
payment: 'Payment',
|
||||
},
|
||||
emailTabDisabledTitle: 'Email Verification Not Enabled',
|
||||
emailTabDisabledHint: 'Enable email verification in the Security tab to configure SMTP settings.',
|
||||
@@ -4425,6 +4426,100 @@ export default {
|
||||
moveUp: 'Move Up',
|
||||
moveDown: 'Move Down',
|
||||
},
|
||||
payment: {
|
||||
title: 'Payment Settings',
|
||||
description: 'Configure payment system options',
|
||||
enabled: 'Enable Payment',
|
||||
enabledHint: 'Enable or disable the payment system',
|
||||
enabledPaymentTypes: 'Enabled Providers',
|
||||
enabledPaymentTypesHint: 'Disabling a provider will also disable its instances',
|
||||
minAmount: 'Minimum Amount',
|
||||
maxAmount: 'Maximum Amount',
|
||||
dailyLimit: 'Daily Limit',
|
||||
orderTimeout: 'Order Timeout',
|
||||
orderTimeoutHint: 'In minutes, minimum 1',
|
||||
maxPendingOrders: 'Max Pending Orders',
|
||||
cancelRateLimit: 'Limit Cancel Rate',
|
||||
cancelRateLimitHint: 'When enabled, users who exceed the cancel limit within the time window cannot create new orders',
|
||||
cancelRateLimitEvery: 'Every',
|
||||
cancelRateLimitAllowMax: 'allow max',
|
||||
cancelRateLimitTimes: 'cancels',
|
||||
cancelRateLimitWindow: 'Window',
|
||||
cancelRateLimitUnit: 'Unit',
|
||||
cancelRateLimitMax: 'Max Cancels',
|
||||
cancelRateLimitUnitMinute: 'Minutes',
|
||||
cancelRateLimitUnitHour: 'Hours',
|
||||
cancelRateLimitUnitDay: 'Days',
|
||||
cancelRateLimitWindowMode: 'Window Mode',
|
||||
cancelRateLimitWindowModeRolling: 'Rolling',
|
||||
cancelRateLimitWindowModeFixed: 'Fixed',
|
||||
helpText: 'Help Text',
|
||||
helpImageUrl: 'Help Image URL',
|
||||
manageProviders: 'Manage Providers',
|
||||
balancePaymentDisabled: 'Disable Balance Recharge',
|
||||
noLimit: 'Empty = no limit',
|
||||
helpImage: 'Help Image',
|
||||
helpImagePlaceholder: 'Upload or enter image URL',
|
||||
helpTextPlaceholder: 'Enter help text...',
|
||||
providerEasypay: 'EasyPay',
|
||||
providerAlipay: 'Alipay (Direct)',
|
||||
providerWxpay: 'WeChat Pay (Direct)',
|
||||
providerStripe: 'Stripe',
|
||||
typeDisabled: 'type disabled',
|
||||
enableTypesFirst: 'Enable at least one payment type above first',
|
||||
easypayRedirect: 'Redirect',
|
||||
paymentMode: 'Payment Mode',
|
||||
modeRedirect: 'Redirect',
|
||||
modeQRCode: 'QR Code',
|
||||
modePopup: 'Popup',
|
||||
validationNameRequired: 'Provider name is required',
|
||||
validationTypesRequired: 'Please select at least one supported payment type',
|
||||
validationFieldRequired: '{field} is required',
|
||||
field_apiBase: 'API Base URL',
|
||||
field_notifyUrl: 'Notify URL',
|
||||
field_returnUrl: 'Return URL',
|
||||
callbackBaseUrl: 'Callback Base URL',
|
||||
field_privateKey: 'Private Key',
|
||||
field_publicKey: 'Public Key',
|
||||
field_mchId: 'Merchant ID',
|
||||
field_apiV3Key: 'API v3 Key',
|
||||
field_publicKeyId: 'Public Key ID',
|
||||
field_certSerial: 'Certificate Serial',
|
||||
field_secretKey: 'Secret Key',
|
||||
field_publishableKey: 'Publishable Key',
|
||||
field_webhookSecret: 'Webhook Secret',
|
||||
field_cid: 'Channel ID',
|
||||
field_cidAlipay: 'Alipay Channel ID',
|
||||
field_cidWxpay: 'WeChat Channel ID',
|
||||
stripeWebhookHint: 'Configure the following URL as a Webhook endpoint in Stripe Dashboard:',
|
||||
limitsTitle: 'Limits',
|
||||
limitSingleMin: 'Min per order',
|
||||
limitSingleMax: 'Max per order',
|
||||
limitDaily: 'Daily limit',
|
||||
limitsHint: 'All empty = use global config; partially filled = empty means no limit',
|
||||
limitsUseGlobal: 'Use global',
|
||||
limitsNoLimit: 'No limit',
|
||||
productNamePrefix: 'Product Name Prefix',
|
||||
productNameSuffix: 'Product Name Suffix',
|
||||
preview: 'Preview',
|
||||
loadBalanceStrategy: 'Load Balance Strategy',
|
||||
strategyRoundRobin: 'Round Robin',
|
||||
strategyLeastAmount: 'Least Daily Amount',
|
||||
providerManagement: 'Provider Management',
|
||||
providerManagementDesc: 'Manage payment provider instances',
|
||||
createProvider: 'Add Provider',
|
||||
editProvider: 'Edit Provider',
|
||||
deleteProvider: 'Delete Provider',
|
||||
deleteProviderConfirm: 'Are you sure you want to delete this provider?',
|
||||
providerName: 'Provider Name',
|
||||
providerKey: 'Provider Type',
|
||||
selectProviderKey: 'Select Provider Type',
|
||||
providerConfig: 'Credentials',
|
||||
noProviders: 'No provider instances configured',
|
||||
supportedTypes: 'Supported Payment Types',
|
||||
supportedTypesHint: 'Comma-separated, e.g. alipay,wxpay',
|
||||
refundEnabled: 'Allow Refund',
|
||||
},
|
||||
smtp: {
|
||||
title: 'SMTP Settings',
|
||||
description: 'Configure email sending for verification codes',
|
||||
@@ -5074,4 +5169,260 @@ export default {
|
||||
}
|
||||
},
|
||||
|
||||
payment: {
|
||||
title: 'Recharge / Subscription',
|
||||
amountLabel: 'Amount',
|
||||
quickAmounts: 'Quick Amounts',
|
||||
customAmount: 'Custom Amount',
|
||||
enterAmount: 'Enter amount',
|
||||
paymentMethod: 'Payment Method',
|
||||
fee: 'Fee',
|
||||
actualPay: 'Actual Payment',
|
||||
createOrder: 'Confirm Payment',
|
||||
methods: {
|
||||
easypay: 'EasyPay',
|
||||
alipay: 'Alipay',
|
||||
wxpay: 'WeChat Pay',
|
||||
stripe: 'Stripe',
|
||||
card: 'Card',
|
||||
link: 'Link',
|
||||
alipay_direct: 'Alipay (Direct)',
|
||||
wxpay_direct: 'WeChat Pay (Direct)',
|
||||
},
|
||||
status: {
|
||||
pending: 'Pending',
|
||||
paid: 'Paid',
|
||||
recharging: 'Recharging',
|
||||
completed: 'Completed',
|
||||
expired: 'Expired',
|
||||
cancelled: 'Cancelled',
|
||||
failed: 'Failed',
|
||||
refund_requested: 'Refund Requested',
|
||||
refunding: 'Refunding',
|
||||
refunded: 'Refunded',
|
||||
partially_refunded: 'Partially Refunded',
|
||||
refund_failed: 'Refund Failed',
|
||||
},
|
||||
qr: {
|
||||
scanToPay: 'Scan to Pay',
|
||||
scanAlipay: 'Alipay QR Payment',
|
||||
scanWxpay: 'WeChat QR Payment',
|
||||
scanAlipayHint: 'Open Alipay on your phone and scan the QR code to pay',
|
||||
scanWxpayHint: 'Open WeChat on your phone and scan the QR code to pay',
|
||||
payInNewWindow: 'Complete Payment in New Window',
|
||||
payInNewWindowHint: 'The payment page has opened in a new window. Please complete the payment there and return to this page.',
|
||||
openPayWindow: 'Reopen Payment Page',
|
||||
expiresIn: 'Expires in',
|
||||
expired: 'Order Expired',
|
||||
expiredDesc: 'This order has expired. Please create a new one.',
|
||||
cancelled: 'Order Cancelled',
|
||||
cancelledDesc: 'You have cancelled this payment.',
|
||||
waitingPayment: 'Waiting for payment...',
|
||||
cancelOrder: 'Cancel Order',
|
||||
},
|
||||
orders: {
|
||||
title: 'My Orders',
|
||||
empty: 'No orders yet',
|
||||
orderId: 'Order ID',
|
||||
orderNo: 'Order No.',
|
||||
amount: 'Amount',
|
||||
payAmount: 'Paid',
|
||||
status: 'Status',
|
||||
paymentMethod: 'Payment Method',
|
||||
createdAt: 'Created',
|
||||
cancel: 'Cancel Order',
|
||||
userId: 'User ID',
|
||||
requestRefund: 'Request Refund',
|
||||
},
|
||||
result: {
|
||||
success: 'Payment Successful',
|
||||
subscriptionSuccess: 'Subscription Successful',
|
||||
failed: 'Payment Failed',
|
||||
backToRecharge: 'Back to Recharge',
|
||||
viewOrders: 'View Orders',
|
||||
},
|
||||
currentBalance: 'Current Balance',
|
||||
rechargeAccount: 'Recharge Account',
|
||||
activeSubscription: 'Active Subscription',
|
||||
noActiveSubscription: 'No active subscription',
|
||||
tabTopUp: 'Top Up',
|
||||
tabSubscribe: 'Subscribe',
|
||||
noPlans: 'No subscription plans available',
|
||||
notAvailable: 'Top-up is currently unavailable',
|
||||
confirmSubscription: 'Confirm Subscription',
|
||||
confirmCancel: 'Are you sure you want to cancel this order?',
|
||||
amountTooLow: 'Minimum amount is {min}',
|
||||
amountTooHigh: 'Maximum amount is {max}',
|
||||
amountNoMethod: 'No payment method available for this amount',
|
||||
refundReason: 'Refund Reason',
|
||||
refundReasonPlaceholder: 'Please describe your refund reason',
|
||||
stripeLoadFailed: 'Failed to load payment component. Please refresh and try again.',
|
||||
stripeMissingParams: 'Missing order ID or client secret',
|
||||
stripeNotConfigured: 'Stripe is not configured',
|
||||
errors: {
|
||||
tooManyPending: 'Too many pending orders (max {max}). Please complete or cancel existing orders first.',
|
||||
cancelRateLimited: 'Too many cancellations. Please try again later.',
|
||||
PENDING_ORDERS: 'This provider has pending orders. Please wait for them to complete before making changes.',
|
||||
},
|
||||
stripePay: 'Pay Now',
|
||||
stripeSuccessProcessing: 'Payment successful, processing your order...',
|
||||
stripePopup: {
|
||||
redirecting: 'Redirecting to payment page...',
|
||||
loadingQr: 'Loading WeChat Pay QR code...',
|
||||
timeout: 'Timed out waiting for payment credentials, please retry',
|
||||
qrFailed: 'Failed to get WeChat Pay QR code',
|
||||
},
|
||||
subscribeNow: 'Subscribe Now',
|
||||
renewNow: 'Renew',
|
||||
selectPlan: 'Select Plan',
|
||||
planFeatures: 'Features',
|
||||
planCard: {
|
||||
rate: 'Rate',
|
||||
dailyLimit: 'Daily',
|
||||
weeklyLimit: 'Weekly',
|
||||
monthlyLimit: 'Monthly',
|
||||
quota: 'Quota',
|
||||
unlimited: 'Unlimited',
|
||||
models: 'Models',
|
||||
},
|
||||
days: 'days',
|
||||
months: 'months',
|
||||
years: 'years',
|
||||
oneMonth: '1 Month',
|
||||
oneYear: '1 Year',
|
||||
perMonth: 'month',
|
||||
perYear: 'year',
|
||||
admin: {
|
||||
tabs: {
|
||||
overview: 'Overview',
|
||||
orders: 'Orders',
|
||||
channels: 'Channels',
|
||||
plans: 'Plans',
|
||||
},
|
||||
todayRevenue: 'Today Revenue',
|
||||
totalRevenue: 'Total Revenue',
|
||||
todayOrders: 'Today Orders',
|
||||
orderCount: 'Order Count',
|
||||
avgAmount: 'Average Amount',
|
||||
revenue: 'Revenue',
|
||||
dailyRevenue: 'Daily Revenue',
|
||||
paymentDistribution: 'Payment Distribution',
|
||||
colUser: 'User',
|
||||
topUsers: 'Top Users',
|
||||
noData: 'No data',
|
||||
days: 'days',
|
||||
weeks: 'weeks',
|
||||
months: 'months',
|
||||
searchOrders: 'Search orders...',
|
||||
allStatuses: 'All Statuses',
|
||||
allPaymentTypes: 'All Payment Types',
|
||||
allOrderTypes: 'All Order Types',
|
||||
orderDetail: 'Order Detail',
|
||||
orderType: 'Order Type',
|
||||
orders: 'Orders',
|
||||
balanceOrder: 'Balance Top-Up',
|
||||
subscriptionOrder: 'Subscription',
|
||||
paidAt: 'Paid At',
|
||||
completedAt: 'Completed At',
|
||||
expiresAt: 'Expires At',
|
||||
feeRate: 'Fee Rate',
|
||||
refund: 'Refund',
|
||||
refundOrder: 'Refund Order',
|
||||
refundAmount: 'Refund Amount',
|
||||
maxRefundable: 'Max Refundable',
|
||||
refundReason: 'Refund Reason',
|
||||
refundReasonPlaceholder: 'Please enter refund reason',
|
||||
confirmRefund: 'Confirm Refund',
|
||||
refundSuccess: 'Refund successful',
|
||||
refundInfo: 'Refund Info',
|
||||
refundEnabled: 'Refund Enabled',
|
||||
alreadyRefunded: 'Already Refunded',
|
||||
deductBalance: 'Deduct Balance',
|
||||
deductBalanceHint: 'Subtract recharged amount from user balance',
|
||||
userBalance: 'User Balance',
|
||||
orderAmount: 'Order Amount',
|
||||
insufficientBalance: 'Insufficient balance — will deduct to $0',
|
||||
noDeduction: 'Will NOT deduct user balance',
|
||||
forceRefund: 'Force refund (ignore balance check)',
|
||||
orderCancelled: 'Order Cancelled',
|
||||
retry: 'Retry',
|
||||
retrySuccess: 'Retry successful',
|
||||
approveRefund: 'Approve Refund',
|
||||
retryRefund: 'Retry Refund',
|
||||
refundRequestInfo: 'Refund Request Info',
|
||||
refundRequestedAt: 'Requested At',
|
||||
refundRequestedBy: 'Requested By',
|
||||
refundRequestReason: 'Request Reason',
|
||||
auditLogs: 'Audit Logs',
|
||||
operator: 'Operator',
|
||||
channelName: 'Channel Name',
|
||||
channelDescription: 'Channel Description',
|
||||
createChannel: 'Create Channel',
|
||||
editChannel: 'Edit Channel',
|
||||
deleteChannel: 'Delete Channel',
|
||||
deleteChannelConfirm: 'Are you sure you want to delete this channel?',
|
||||
planName: 'Plan Name',
|
||||
planDescription: 'Plan Description',
|
||||
createPlan: 'Create Plan',
|
||||
editPlan: 'Edit Plan',
|
||||
deletePlan: 'Delete Plan',
|
||||
deletePlanConfirm: 'Are you sure you want to delete this plan?',
|
||||
originalPrice: 'Original Price',
|
||||
price: 'Price',
|
||||
validityDays: 'Validity (days)',
|
||||
validityUnit: 'Validity Unit',
|
||||
sortOrder: 'Sort Order',
|
||||
forSale: 'For Sale',
|
||||
onSale: 'On Sale',
|
||||
offSale: 'Off Sale',
|
||||
group: 'Group',
|
||||
groupId: 'Group ID',
|
||||
features: 'Features',
|
||||
featuresHint: 'One feature per line',
|
||||
featuresPlaceholder: 'Enter plan features...',
|
||||
providerManagement: 'Provider Management',
|
||||
providerManagementDesc: 'Manage payment provider instances',
|
||||
createProvider: 'Create Provider',
|
||||
editProvider: 'Edit Provider',
|
||||
deleteProvider: 'Delete Provider',
|
||||
deleteProviderConfirm: 'Are you sure you want to delete this provider?',
|
||||
providerName: 'Provider Name',
|
||||
providerKey: 'Provider Key',
|
||||
selectProviderKey: 'Select Provider Key',
|
||||
providerConfig: 'Provider Config',
|
||||
noProviders: 'No providers configured',
|
||||
noProvidersHint: 'Create a provider instance to start accepting payments',
|
||||
supportedTypes: 'Supported Payment Types',
|
||||
supportedTypesHint: 'Select the payment types this provider supports',
|
||||
rateMultiplier: 'Rate Multiplier',
|
||||
dashboardTitle: 'Payment Dashboard',
|
||||
dashboardDesc: 'Recharge order analytics and insights',
|
||||
daySuffix: 'd',
|
||||
paymentConfigTitle: 'Payment Config',
|
||||
paymentConfigDesc: 'Configure payment providers and settings',
|
||||
plansPageTitle: 'Subscription Plans',
|
||||
plansPageDesc: 'Manage subscription plan configuration',
|
||||
tabPlanConfig: 'Plan Configuration',
|
||||
tabUserSubs: 'User Subscriptions',
|
||||
selectGroup: 'Select a group',
|
||||
groupMissing: 'Missing',
|
||||
groupInfo: 'Group Info',
|
||||
platform: 'Platform',
|
||||
rateMultiplierLabel: 'Rate',
|
||||
dailyLimit: 'Daily Limit',
|
||||
weeklyLimit: 'Weekly Limit',
|
||||
monthlyLimit: 'Monthly Limit',
|
||||
unlimited: 'Unlimited',
|
||||
searchUserSubs: 'Search user subscriptions...',
|
||||
daily: 'D',
|
||||
weekly: 'W',
|
||||
monthly: 'M',
|
||||
subsStatus: {
|
||||
active: 'Active',
|
||||
expired: 'Expired',
|
||||
revoked: 'Revoked',
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
}
|
||||
|
||||
@@ -4347,6 +4347,7 @@ export default {
|
||||
email: '邮件设置',
|
||||
backup: '数据备份',
|
||||
data: 'Sora 存储',
|
||||
payment: '支付设置',
|
||||
},
|
||||
emailTabDisabledTitle: '邮箱验证未启用',
|
||||
emailTabDisabledHint: '请在「安全与认证」选项卡中启用邮箱验证后,再配置 SMTP 设置。',
|
||||
@@ -4589,6 +4590,100 @@ export default {
|
||||
moveUp: '上移',
|
||||
moveDown: '下移',
|
||||
},
|
||||
payment: {
|
||||
title: '支付设置',
|
||||
description: '配置支付系统选项',
|
||||
enabled: '启用支付',
|
||||
enabledHint: '启用或禁用支付系统',
|
||||
enabledPaymentTypes: '启用的服务商',
|
||||
enabledPaymentTypesHint: '禁用服务商将同时禁用对应的实例',
|
||||
minAmount: '最低金额',
|
||||
maxAmount: '最高金额',
|
||||
dailyLimit: '每日限额',
|
||||
orderTimeout: '订单超时时间',
|
||||
orderTimeoutHint: '单位:分钟,至少 1 分钟',
|
||||
maxPendingOrders: '最大待支付订单数',
|
||||
cancelRateLimit: '限制取消频率',
|
||||
cancelRateLimitHint: '启用后,用户在时间窗口内取消订单次数超限将无法创建新订单',
|
||||
cancelRateLimitEvery: '每',
|
||||
cancelRateLimitAllowMax: '最多',
|
||||
cancelRateLimitTimes: '次',
|
||||
cancelRateLimitWindow: '时间窗口',
|
||||
cancelRateLimitUnit: '周期',
|
||||
cancelRateLimitMax: '最大取消次数',
|
||||
cancelRateLimitUnitMinute: '分钟',
|
||||
cancelRateLimitUnitHour: '小时',
|
||||
cancelRateLimitUnitDay: '天',
|
||||
cancelRateLimitWindowMode: '窗口模式',
|
||||
cancelRateLimitWindowModeRolling: '滚动',
|
||||
cancelRateLimitWindowModeFixed: '固定',
|
||||
helpText: '帮助文本',
|
||||
helpImageUrl: '帮助图片链接',
|
||||
manageProviders: '管理服务商',
|
||||
balancePaymentDisabled: '禁用余额充值',
|
||||
noLimit: '留空表示不限制',
|
||||
helpImage: '帮助图片',
|
||||
helpImagePlaceholder: '上传或输入图片链接',
|
||||
helpTextPlaceholder: '输入帮助说明文本...',
|
||||
providerEasypay: '易支付',
|
||||
providerAlipay: '支付宝官方',
|
||||
providerWxpay: '微信官方',
|
||||
providerStripe: 'Stripe',
|
||||
typeDisabled: '类型已禁用',
|
||||
enableTypesFirst: '请先在上方启用至少一种服务商',
|
||||
easypayRedirect: '跳转',
|
||||
paymentMode: '支付模式',
|
||||
modeRedirect: '跳转',
|
||||
modeQRCode: '二维码',
|
||||
modePopup: '弹窗',
|
||||
validationNameRequired: '服务商名称不能为空',
|
||||
validationTypesRequired: '请至少选择一种支持的支付方式',
|
||||
validationFieldRequired: '{field} 不能为空',
|
||||
field_apiBase: 'API 基础地址',
|
||||
field_notifyUrl: '异步通知地址',
|
||||
field_returnUrl: '同步跳转地址',
|
||||
callbackBaseUrl: '回调基础地址',
|
||||
field_privateKey: '私钥',
|
||||
field_publicKey: '公钥',
|
||||
field_mchId: '商户号',
|
||||
field_apiV3Key: 'API v3 密钥',
|
||||
field_publicKeyId: '公钥 ID',
|
||||
field_certSerial: '证书序列号',
|
||||
field_secretKey: '密钥',
|
||||
field_publishableKey: '公开密钥',
|
||||
field_webhookSecret: 'Webhook 密钥',
|
||||
field_cid: '支付渠道 ID',
|
||||
field_cidAlipay: '支付宝渠道 ID',
|
||||
field_cidWxpay: '微信渠道 ID',
|
||||
stripeWebhookHint: '请在 Stripe Dashboard 中将以下地址配置为 Webhook 端点:',
|
||||
limitsTitle: '限额配置',
|
||||
limitSingleMin: '单笔最低',
|
||||
limitSingleMax: '单笔最高',
|
||||
limitDaily: '每日限额',
|
||||
limitsHint: '全部留空使用全局配置,部分填写时留空项表示不限制',
|
||||
limitsUseGlobal: '使用全局配置',
|
||||
limitsNoLimit: '不限制',
|
||||
productNamePrefix: '商品名前缀',
|
||||
productNameSuffix: '商品名后缀',
|
||||
preview: '预览',
|
||||
loadBalanceStrategy: '负载均衡策略',
|
||||
strategyRoundRobin: '轮询',
|
||||
strategyLeastAmount: '最少金额',
|
||||
providerManagement: '服务商管理',
|
||||
providerManagementDesc: '管理支付服务商实例',
|
||||
createProvider: '添加服务商',
|
||||
editProvider: '编辑服务商',
|
||||
deleteProvider: '删除服务商',
|
||||
deleteProviderConfirm: '确定要删除此服务商吗?',
|
||||
providerName: '服务商名称',
|
||||
providerKey: '服务商类型',
|
||||
selectProviderKey: '选择服务商类型',
|
||||
providerConfig: '凭证配置',
|
||||
noProviders: '暂无服务商实例',
|
||||
supportedTypes: '支持的支付方式',
|
||||
supportedTypesHint: '逗号分隔,如 alipay,wxpay',
|
||||
refundEnabled: '允许退款',
|
||||
},
|
||||
smtp: {
|
||||
title: 'SMTP 设置',
|
||||
description: '配置用于发送验证码的邮件服务',
|
||||
@@ -5262,4 +5357,260 @@ export default {
|
||||
}
|
||||
},
|
||||
|
||||
payment: {
|
||||
title: '充值/订阅',
|
||||
amountLabel: '充值金额',
|
||||
quickAmounts: '快捷金额',
|
||||
customAmount: '自定义金额',
|
||||
enterAmount: '输入金额',
|
||||
paymentMethod: '支付方式',
|
||||
fee: '手续费',
|
||||
actualPay: '实付金额',
|
||||
createOrder: '确认支付',
|
||||
methods: {
|
||||
easypay: '易支付',
|
||||
alipay: '支付宝',
|
||||
wxpay: '微信支付',
|
||||
stripe: 'Stripe',
|
||||
card: '银行卡',
|
||||
link: 'Link',
|
||||
alipay_direct: '支付宝(直连)',
|
||||
wxpay_direct: '微信支付(直连)',
|
||||
},
|
||||
status: {
|
||||
pending: '待支付',
|
||||
paid: '已支付',
|
||||
recharging: '充值中',
|
||||
completed: '已完成',
|
||||
expired: '已过期',
|
||||
cancelled: '已取消',
|
||||
failed: '失败',
|
||||
refund_requested: '退款申请中',
|
||||
refunding: '退款中',
|
||||
refunded: '已退款',
|
||||
partially_refunded: '部分退款',
|
||||
refund_failed: '退款失败',
|
||||
},
|
||||
qr: {
|
||||
scanToPay: '请扫码支付',
|
||||
scanAlipay: '支付宝扫码支付',
|
||||
scanWxpay: '微信扫码支付',
|
||||
scanAlipayHint: '请使用手机打开支付宝,扫描二维码完成支付',
|
||||
scanWxpayHint: '请使用手机打开微信,扫描二维码完成支付',
|
||||
payInNewWindow: '请在新窗口中完成支付',
|
||||
payInNewWindowHint: '支付页面已在新窗口打开,请在新窗口中完成支付后返回此页面',
|
||||
openPayWindow: '重新打开支付页面',
|
||||
expiresIn: '剩余支付时间',
|
||||
expired: '订单已过期',
|
||||
expiredDesc: '订单已超时,请重新创建订单',
|
||||
cancelled: '订单已取消',
|
||||
cancelledDesc: '您已取消本次支付',
|
||||
waitingPayment: '等待支付...',
|
||||
cancelOrder: '取消订单',
|
||||
},
|
||||
orders: {
|
||||
title: '我的订单',
|
||||
empty: '暂无订单',
|
||||
orderId: '订单 ID',
|
||||
orderNo: '订单编号',
|
||||
amount: '金额',
|
||||
payAmount: '实付',
|
||||
status: '状态',
|
||||
paymentMethod: '支付方式',
|
||||
createdAt: '创建时间',
|
||||
cancel: '取消订单',
|
||||
userId: '用户 ID',
|
||||
requestRefund: '申请退款',
|
||||
},
|
||||
result: {
|
||||
success: '支付成功',
|
||||
subscriptionSuccess: '订阅成功',
|
||||
failed: '支付失败',
|
||||
backToRecharge: '返回充值',
|
||||
viewOrders: '查看订单',
|
||||
},
|
||||
currentBalance: '当前余额',
|
||||
rechargeAccount: '充值账户',
|
||||
activeSubscription: '当前订阅',
|
||||
noActiveSubscription: '暂无有效订阅',
|
||||
tabTopUp: '充值',
|
||||
tabSubscribe: '订阅',
|
||||
noPlans: '暂无可用订阅套餐',
|
||||
notAvailable: '充值功能暂未开放',
|
||||
confirmSubscription: '确认订阅',
|
||||
confirmCancel: '确定要取消此订单吗?',
|
||||
amountTooLow: '最低金额为 {min}',
|
||||
amountTooHigh: '最高金额为 {max}',
|
||||
amountNoMethod: '该金额没有可用的支付方式',
|
||||
refundReason: '退款原因',
|
||||
refundReasonPlaceholder: '请描述您的退款原因',
|
||||
stripeLoadFailed: '支付组件加载失败,请刷新页面重试',
|
||||
stripeMissingParams: '缺少订单ID或支付密钥',
|
||||
stripeNotConfigured: 'Stripe 未配置',
|
||||
errors: {
|
||||
tooManyPending: '待支付订单过多(最多 {max} 个),请先完成或取消现有订单',
|
||||
cancelRateLimited: '取消订单过于频繁,请稍后再试',
|
||||
PENDING_ORDERS: '该服务商有未完成的订单,请等待订单完成后再操作',
|
||||
},
|
||||
stripePay: '立即支付',
|
||||
stripeSuccessProcessing: '支付成功,正在处理订单...',
|
||||
stripePopup: {
|
||||
redirecting: '正在跳转到支付页面...',
|
||||
loadingQr: '正在获取微信支付二维码...',
|
||||
timeout: '等待支付凭证超时,请重试',
|
||||
qrFailed: '未能获取微信支付二维码',
|
||||
},
|
||||
subscribeNow: '立即开通',
|
||||
renewNow: '续费',
|
||||
selectPlan: '选择套餐',
|
||||
planFeatures: '功能特性',
|
||||
planCard: {
|
||||
rate: '倍率',
|
||||
dailyLimit: '日限额',
|
||||
weeklyLimit: '周限额',
|
||||
monthlyLimit: '月限额',
|
||||
quota: '配额',
|
||||
unlimited: '无限制',
|
||||
models: '模型',
|
||||
},
|
||||
days: '天',
|
||||
months: '个月',
|
||||
years: '年',
|
||||
oneMonth: '1 个月',
|
||||
oneYear: '1 年',
|
||||
perMonth: '月',
|
||||
perYear: '年',
|
||||
admin: {
|
||||
tabs: {
|
||||
overview: '概览',
|
||||
orders: '订单管理',
|
||||
channels: '支付渠道',
|
||||
plans: '订阅套餐',
|
||||
},
|
||||
todayRevenue: '今日收入',
|
||||
totalRevenue: '总收入',
|
||||
todayOrders: '今日订单',
|
||||
orderCount: '订单数',
|
||||
avgAmount: '平均金额',
|
||||
revenue: '收入',
|
||||
dailyRevenue: '每日收入',
|
||||
paymentDistribution: '支付方式分布',
|
||||
colUser: '用户',
|
||||
topUsers: '消费排行',
|
||||
noData: '暂无数据',
|
||||
days: '天',
|
||||
weeks: '周',
|
||||
months: '月',
|
||||
searchOrders: '搜索订单...',
|
||||
allStatuses: '全部状态',
|
||||
allPaymentTypes: '全部支付方式',
|
||||
allOrderTypes: '全部订单类型',
|
||||
orderDetail: '订单详情',
|
||||
orderType: '订单类型',
|
||||
orders: '订单',
|
||||
balanceOrder: '余额充值',
|
||||
subscriptionOrder: '订阅',
|
||||
paidAt: '支付时间',
|
||||
completedAt: '完成时间',
|
||||
expiresAt: '过期时间',
|
||||
feeRate: '手续费率',
|
||||
refund: '退款',
|
||||
refundOrder: '退款订单',
|
||||
refundAmount: '退款金额',
|
||||
maxRefundable: '最大可退金额',
|
||||
refundReason: '退款原因',
|
||||
refundReasonPlaceholder: '请输入退款原因',
|
||||
confirmRefund: '确认退款',
|
||||
refundSuccess: '退款成功',
|
||||
refundInfo: '退款信息',
|
||||
refundEnabled: '允许退款',
|
||||
alreadyRefunded: '已退款',
|
||||
deductBalance: '扣除余额',
|
||||
deductBalanceHint: '从用户余额中扣回充值金额',
|
||||
userBalance: '用户余额',
|
||||
orderAmount: '订单金额',
|
||||
insufficientBalance: '余额不足,将扣至 $0',
|
||||
noDeduction: '将不扣除用户余额',
|
||||
forceRefund: '强制退款(忽略余额检查)',
|
||||
orderCancelled: '订单已取消',
|
||||
retry: '重试',
|
||||
retrySuccess: '重试成功',
|
||||
approveRefund: '批准退款',
|
||||
retryRefund: '重试退款',
|
||||
refundRequestInfo: '退款申请信息',
|
||||
refundRequestedAt: '申请时间',
|
||||
refundRequestedBy: '申请人',
|
||||
refundRequestReason: '申请原因',
|
||||
auditLogs: '操作日志',
|
||||
operator: '操作人',
|
||||
channelName: '渠道名称',
|
||||
channelDescription: '渠道描述',
|
||||
createChannel: '创建渠道',
|
||||
editChannel: '编辑渠道',
|
||||
deleteChannel: '删除渠道',
|
||||
deleteChannelConfirm: '确定要删除此渠道吗?',
|
||||
planName: '套餐名称',
|
||||
planDescription: '套餐描述',
|
||||
createPlan: '创建套餐',
|
||||
editPlan: '编辑套餐',
|
||||
deletePlan: '删除套餐',
|
||||
deletePlanConfirm: '确定要删除此套餐吗?',
|
||||
originalPrice: '原价',
|
||||
price: '价格',
|
||||
validityDays: '有效期(天)',
|
||||
validityUnit: '有效期单位',
|
||||
sortOrder: '排序',
|
||||
forSale: '上架状态',
|
||||
onSale: '上架',
|
||||
offSale: '下架',
|
||||
group: '分组',
|
||||
groupId: '分组 ID',
|
||||
features: '功能特性',
|
||||
featuresHint: '每行一个特性',
|
||||
featuresPlaceholder: '输入套餐特性...',
|
||||
providerManagement: '服务商管理',
|
||||
providerManagementDesc: '管理支付服务商实例',
|
||||
createProvider: '创建服务商',
|
||||
editProvider: '编辑服务商',
|
||||
deleteProvider: '删除服务商',
|
||||
deleteProviderConfirm: '确定要删除此服务商吗?',
|
||||
providerName: '服务商名称',
|
||||
providerKey: '服务商标识',
|
||||
selectProviderKey: '选择服务商标识',
|
||||
providerConfig: '服务商配置',
|
||||
noProviders: '暂无服务商',
|
||||
noProvidersHint: '创建一个服务商实例以开始接受支付',
|
||||
supportedTypes: '支持的支付方式',
|
||||
supportedTypesHint: '选择此服务商支持的支付方式',
|
||||
rateMultiplier: '费率倍数',
|
||||
dashboardTitle: '支付概览',
|
||||
dashboardDesc: '充值订单统计与分析',
|
||||
daySuffix: '天',
|
||||
paymentConfigTitle: '支付配置',
|
||||
paymentConfigDesc: '管理支付服务商与相关设置',
|
||||
plansPageTitle: '订阅套餐管理',
|
||||
plansPageDesc: '管理订阅套餐配置',
|
||||
tabPlanConfig: '套餐配置',
|
||||
tabUserSubs: '用户订阅',
|
||||
selectGroup: '请选择分组',
|
||||
groupMissing: '缺失',
|
||||
groupInfo: '分组信息',
|
||||
platform: '平台',
|
||||
rateMultiplierLabel: '倍率',
|
||||
dailyLimit: '日限额',
|
||||
weeklyLimit: '周限额',
|
||||
monthlyLimit: '月限额',
|
||||
unlimited: '无限制',
|
||||
searchUserSubs: '搜索用户订阅...',
|
||||
daily: '日',
|
||||
weekly: '周',
|
||||
monthly: '月',
|
||||
subsStatus: {
|
||||
active: '生效中',
|
||||
expired: '已过期',
|
||||
revoked: '已撤销',
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user