From 01d5a0b3c453d1fe4384d8f26a2cb8bbafcc8ff5 Mon Sep 17 00:00:00 2001 From: erio Date: Fri, 6 Mar 2026 15:11:47 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E4=BB=98=E5=AE=9D=E5=AF=86?= =?UTF-8?q?=E9=92=A5=E6=94=AF=E6=8C=81=E6=96=87=E4=BB=B6=E8=B7=AF=E5=BE=84?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ALIPAY_PRIVATE_KEY / ALIPAY_PUBLIC_KEY 可直接填密钥内容, 也可填文件路径,代码自动检测并读取文件。 --- src/lib/config.ts | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/lib/config.ts b/src/lib/config.ts index 948c0fc..5382f1b 100644 --- a/src/lib/config.ts +++ b/src/lib/config.ts @@ -1,4 +1,5 @@ import { z } from 'zod'; +import fs from 'fs'; const optionalTrimmedString = z.preprocess((value) => { if (typeof value !== 'string') return value; @@ -34,6 +35,7 @@ const envSchema = z.object({ EASY_PAY_CID_WXPAY: optionalTrimmedString, // ── 支付宝直连(PAYMENT_PROVIDERS 含 alipay 时必填) ── + // 支持直接传密钥内容,也支持传文件路径(自动读取) ALIPAY_APP_ID: optionalTrimmedString, ALIPAY_PRIVATE_KEY: optionalTrimmedString, ALIPAY_PUBLIC_KEY: optionalTrimmedString, @@ -88,6 +90,23 @@ export type Env = z.infer; let cachedEnv: Env | null = null; +/** + * 如果值看起来是文件路径且文件存在,则读取文件内容作为实际值; + * 否则直接返回原值。 + */ +function resolveKeyValue(value: string | undefined): string | undefined { + if (!value) return undefined; + // 密钥内容不会以 / 或盘符开头,文件路径才会 + if ((value.startsWith('/') || /^[A-Za-z]:[/\\]/.test(value)) && fs.existsSync(value)) { + try { + return fs.readFileSync(value, 'utf-8').trim(); + } catch (err) { + throw new Error(`Failed to read key file ${value}: ${(err as Error).message}`); + } + } + return value; +} + export function getEnv(): Env { if (cachedEnv) return cachedEnv; @@ -97,6 +116,12 @@ export function getEnv(): Env { throw new Error('Invalid environment variables'); } - cachedEnv = parsed.data; + const env = parsed.data; + + // 支付宝密钥:支持直接传内容或传文件路径 + env.ALIPAY_PRIVATE_KEY = resolveKeyValue(env.ALIPAY_PRIVATE_KEY); + env.ALIPAY_PUBLIC_KEY = resolveKeyValue(env.ALIPAY_PUBLIC_KEY); + + cachedEnv = env; return cachedEnv; }