支付宝: - 回调增加 app_id 校验,防止跨商户通知 - 回调增加 sign_type 过滤,仅接受 RSA2 - 退款增加 out_request_no 保证幂等 - 金额解析增加精度保护 - timestamp 改用 CST 时区 微信: - 自行实现 AES-GCM 解密替代库的 decipher_gcm(修复 AuthTag 未验证) - WXPAY_PUBLIC_KEY_ID 改为必填 - serial 匹配检查改为强制 - 时间戳校验移到签名验证之前 - nonce 改用 crypto.randomBytes - publicKey 不允许空 Buffer fallback Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
72 lines
2.2 KiB
TypeScript
72 lines
2.2 KiB
TypeScript
import { paymentRegistry } from './registry';
|
||
import type { PaymentType } from './types';
|
||
import { EasyPayProvider } from '@/lib/easy-pay/provider';
|
||
import { StripeProvider } from '@/lib/stripe/provider';
|
||
import { AlipayProvider } from '@/lib/alipay/provider';
|
||
import { WxpayProvider } from '@/lib/wxpay/provider';
|
||
import { getEnv } from '@/lib/config';
|
||
|
||
export { paymentRegistry } from './registry';
|
||
export type {
|
||
PaymentType,
|
||
PaymentProvider,
|
||
CreatePaymentRequest,
|
||
CreatePaymentResponse,
|
||
QueryOrderResponse,
|
||
PaymentNotification,
|
||
RefundRequest,
|
||
RefundResponse,
|
||
} from './types';
|
||
|
||
let initialized = false;
|
||
|
||
export function initPaymentProviders(): void {
|
||
if (initialized) return;
|
||
|
||
const env = getEnv();
|
||
const providers = env.PAYMENT_PROVIDERS;
|
||
|
||
if (providers.includes('easypay')) {
|
||
if (!env.EASY_PAY_PID || !env.EASY_PAY_PKEY) {
|
||
throw new Error('PAYMENT_PROVIDERS 含 easypay,但缺少 EASY_PAY_PID 或 EASY_PAY_PKEY');
|
||
}
|
||
paymentRegistry.register(new EasyPayProvider());
|
||
}
|
||
|
||
if (providers.includes('alipay')) {
|
||
if (!env.ALIPAY_APP_ID || !env.ALIPAY_PRIVATE_KEY || !env.ALIPAY_NOTIFY_URL) {
|
||
throw new Error(
|
||
'PAYMENT_PROVIDERS includes alipay but required env vars are missing: ALIPAY_APP_ID, ALIPAY_PRIVATE_KEY, ALIPAY_NOTIFY_URL',
|
||
);
|
||
}
|
||
paymentRegistry.register(new AlipayProvider()); // 注册 alipay_direct
|
||
}
|
||
|
||
if (providers.includes('wxpay')) {
|
||
if (
|
||
!env.WXPAY_APP_ID ||
|
||
!env.WXPAY_MCH_ID ||
|
||
!env.WXPAY_PRIVATE_KEY ||
|
||
!env.WXPAY_API_V3_KEY ||
|
||
!env.WXPAY_PUBLIC_KEY ||
|
||
!env.WXPAY_PUBLIC_KEY_ID ||
|
||
!env.WXPAY_CERT_SERIAL ||
|
||
!env.WXPAY_NOTIFY_URL
|
||
) {
|
||
throw new Error(
|
||
'PAYMENT_PROVIDERS includes wxpay but required env vars are missing: WXPAY_APP_ID, WXPAY_MCH_ID, WXPAY_PRIVATE_KEY, WXPAY_API_V3_KEY, WXPAY_PUBLIC_KEY, WXPAY_PUBLIC_KEY_ID, WXPAY_CERT_SERIAL, WXPAY_NOTIFY_URL',
|
||
);
|
||
}
|
||
paymentRegistry.register(new WxpayProvider());
|
||
}
|
||
|
||
if (providers.includes('stripe')) {
|
||
if (!env.STRIPE_SECRET_KEY) {
|
||
throw new Error('PAYMENT_PROVIDERS 含 stripe,但缺少 STRIPE_SECRET_KEY');
|
||
}
|
||
paymentRegistry.register(new StripeProvider());
|
||
}
|
||
|
||
initialized = true;
|
||
}
|