From c6815fc2a3be0aab8c36106e10087d45283b29bc Mon Sep 17 00:00:00 2001 From: erio Date: Sun, 1 Mar 2026 22:51:09 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=8F=92=E4=BB=B6=E5=8C=96=E6=94=AF?= =?UTF-8?q?=E4=BB=98=E6=B8=A0=E9=81=93=E9=99=90=E9=A2=9D=20=E2=80=94=20pro?= =?UTF-8?q?vider=20=E8=87=AA=E5=A3=B0=E6=98=8E=E5=8D=95=E7=AC=94/=E6=AF=8F?= =?UTF-8?q?=E6=97=A5=E9=BB=98=E8=AE=A4=E9=99=90=E9=A2=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - PaymentProvider 接口新增 defaultLimits(单笔 singleMax + 每日 dailyMax) - EasyPay 默认:支付宝/微信各 单笔 ¥1000、每日 ¥10000 - Stripe 默认:不限额(0 = unlimited) - getMethodDailyLimit / getMethodSingleLimit 优先读 env var,再回退 provider 默认 - queryMethodLimits 返回 singleMax,PaymentForm 按渠道动态调整最大单笔金额 - MAX_DAILY_AMOUNT_* 改为可选 env var 覆盖(不再有硬编码默认值) --- src/components/PaymentForm.tsx | 14 ++++++++----- src/lib/config.ts | 10 +++++----- src/lib/easy-pay/provider.ts | 4 ++++ src/lib/order/limits.ts | 36 ++++++++++++++++++++++++++++++---- src/lib/payment/registry.ts | 8 +++++++- src/lib/payment/types.ts | 10 ++++++++++ src/lib/stripe/provider.ts | 3 +++ 7 files changed, 70 insertions(+), 15 deletions(-) diff --git a/src/components/PaymentForm.tsx b/src/components/PaymentForm.tsx index c5e9746..5d7a1f6 100644 --- a/src/components/PaymentForm.tsx +++ b/src/components/PaymentForm.tsx @@ -6,6 +6,8 @@ import { PAYMENT_TYPE_META } from '@/lib/pay-utils'; export interface MethodLimitInfo { available: boolean; remaining: number | null; + /** 单笔限额,0 = 使用全局 maxAmount */ + singleMax?: number; } interface PaymentFormProps { @@ -71,7 +73,9 @@ export default function PaymentForm({ const selectedAmount = amount || 0; const isMethodAvailable = !methodLimits || (methodLimits[paymentType]?.available !== false); - const isValid = selectedAmount >= minAmount && selectedAmount <= maxAmount && hasValidCentPrecision(selectedAmount) && isMethodAvailable; + const methodSingleMax = methodLimits?.[paymentType]?.singleMax; + const effectiveMax = (methodSingleMax !== undefined && methodSingleMax > 0) ? methodSingleMax : maxAmount; + const isValid = selectedAmount >= minAmount && selectedAmount <= effectiveMax && hasValidCentPrecision(selectedAmount) && isMethodAvailable; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); @@ -151,7 +155,7 @@ export default function PaymentForm({ 充值金额
- {QUICK_AMOUNTS.filter((val) => val <= maxAmount).map((val) => ( + {QUICK_AMOUNTS.filter((val) => val <= effectiveMax).map((val) => (