From 6cac41f1c00c1c9f30284463c77167896aaf531b Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 14 Feb 2026 15:25:36 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8E=A5=E5=85=A5DuluPay=E5=85=85=E5=80=BC?= =?UTF-8?q?=E9=97=AD=E7=8E=AF=E5=B9=B6=E7=BB=9F=E4=B8=80=E5=8D=87=E7=BA=A7?= =?UTF-8?q?=E5=BC=B9=E7=AA=97=E6=AF=94=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../settings/admin-settings-client.tsx | 254 ++++++++++++++++++ app/api/payment/dulupay/create/route.ts | 187 +++++++++++++ app/api/payment/dulupay/notify/route.ts | 215 +++++++++++++++ app/api/site-settings/route.ts | 70 +++++ app/api/user/account-center/route.ts | 49 +++- app/api/user/payment-orders/route.ts | 44 +++ components/home/lovart-home.tsx | 217 +++++++++++---- lib/db/migrations/0036_add_payment_orders.sql | 30 +++ lib/db/migrations/meta/_journal.json | 7 + lib/db/schema.ts | 24 ++ lib/payment/dulupay-config.ts | 75 ++++++ lib/payment/dulupay.ts | 44 +++ 12 files changed, 1150 insertions(+), 66 deletions(-) create mode 100644 app/api/payment/dulupay/create/route.ts create mode 100644 app/api/payment/dulupay/notify/route.ts create mode 100644 app/api/user/payment-orders/route.ts create mode 100644 lib/db/migrations/0036_add_payment_orders.sql create mode 100644 lib/payment/dulupay-config.ts create mode 100644 lib/payment/dulupay.ts diff --git a/app/(admin)/settings/admin-settings-client.tsx b/app/(admin)/settings/admin-settings-client.tsx index f1253ac09..828d0194b 100644 --- a/app/(admin)/settings/admin-settings-client.tsx +++ b/app/(admin)/settings/admin-settings-client.tsx @@ -83,6 +83,11 @@ import { type PointsPackage, type PointsSystemConfig, } from "@/lib/points/config"; +import { + defaultDulupayConfig, + normalizeDulupayConfig, + type DulupayConfig, +} from "@/lib/payment/dulupay-config"; const fetcher = (url: string) => fetch(url).then((res) => res.json()); @@ -193,6 +198,7 @@ type SiteSettings = { lovartComposerPreviewTexts: string[]; pointsSystemConfig: PointsSystemConfig; pointsPackages: PointsPackage[]; + dulupayConfig: DulupayConfig; lovartPromoText: string; lovartPromoActionText: string; lovartHeroTitle: string; @@ -433,6 +439,7 @@ export function AdminSettingsClient() { ], pointsSystemConfig: defaultPointsSystemConfig, pointsPackages: defaultPointsPackages, + dulupayConfig: defaultDulupayConfig, lovartPromoText: "现在升级,立享 Kling 3.0 与 Nano Banana Pro,最高 5 折优惠", lovartPromoActionText: "立即升级", lovartHeroTitle: "由壹点AI 让设计更简单", @@ -460,6 +467,9 @@ export function AdminSettingsClient() { const normalizedPointsPackages = normalizePointsPackages( (siteSettingsData as any).pointsPackages ); + const normalizedDulupayConfig = normalizeDulupayConfig( + (siteSettingsData as any).dulupayConfig + ); setSiteSettings({ siteName: siteSettingsData.siteName || "AI Chatbot", @@ -499,6 +509,7 @@ export function AdminSettingsClient() { ], pointsSystemConfig: normalizedPointsSystemConfig, pointsPackages: normalizedPointsPackages, + dulupayConfig: normalizedDulupayConfig, lovartPromoText: siteSettingsData.lovartPromoText || "现在升级,立享 Kling 3.0 与 Nano Banana Pro,最高 5 折优惠", @@ -3648,6 +3659,249 @@ export function AdminSettingsClient() { +
+
+
+ +
+ 用于积分充值支付。支持 V1(MD5)和 V2(SHA256WithRSA)两种签名模式。 +
+
+ +
+
+
+
+ +
+ 开启后允许前端发起 DuluPay 充值订单 +
+
+ + setSiteSettings({ + ...siteSettings, + dulupayConfig: { + ...siteSettings.dulupayConfig, + enabled: checked, + }, + }) + } + /> +
+
+ + +
+
+
+
+ + + setSiteSettings({ + ...siteSettings, + dulupayConfig: { + ...siteSettings.dulupayConfig, + baseUrl: e.target.value, + }, + }) + } + placeholder="https://www.dulupay.com" + /> +
+
+ + + setSiteSettings({ + ...siteSettings, + dulupayConfig: { + ...siteSettings.dulupayConfig, + notifyUrl: e.target.value, + }, + }) + } + placeholder="https://your-domain.com/api/payment/dulupay/notify" + /> +
+
+ + + setSiteSettings({ + ...siteSettings, + dulupayConfig: { + ...siteSettings.dulupayConfig, + returnUrl: e.target.value, + }, + }) + } + placeholder="https://your-domain.com/payment/success" + /> +
+
+ + + setSiteSettings({ + ...siteSettings, + dulupayConfig: { + ...siteSettings.dulupayConfig, + defaultType: e.target.value, + }, + }) + } + placeholder="alipay / wxpay" + /> +
+
+ {siteSettings.dulupayConfig?.version === "v1" ? ( +
+
+ + + setSiteSettings({ + ...siteSettings, + dulupayConfig: { + ...siteSettings.dulupayConfig, + pid: e.target.value, + }, + }) + } + placeholder="商户ID (pid)" + /> +
+
+ + + setSiteSettings({ + ...siteSettings, + dulupayConfig: { + ...siteSettings.dulupayConfig, + key: e.target.value, + }, + }) + } + placeholder="V1 签名密钥 key" + /> +
+
+ ) : ( +
+
+
+ + + setSiteSettings({ + ...siteSettings, + dulupayConfig: { + ...siteSettings.dulupayConfig, + mchId: e.target.value, + }, + }) + } + placeholder="V2 商户号" + /> +
+
+ + + setSiteSettings({ + ...siteSettings, + dulupayConfig: { + ...siteSettings.dulupayConfig, + appId: e.target.value, + }, + }) + } + placeholder="V2 应用ID" + /> +
+
+
+ +