's'调试支付

This commit is contained in:
eric
2026-03-08 06:43:48 -05:00
parent b99fba1c5a
commit 1f4473cb04
35 changed files with 1794 additions and 178 deletions

137
config/services.config.ts Normal file
View File

@@ -0,0 +1,137 @@
/**
* 服务配置 - PocketBase、支付等第三方服务
* 可通过环境变量覆盖,不同主题可配置不同集合/金额
*/
import { getThemeConfig } from "./site.config";
export interface PocketBaseConfig {
enabled: boolean;
/** PocketBase 服务地址 */
url: string;
/** 用户认证集合 */
usersCollection: string;
/** 申请/加入表单集合(如 solan、applications */
joinCollection: string;
}
export interface PaymentConfig {
enabled: boolean;
/** 支付 API 地址payjsapi */
apiUrl: string;
/** 支付提供商zpay | xorpay */
provider: "zpay" | "xorpay";
/** 默认金额(分) */
defaultAmount: number;
/** 默认订单类型 */
defaultType: string;
/** ZPAY 提交地址 */
zpaySubmitUrl: string;
}
export interface MinioConfig {
enabled: boolean;
/** MinIO 服务端点 */
endPoint: string;
/** 端口 */
port: number;
/** 是否使用 SSL */
useSSL: boolean;
/** 存储桶 */
bucket: string;
/** Access Key */
accessKey: string;
/** Secret Key */
secretKey: string;
/** 区域 */
region: string;
/** 公开访问 URL用于生成文件链接 */
publicUrl: string;
/** 上传路径前缀(如 joins、uploads */
uploadPrefix: string;
}
export interface ServicesConfig {
pocketbase: PocketBaseConfig;
payment: PaymentConfig;
minio: MinioConfig;
}
const isDev = process.env.NODE_ENV === "development";
/** 获取 PocketBase 配置(可传入主题覆盖) */
export function getPocketBaseConfig(themeOverride?: { joinCollection?: string }): PocketBaseConfig {
const joinCollection =
themeOverride?.joinCollection ||
process.env.POCKETBASE_JOIN_COLLECTION ||
"solan";
return {
enabled: true,
url: process.env.NEXT_PUBLIC_POCKETBASE_URL || process.env.POCKETBASE_URL || "https://pocketbase.hackrobot.cn",
usersCollection: "users",
joinCollection,
};
}
/** 获取支付配置(可传入主题覆盖,如 join 金额/类型) */
export function getPaymentConfig(themeOverride?: { amount?: number; type?: string }): PaymentConfig {
const base = {
enabled: true,
apiUrl:
process.env.PAYMENT_API_URL ||
(isDev ? "http://127.0.0.1:8700" : "https://api.hackrobot.cn"),
provider: (process.env.PAYMENT_PROVIDER as "zpay" | "xorpay") || "zpay",
defaultAmount: Number(process.env.PAYMENT_DEFAULT_AMOUNT) || 80,
defaultType: process.env.PAYMENT_DEFAULT_TYPE || "meetup",
zpaySubmitUrl: process.env.ZPAY_SUBMIT_URL || "https://zpayz.cn/submit.php",
};
if (themeOverride) {
if (themeOverride.amount != null) base.defaultAmount = themeOverride.amount;
if (themeOverride.type) base.defaultType = themeOverride.type;
}
return base;
}
/** 获取 MinIO 配置(可传入主题覆盖 bucket/prefix */
export function getMinioConfig(themeOverride?: { bucket?: string; uploadPrefix?: string }): MinioConfig {
const endPoint = process.env.MINIO_ENDPOINT || "minioweb.hackrobot.cn";
const port = parseInt(process.env.MINIO_PORT || "9035", 10);
const useSSL = process.env.MINIO_USE_SSL === "true";
const bucket = themeOverride?.bucket || process.env.MINIO_BUCKET || "hackrobot";
const publicUrl =
process.env.MINIO_PUBLIC_URL ||
`https://${endPoint}/${bucket}`;
const uploadPrefix = themeOverride?.uploadPrefix || process.env.MINIO_UPLOAD_PREFIX || "joins";
return {
enabled: true,
endPoint,
port,
useSSL,
bucket,
accessKey: process.env.MINIO_ACCESS_KEY || "6i56HHfg4zPfYItCZtnp",
secretKey: process.env.MINIO_SECRET_KEY || "vDJCqEit3ejH5UmWKAZnvqhziNfbVsoOlBW12G8Q",
region: process.env.MINIO_REGION || "china",
publicUrl: publicUrl.replace(/\/$/, ""),
uploadPrefix,
};
}
/** 获取完整服务配置 */
export function getServicesConfig(): ServicesConfig {
return {
pocketbase: getPocketBaseConfig(),
payment: getPaymentConfig(),
minio: getMinioConfig(),
};
}
/** 获取「加入/申请」场景的支付配置(含主题覆盖) */
export function getJoinPaymentConfig(): { amount: number; type: string } {
const theme = getThemeConfig();
const payment = getPaymentConfig();
return {
amount: theme.services?.join?.amount ?? payment.defaultAmount,
type: theme.services?.join?.type ?? payment.defaultType,
};
}