From 7c9eac2c343a8299e8081f7dd7b6c90b6950c672 Mon Sep 17 00:00:00 2001
From: wwwwwwwww <526125649@qq.com>
Date: Wed, 10 Jun 2026 13:02:52 +0800
Subject: [PATCH 1/2] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=94=AF=E4=BB=98?=
=?UTF-8?q?=E5=AE=9D=E7=BD=91=E5=85=B3=E5=9C=B0=E5=9D=80=E9=85=8D=E7=BD=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
video-gen-admin/src/pages/AdminPaymentConfig.tsx | 7 ++++++-
video-gen-api/app/services/payment.py | 7 ++++---
video-gen-app/src/pages/admin/AdminPaymentConfig.tsx | 6 +++++-
3 files changed, 15 insertions(+), 5 deletions(-)
diff --git a/video-gen-admin/src/pages/AdminPaymentConfig.tsx b/video-gen-admin/src/pages/AdminPaymentConfig.tsx
index 0a435789..7eff246b 100644
--- a/video-gen-admin/src/pages/AdminPaymentConfig.tsx
+++ b/video-gen-admin/src/pages/AdminPaymentConfig.tsx
@@ -36,6 +36,7 @@ const AdminPaymentConfig: React.FC = () => {
alipay_private_key: map['payment_alipay_private_key'] || '',
alipay_public_key: map['payment_alipay_public_key'] || '',
alipay_notify_url: map['payment_alipay_notify_url'] || '',
+ alipay_gateway: map['payment_alipay_gateway'] || '',
});
setWechatEnabled(map['payment_wechat_enabled'] === 'true');
setAlipayEnabled(map['payment_alipay_enabled'] === 'true');
@@ -61,6 +62,7 @@ const AdminPaymentConfig: React.FC = () => {
['payment_alipay_private_key', values.alipay_private_key || ''],
['payment_alipay_public_key', values.alipay_public_key || ''],
['payment_alipay_notify_url', values.alipay_notify_url || ''],
+ ['payment_alipay_gateway', values.alipay_gateway || ''],
];
for (const [key, value] of updates) {
const cfg = configs.find(c => c.key === key);
@@ -141,7 +143,10 @@ const AdminPaymentConfig: React.FC = () => {
-
+
+
+
+
diff --git a/video-gen-api/app/services/payment.py b/video-gen-api/app/services/payment.py
index bd388e86..e09d2ba5 100644
--- a/video-gen-api/app/services/payment.py
+++ b/video-gen-api/app/services/payment.py
@@ -41,7 +41,7 @@ _alipay_client = None
_alipay_client_app_id = None
-def _get_alipay_client(app_id: str, private_key: str, public_key: str):
+def _get_alipay_client(app_id: str, private_key: str, public_key: str, gateway: str = ""):
"""Get or create an Alipay client. Recreated if app_id changes."""
global _alipay_client, _alipay_client_app_id
@@ -59,7 +59,7 @@ def _get_alipay_client(app_id: str, private_key: str, public_key: str):
return None
config = AlipayClientConfig()
- config.server_url = "https://openapi.alipay.com/gateway.do"
+ config.server_url = gateway or "https://openapi.alipay.com/gateway.do"
config.app_id = app_id
config.app_private_key = private_key
config.alipay_public_key = public_key
@@ -187,12 +187,13 @@ def _create_alipay_order(order: PaymentOrder, db_configs: dict[str, str]) -> str
private_key = db_configs.get("payment_alipay_private_key", "")
public_key = db_configs.get("payment_alipay_public_key", "")
notify_url = db_configs.get("payment_alipay_notify_url", "")
+ gateway = db_configs.get("payment_alipay_gateway", "")
if not app_id or not private_key:
logger.warning("Alipay config missing in database (app_id / private_key)")
return None
- client = _get_alipay_client(app_id, private_key, public_key)
+ client = _get_alipay_client(app_id, private_key, public_key, gateway)
if client is None:
return None
diff --git a/video-gen-app/src/pages/admin/AdminPaymentConfig.tsx b/video-gen-app/src/pages/admin/AdminPaymentConfig.tsx
index 4965cabb..1de69e39 100644
--- a/video-gen-app/src/pages/admin/AdminPaymentConfig.tsx
+++ b/video-gen-app/src/pages/admin/AdminPaymentConfig.tsx
@@ -93,6 +93,7 @@ const AdminPaymentConfig: React.FC = () => {
alipay_app_id: '',
alipay_private_key: '',
alipay_public_key: '',
+ alipay_gateway: '',
alipay_notify_url: '',
}}>
@@ -104,7 +105,10 @@ const AdminPaymentConfig: React.FC = () => {
-
+
+
+
+
From 4e58a30b70e15e2933e46737f56d8e0fc77a9b18 Mon Sep 17 00:00:00 2001
From: wwwwwwwww <526125649@qq.com>
Date: Wed, 10 Jun 2026 13:09:55 +0800
Subject: [PATCH 2/2] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=94=AF=E4=BB=98?=
=?UTF-8?q?=E9=85=8D=E7=BD=AE=E9=A1=B5=E9=9D=A2=E9=80=BB=E8=BE=91=E9=94=99?=
=?UTF-8?q?=E8=AF=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
video-gen-admin/src/api/index.ts | 4 ++
.../src/pages/AdminPaymentConfig.tsx | 45 +++++++------------
video-gen-api/app/api/v1/admin.py | 28 ++++++++++++
3 files changed, 47 insertions(+), 30 deletions(-)
diff --git a/video-gen-admin/src/api/index.ts b/video-gen-admin/src/api/index.ts
index 649dc3cb..cf274fea 100644
--- a/video-gen-admin/src/api/index.ts
+++ b/video-gen-admin/src/api/index.ts
@@ -207,6 +207,10 @@ export async function updatePaymentConfig(id: string, value: string): Promise): Promise {
+ await api.put('/admin/payment-configs/batch', configs);
+}
+
export async function getAdminNotifications(): Promise<{ total: number; items: any[] }> {
return api.get('/admin/notifications');
}
diff --git a/video-gen-admin/src/pages/AdminPaymentConfig.tsx b/video-gen-admin/src/pages/AdminPaymentConfig.tsx
index 7eff246b..6ca418d8 100644
--- a/video-gen-admin/src/pages/AdminPaymentConfig.tsx
+++ b/video-gen-admin/src/pages/AdminPaymentConfig.tsx
@@ -5,18 +5,10 @@ import {
import {
SaveOutlined, WechatOutlined, AlipayCircleOutlined, DollarOutlined,
} from '@ant-design/icons';
-import { getPaymentConfigs, updatePaymentConfig } from '../api';
-
-interface PaymentConfig {
- id: string;
- key: string;
- value: string;
- description?: string;
-}
+import { getPaymentConfigs, batchUpdatePaymentConfigs } from '../api';
const AdminPaymentConfig: React.FC = () => {
const [saving, setSaving] = useState(false);
- const [configs, setConfigs] = useState([]);
const [wechatEnabled, setWechatEnabled] = useState(false);
const [alipayEnabled, setAlipayEnabled] = useState(false);
const [form] = Form.useForm();
@@ -24,9 +16,8 @@ const AdminPaymentConfig: React.FC = () => {
const load = async () => {
try {
const data = await getPaymentConfigs();
- setConfigs(data);
const map: Record = {};
- data.forEach((c: PaymentConfig) => { map[c.key] = c.value; });
+ data.forEach((c: any) => { map[c.key] = c.value; });
form.setFieldsValue({
wechat_mch_id: map['payment_wechat_mch_id'] || '',
wechat_api_key: map['payment_wechat_api_key'] || '',
@@ -51,25 +42,19 @@ const AdminPaymentConfig: React.FC = () => {
try {
const values = await form.validateFields();
setSaving(true);
- const updates: [string, string][] = [
- ['payment_wechat_enabled', String(wechatEnabled)],
- ['payment_wechat_mch_id', values.wechat_mch_id || ''],
- ['payment_wechat_api_key', values.wechat_api_key || ''],
- ['payment_wechat_cert_path', values.wechat_cert_path || ''],
- ['payment_wechat_notify_url', values.wechat_notify_url || ''],
- ['payment_alipay_enabled', String(alipayEnabled)],
- ['payment_alipay_app_id', values.alipay_app_id || ''],
- ['payment_alipay_private_key', values.alipay_private_key || ''],
- ['payment_alipay_public_key', values.alipay_public_key || ''],
- ['payment_alipay_notify_url', values.alipay_notify_url || ''],
- ['payment_alipay_gateway', values.alipay_gateway || ''],
- ];
- for (const [key, value] of updates) {
- const cfg = configs.find(c => c.key === key);
- if (cfg) {
- await updatePaymentConfig(cfg.id, value);
- }
- }
+ await batchUpdatePaymentConfigs({
+ payment_wechat_enabled: String(wechatEnabled),
+ payment_wechat_mch_id: values.wechat_mch_id || '',
+ payment_wechat_api_key: values.wechat_api_key || '',
+ payment_wechat_cert_path: values.wechat_cert_path || '',
+ payment_wechat_notify_url: values.wechat_notify_url || '',
+ payment_alipay_enabled: String(alipayEnabled),
+ payment_alipay_app_id: values.alipay_app_id || '',
+ payment_alipay_private_key: values.alipay_private_key || '',
+ payment_alipay_public_key: values.alipay_public_key || '',
+ payment_alipay_notify_url: values.alipay_notify_url || '',
+ payment_alipay_gateway: values.alipay_gateway || '',
+ });
message.success('支付配置已保存');
load();
} catch {
diff --git a/video-gen-api/app/api/v1/admin.py b/video-gen-api/app/api/v1/admin.py
index bbf732b6..327cced3 100644
--- a/video-gen-api/app/api/v1/admin.py
+++ b/video-gen-api/app/api/v1/admin.py
@@ -412,6 +412,34 @@ async def list_payment_configs(
]
+@router.put("/payment-configs/batch")
+async def batch_update_payment_configs(
+ req: dict[str, str],
+ admin: User = Depends(get_admin_user),
+ db: AsyncSession = Depends(get_db),
+):
+ """Batch upsert payment configs. Creates missing keys, updates existing ones."""
+ from app.utils.id_gen import generate_id
+
+ for key, value in req.items():
+ if not key.startswith("payment_"):
+ continue
+ result = await db.execute(
+ select(SystemConfig).where(SystemConfig.key == key).limit(1)
+ )
+ config = result.scalar_one_or_none()
+ if config:
+ config.value = value
+ else:
+ db.add(SystemConfig(
+ id=generate_id(),
+ key=key,
+ value=value,
+ ))
+ await db.flush()
+ return {"ok": True}
+
+
@router.put("/payment-configs/{config_id}")
async def update_payment_config(
config_id: str,