diff --git a/lib/validators/payment.ts b/lib/validators/payment.ts index f3b2203..2f01c13 100644 --- a/lib/validators/payment.ts +++ b/lib/validators/payment.ts @@ -3,7 +3,7 @@ import { badRequestError } from "../app-error"; export function validatePaymentConfigInput(input: { name?: string; baseUrl?: string; - provider: "BEPUSDT" | "EPAY"; + provider: string; isEnabled?: boolean; appSecret?: string; pid?: string; diff --git a/modules/payment/repository.ts b/modules/payment/repository.ts index 12323b6..0a86027 100644 --- a/modules/payment/repository.ts +++ b/modules/payment/repository.ts @@ -6,7 +6,7 @@ export function listPaymentConfigRecords(prisma: PrismaClient) { }); } -export function getPaymentConfigRecord(prisma: PrismaClient, provider: "BEPUSDT" | "EPAY") { +export function getPaymentConfigRecord(prisma: PrismaClient, provider: string) { return prisma.paymentConfig.findUnique({ where: { provider }, }); @@ -14,7 +14,7 @@ export function getPaymentConfigRecord(prisma: PrismaClient, provider: "BEPUSDT" export function upsertPaymentConfigRecord( prisma: PrismaClient, - provider: "BEPUSDT" | "EPAY", + provider: string, input: { name: string; isEnabled: boolean; @@ -41,7 +41,7 @@ export function createPaymentLogRecord( prisma: PrismaClient, input: { orderId?: number; - provider: "BEPUSDT" | "EPAY"; + provider: string; orderNo?: string; paymentOrderNo?: string; eventType: string; diff --git a/modules/payment/service.ts b/modules/payment/service.ts index 84a1dc0..ab46b24 100644 --- a/modules/payment/service.ts +++ b/modules/payment/service.ts @@ -7,14 +7,14 @@ import { getAdminContext, logAdminOperation } from "../auth/service"; import { notifyOrderPaid } from "../email/service"; import { getSiteSetting } from "../site/service"; import { createPaymentLogRecord, getPaymentConfigRecord, listPaymentConfigRecords, upsertPaymentConfigRecord } from "./repository"; -import type { PaymentMethodItem } from "./types"; +import type { PaymentMethodItem, PaymentProvider } from "./types"; import type { PaymentConfigValue } from "./types"; import { createBepusdtAdapter } from "./bepusdt"; import { createEpayAdapter } from "./epay"; import { deliverOrder } from "../delivery/service"; import { findOrderRecord, updateOrderPayment } from "../order/repository"; -const defaultPaymentConfigs: Record<"BEPUSDT" | "EPAY", PaymentConfigValue> = { +const defaultPaymentConfigs: Record = { BEPUSDT: { provider: "BEPUSDT", name: "USDT", @@ -41,7 +41,7 @@ function getPaymentContext() { return getContext<{ prisma: PrismaClient }>(); } -function normalizePaymentConfig(record: Awaited>, provider: "BEPUSDT" | "EPAY"): PaymentConfigValue { +function normalizePaymentConfig(record: Awaited>, provider: PaymentProvider): PaymentConfigValue { const defaults = defaultPaymentConfigs[provider]; if (!record) { return defaults; @@ -69,7 +69,7 @@ export async function listEnabledPaymentMethods(prisma?: PrismaClient): Promise< const client = prisma ?? getPaymentContext().prisma; const records = await listPaymentConfigRecords(client); - return (["BEPUSDT", "EPAY"] as const).map((provider) => { + return (Object.keys(defaultPaymentConfigs) as PaymentProvider[]).map((provider) => { const record = records.find((item) => item.provider === provider); const value = normalizePaymentConfig(record ?? null, provider); return { @@ -81,17 +81,15 @@ export async function listEnabledPaymentMethods(prisma?: PrismaClient): Promise< }); } -export async function getPaymentConfigs(prisma?: PrismaClient) { +export async function getPaymentConfigs(prisma?: PrismaClient): Promise> { const client = prisma ?? getPaymentContext().prisma; - const [bepusdt, epay] = await Promise.all([ - getPaymentConfigRecord(client, "BEPUSDT"), - getPaymentConfigRecord(client, "EPAY"), - ]); - - return { - BEPUSDT: normalizePaymentConfig(bepusdt, "BEPUSDT"), - EPAY: normalizePaymentConfig(epay, "EPAY"), - }; + const records = await listPaymentConfigRecords(client); + const result: Record = {}; + for (const provider of Object.keys(defaultPaymentConfigs) as PaymentProvider[]) { + const record = records.find((r) => r.provider === provider) ?? null; + result[provider] = normalizePaymentConfig(record, provider); + } + return result; } export async function savePaymentConfig(input: PaymentConfigValue) { @@ -200,7 +198,7 @@ export async function createPaymentForOrder(orderNo: string, prisma?: PrismaClie const notifyUrl = resolveCallbackUrl( baseOrigin, config.notifyUrl, - order.paymentProvider === "BEPUSDT" ? "/api/payments/bepusdt/notify" : "/api/payments/epay/notify", + defaultPaymentConfigs[order.paymentProvider as PaymentProvider]?.notifyUrl ?? "/api/payments/notify", ); const returnUrl = resolveCallbackUrl( baseOrigin, @@ -272,7 +270,7 @@ function sanitizePaymentPayload(payload?: Record) { async function createNotifyLog(prisma: PrismaClient, input: { orderId?: number; - provider: "BEPUSDT" | "EPAY"; + provider: PaymentProvider; orderNo?: string; paymentOrderNo?: string; eventType?: string; @@ -294,7 +292,7 @@ async function createNotifyLog(prisma: PrismaClient, input: { } function writePaymentNotifyDiagnostic(input: { - provider: "BEPUSDT" | "EPAY"; + provider: PaymentProvider; source: string; reason: string; payload?: Record; @@ -322,7 +320,7 @@ function writePaymentNotifyDiagnostic(input: { } export async function handlePaymentNotify( - provider: "BEPUSDT" | "EPAY", + provider: PaymentProvider, payload: Record, prisma: PrismaClient, source: string, diff --git a/modules/payment/types.ts b/modules/payment/types.ts index 7c234b3..58f14b1 100644 --- a/modules/payment/types.ts +++ b/modules/payment/types.ts @@ -1,12 +1,14 @@ +export type PaymentProvider = "BEPUSDT" | "EPAY"; + export interface PaymentMethodItem { - provider: "BEPUSDT" | "EPAY"; + provider: PaymentProvider; label: string; enabled: boolean; baseUrl?: string; } export interface PaymentConfigValue { - provider: "BEPUSDT" | "EPAY"; + provider: PaymentProvider; name: string; isEnabled: boolean; baseUrl: string; @@ -16,4 +18,4 @@ export interface PaymentConfigValue { key?: string; notifyUrl?: string; returnUrl?: string; -} +} \ No newline at end of file diff --git a/package.json b/package.json index 553dbaf..b7cfe51 100644 --- a/package.json +++ b/package.json @@ -7,9 +7,9 @@ "db:seed": "bunx wrangler d1 execute DB --local --file=./scripts/seed.sql -y", "db:generate": "prisma generate", "db:studio": "prisma studio", - "db:migrations:remote": "wrangler d1 migrations apply DB --remote", + "db:migrations:remote": "wrangler d1 migrations apply DB --remote ${D1_ID:+--database-id $D1_ID}", "db:migrations:local": "wrangler d1 migrations apply DB --local", - "db:seed:remote": "wrangler d1 execute DB --remote --file=./scripts/seed.sql -y", + "db:seed:remote": "wrangler d1 execute DB --remote --file=./scripts/seed.sql -y ${D1_ID:+--database-id $D1_ID}", "verify:payments": "bun run scripts/verify-payment-adapters.ts", "verify:payment-notify": "bun run scripts/verify-payment-notify.ts", "deploy": "bun run db:migrations:remote && bun run db:seed:remote && wrangler deploy", diff --git a/pages/admin/email/+Page.vue b/pages/admin/email/+Page.vue index 44b8630..4011773 100644 --- a/pages/admin/email/+Page.vue +++ b/pages/admin/email/+Page.vue @@ -392,7 +392,7 @@ # 时间 分类 - API服务商 + 邮箱名称 场景 状态 收件人 @@ -407,7 +407,7 @@ {{ index + 1 }} {{ formatDate(log.createdAt) }} {{ getChannelLabel(log.provider) }} - {{ log.apiProvider || '-' }} + {{ configs.find(c => c.provider === log.provider)?.name || '-' }} {{ getSceneLabel(log.scene) }} diff --git a/pages/admin/payments/+Page.vue b/pages/admin/payments/+Page.vue index e0ffc24..8c3174d 100644 --- a/pages/admin/payments/+Page.vue +++ b/pages/admin/payments/+Page.vue @@ -1,17 +1,30 @@ +const activeTab = ref("BEPUSDT"); +const localConfigs = reactive({ ...configs }); + \ No newline at end of file diff --git a/pages/admin/payments/+data.ts b/pages/admin/payments/+data.ts index ac9dd4f..45d84a6 100644 --- a/pages/admin/payments/+data.ts +++ b/pages/admin/payments/+data.ts @@ -1,6 +1,6 @@ import { getPaymentConfigs } from "../../../modules/payment/service"; -export type Data = ReturnType; +export type Data = Awaited>; export async function data(pageContext: { prisma: import("../../../generated/prisma/client").PrismaClient; diff --git a/pages/admin/payments/PaymentConfigCard.vue b/pages/admin/payments/PaymentConfigCard.vue index 8b40491..49311af 100644 --- a/pages/admin/payments/PaymentConfigCard.vue +++ b/pages/admin/payments/PaymentConfigCard.vue @@ -23,27 +23,7 @@ -
- - -
- -
- - -
+
-

- `Notify URL` 和 `Return URL` 支持填写相对路径或完整 URL;`Return URL` 支持 `{orderNo}`、`{token}` 占位符。 -

-