{"version":3,"sources":["../src/types/payment.ts","../src/providers/base/BaseProvider.ts","../src/utils/crypto.ts","../src/utils/http.ts","../src/utils/wechat.ts","../src/utils/wechat-v2.ts","../src/providers/wechat/WechatProvider.ts","../src/utils/alipay.ts","../src/providers/alipay/AlipayProvider.ts","../src/index.ts","../src/core/PaymentManagerV2.ts","../src/core/hooks.ts","../src/providers/base/index.ts","../src/providers/base/ProviderFactory.ts","../src/config/index.ts","../src/adapters/nextjsV2.ts"],"names":["PaymentErrorCode","ExtendedPaymentErrorCode","PaymentMethodEnum","createSign","method","createVerify","defaultConfig","WechatProvider","AlipayProvider"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\r\n * 统一支付通知接口\r\n */\r\nexport interface UnifiedPaymentNotification {\r\n  /** 支付提供商 */\r\n  provider: 'wechat' | 'alipay';\r\n  /** 交易状态 */\r\n  tradeStatus: 'SUCCESS' | 'FAIL' | 'PENDING';\r\n  /** 商户订单号 */\r\n  outTradeNo: string;\r\n  /** 第三方交易号 */\r\n  tradeNo: string;\r\n  /** 交易金额（分） */\r\n  totalAmount: number;\r\n  /** 付款人ID */\r\n  payerId?: string;\r\n  /** 原始回调数据 */\r\n  raw: any;\r\n  /** 回调时间戳 */\r\n  timestamp?: number;\r\n}\r\n\r\n/**\r\n * 支付通知载荷\r\n */\r\nexport interface PaymentNotifyPayload {\r\n  /** 支付提供商 */\r\n  provider: 'wechat' | 'alipay';\r\n  /** 原始回调数据 */\r\n  raw: any;\r\n  /** 请求头信息 */\r\n  headers?: Record<string, string>;\r\n}\r\n\r\n/**\r\n * 支付提供商类型\r\n */\r\nexport type PaymentProvider = 'wechat' | 'alipay';\r\n\r\n/**\r\n * 微信支付方式\r\n */\r\nexport type WechatPayMethod = 'native' | 'jsapi' | 'h5' | 'app';\r\n\r\n/**\r\n * 支付宝支付方式\r\n */\r\nexport type AlipayMethod = 'qrcode' | 'pc' | 'h5' | 'app';\r\n\r\n/**\r\n * 支付方式映射\r\n */\r\nexport type PaymentMethod =\r\n  | `wechat.${WechatPayMethod}`\r\n  | `alipay.${AlipayMethod}`;\r\n\r\n/**\r\n * 支付状态\r\n */\r\nexport type PaymentStatus = 'SUCCESS' | 'FAIL' | 'PENDING' | 'REFUND';\r\n\r\n/**\r\n * 支付配置基础接口\r\n */\r\nexport interface BasePaymentConfig {\r\n  /** 是否启用 */\r\n  enabled: boolean;\r\n  /** 是否为沙箱环境 */\r\n  sandbox?: boolean;\r\n}\r\n\r\n/**\r\n * 错误码定义\r\n */\r\nexport enum PaymentErrorCode {\r\n  /** 验签失败 */\r\n  VERIFY_FAILED = 'VERIFY_FAILED',\r\n  /** 解密失败 */\r\n  DECRYPT_FAILED = 'DECRYPT_FAILED',\r\n  /** 配置错误 */\r\n  CONFIG_ERROR = 'CONFIG_ERROR',\r\n  /** 网络错误 */\r\n  NETWORK_ERROR = 'NETWORK_ERROR',\r\n  /** 未知提供商 */\r\n  UNKNOWN_PROVIDER = 'UNKNOWN_PROVIDER',\r\n  /** 参数错误 */\r\n  INVALID_PARAMS = 'INVALID_PARAMS',\r\n}\r\n\r\n/**\r\n * 支付错误类\r\n */\r\nexport class PaymentError extends Error {\r\n  constructor(\r\n    public code: PaymentErrorCode,\r\n    message: string,\r\n    public details?: any\r\n  ) {\r\n    super(message);\r\n    this.name = 'PaymentError';\r\n  }\r\n}\r\n\r\n/**\r\n * Hook 事件类型\r\n */\r\nexport type HookEvent = 'onNotify' | 'onSuccess' | 'onFail' | 'onPending';\r\n\r\n/**\r\n * Hook 处理函数\r\n */\r\nexport type HookHandler = (\r\n  notification: UnifiedPaymentNotification\r\n) => void | Promise<void>;\r\n\r\n/**\r\n * Hook 配置\r\n */\r\nexport interface HookConfig {\r\n  [key: string]: HookHandler[];\r\n}\r\n\r\n/**\r\n * 支付订单创建请求\r\n */\r\nexport interface CreateOrderRequest {\r\n  /** 商户订单号 */\r\n  outTradeNo: string;\r\n  /** 订单总金额（分） */\r\n  totalAmount: number;\r\n  /** 商品描述 */\r\n  subject: string;\r\n  /** 商品详情 */\r\n  body?: string;\r\n  /** 订单过期时间（分钟，默认30分钟） */\r\n  timeExpire?: number;\r\n  /** 异步通知地址 */\r\n  notifyUrl?: string;\r\n  /** 同步返回地址 */\r\n  returnUrl?: string;\r\n  /** 透传参数 */\r\n  passbackParams?: string;\r\n  /** 用户 openid（JSAPI 支付必填） */\r\n  openid?: string;\r\n  /** 用户 IP 地址 */\r\n  clientIp?: string;\r\n  /**\r\n   * 付款码（付款码支付必填）\r\n   */\r\n  authCode?: string;\r\n  /**\r\n   * 设备信息（付款码支付必填）\r\n   */\r\n  deviceInfo?: string;\r\n}\r\n\r\n/**\r\n * 微信支付订单创建请求\r\n */\r\nexport interface WechatCreateOrderRequest extends CreateOrderRequest {\r\n  /** 场景信息 */\r\n  sceneInfo?: {\r\n    /** 门店信息 */\r\n    storeInfo?: {\r\n      id: string;\r\n      name?: string;\r\n      areaCode?: string;\r\n      address?: string;\r\n    };\r\n    /** H5 支付场景信息 */\r\n    h5Info?: {\r\n      type: 'Wap' | 'iOS' | 'Android';\r\n      appName?: string;\r\n      appUrl?: string;\r\n      bundleId?: string;\r\n      packageName?: string;\r\n    };\r\n  };\r\n}\r\n\r\n/**\r\n * 支付宝订单创建请求\r\n */\r\nexport interface AlipayCreateOrderRequest extends CreateOrderRequest {\r\n  /** 商品类型 */\r\n  productCode?: string;\r\n  /** 商品主类型 */\r\n  goodsType?: string;\r\n  /** 销售产品码 */\r\n  salesProductCode?: string;\r\n  /** 优惠信息 */\r\n  discountableAmount?: number;\r\n  /** 不可打折金额 */\r\n  undiscountableAmount?: number;\r\n  /** 商户门店编号 */\r\n  storeId?: string;\r\n}\r\n\r\n/**\r\n * 支付订单创建响应\r\n */\r\nexport interface CreateOrderResponse {\r\n  /** 是否成功 */\r\n  success: boolean;\r\n  /** 错误信息 */\r\n  error?: string;\r\n  /** 支付订单号 */\r\n  tradeNo?: string;\r\n  /** 支付数据 */\r\n  paymentData?: {\r\n    /** 二维码链接（Native 支付） */\r\n    qrCode?: string;\r\n    /** 支付参数（JSAPI 支付） */\r\n    payParams?: any;\r\n    /** 支付 URL（H5 支付） */\r\n    payUrl?: string;\r\n    /** 支付表单（PC 支付） */\r\n    payForm?: string;\r\n  };\r\n  /** 原始响应数据 */\r\n  raw?: any;\r\n}\r\n\r\n/**\r\n * 订单查询请求\r\n */\r\nexport interface QueryOrderRequest {\r\n  /** 商户订单号 */\r\n  outTradeNo?: string;\r\n  /** 支付平台交易号 */\r\n  tradeNo?: string;\r\n}\r\n\r\n/**\r\n * 订单查询响应\r\n */\r\nexport interface QueryOrderResponse {\r\n  /** 是否成功 */\r\n  success: boolean;\r\n  /** 错误信息 */\r\n  error?: string;\r\n  /** 订单信息 */\r\n  orderInfo?: {\r\n    /** 交易状态 */\r\n    tradeStatus: 'SUCCESS' | 'FAIL' | 'PENDING' | 'CLOSED' | 'REFUND';\r\n    /** 商户订单号 */\r\n    outTradeNo: string;\r\n    /** 支付平台交易号 */\r\n    tradeNo: string;\r\n    /** 交易金额（分） */\r\n    totalAmount: number;\r\n    /** 实际支付金额（分） */\r\n    receiptAmount?: number;\r\n    /** 付款方ID */\r\n    payerId?: string;\r\n    /** 交易创建时间 */\r\n    createTime?: string;\r\n    /** 交易支付时间 */\r\n    payTime?: string;\r\n  };\r\n  /** 原始响应数据 */\r\n  raw?: any;\r\n}\r\n\r\n/**\r\n * 退款请求\r\n */\r\nexport interface RefundRequest {\r\n  /** 商户订单号 */\r\n  outTradeNo?: string;\r\n  /** 支付平台交易号 */\r\n  tradeNo?: string;\r\n  /** 商户退款单号 */\r\n  outRefundNo: string;\r\n  /** 退款金额（分） */\r\n  refundAmount: number;\r\n  /** 退款原因 */\r\n  refundReason?: string;\r\n  /** 异步通知地址 */\r\n  notifyUrl?: string;\r\n}\r\n\r\n/**\r\n * 退款响应\r\n */\r\nexport interface RefundResponse {\r\n  /** 是否成功 */\r\n  success: boolean;\r\n  /** 错误信息 */\r\n  error?: string;\r\n  /** 退款信息 */\r\n  refundInfo?: {\r\n    /** 退款单号 */\r\n    refundId: string;\r\n    /** 商户退款单号 */\r\n    outRefundNo: string;\r\n    /** 退款金额（分） */\r\n    refundAmount: number;\r\n    /** 退款状态 */\r\n    refundStatus: 'SUCCESS' | 'FAIL' | 'PENDING';\r\n    /** 退款时间 */\r\n    refundTime?: string;\r\n  };\r\n  /** 原始响应数据 */\r\n  raw?: any;\r\n}\r\n\r\n/**\r\n * 支付回调数据\r\n */\r\nexport type PaymentData = Record<string, any>;\r\n\r\n/**\r\n * 支付回调结果\r\n */\r\nexport interface PaymentCallback {\r\n  success: boolean;\r\n  orderId: string;\r\n  transactionId: string;\r\n  amount: number;\r\n  currency: string;\r\n  payTime: Date;\r\n  rawData: any;\r\n}\r\n\r\n/**\r\n * 扩展的错误码\r\n */\r\nexport enum ExtendedPaymentErrorCode {\r\n  /** 验签失败 */\r\n  VERIFY_FAILED = 'VERIFY_FAILED',\r\n  /** 解密失败 */\r\n  DECRYPT_FAILED = 'DECRYPT_FAILED',\r\n  /** 配置错误 */\r\n  CONFIG_ERROR = 'CONFIG_ERROR',\r\n  /** 网络错误 */\r\n  NETWORK_ERROR = 'NETWORK_ERROR',\r\n  /** 未知提供商 */\r\n  UNKNOWN_PROVIDER = 'UNKNOWN_PROVIDER',\r\n  /** 参数错误 */\r\n  INVALID_PARAMS = 'INVALID_PARAMS',\r\n  /** 无效参数 */\r\n  INVALID_PARAMETER = 'INVALID_PARAMETER',\r\n  /** 回调错误 */\r\n  CALLBACK_ERROR = 'CALLBACK_ERROR',\r\n  /** 创建订单失败 */\r\n  CREATE_ORDER_FAILED = 'CREATE_ORDER_FAILED',\r\n  /** 查询订单失败 */\r\n  QUERY_ORDER_FAILED = 'QUERY_ORDER_FAILED',\r\n  /** 退款失败 */\r\n  REFUND_FAILED = 'REFUND_FAILED',\r\n}\r\n\r\n/**\r\n * 扩展的支付方式枚举\r\n */\r\nexport enum PaymentMethodEnum {\r\n  WECHAT_NATIVE = 'wechat.native',\r\n  WECHAT_JSAPI = 'wechat.jsapi',\r\n  WECHAT_H5 = 'wechat.h5',\r\n  WECHAT_APP = 'wechat.app',\r\n  ALIPAY_QR = 'alipay.qrcode',\r\n  ALIPAY_PC = 'alipay.pc',\r\n  ALIPAY_H5 = 'alipay.h5',\r\n  ALIPAY_APP = 'alipay.app',\r\n}\r\n\r\n/**\r\n * 新的创建订单请求接口\r\n */\r\nexport interface NewCreateOrderRequest {\r\n  orderId: string;\r\n  amount: number;\r\n  description: string;\r\n  body?: string;\r\n  attach?: string;\r\n  timeExpire?: Date;\r\n  clientIp?: string;\r\n  openid?: string;\r\n  quitUrl?: string;\r\n}\r\n\r\n/**\r\n * 新的创建订单响应接口\r\n */\r\nexport interface NewCreateOrderResponse {\r\n  orderId: string;\r\n  paymentData: Record<string, any>;\r\n  rawData: any;\r\n}\r\n\r\n/**\r\n * 新的查询订单请求接口\r\n */\r\nexport interface NewQueryOrderRequest {\r\n  orderId?: string;\r\n  transactionId?: string;\r\n}\r\n\r\n/**\r\n * 新的查询订单响应接口\r\n */\r\nexport interface NewQueryOrderResponse {\r\n  orderId: string;\r\n  transactionId: string;\r\n  status: string;\r\n  amount: number;\r\n  currency: string;\r\n  payTime?: Date;\r\n  rawData: any;\r\n}\r\n\r\n/**\r\n * 新的退款请求接口\r\n */\r\nexport interface NewRefundRequest {\r\n  orderId?: string;\r\n  transactionId?: string;\r\n  refundId?: string;\r\n  amount: number;\r\n  reason?: string;\r\n}\r\n\r\n/**\r\n * 新的退款响应接口\r\n */\r\nexport interface NewRefundResponse {\r\n  refundId: string;\r\n  orderId: string;\r\n  transactionId: string;\r\n  amount: number;\r\n  status: string;\r\n  refundTime?: Date;\r\n  rawData: any;\r\n}\r\n\r\n/**\r\n * 微信支付创建订单请求\r\n */\r\nexport interface WechatNewCreateOrderRequest extends NewCreateOrderRequest {\r\n  // 微信支付特有字段\r\n}\r\n\r\n/**\r\n * 支付宝创建订单请求\r\n */\r\nexport interface AlipayNewCreateOrderRequest extends NewCreateOrderRequest {\r\n  subject: string;\r\n  // 支付宝特有字段\r\n}\r\n","import {\r\n  UnifiedPaymentNotification,\r\n  PaymentNotifyPayload,\r\n  PaymentError,\r\n  PaymentErrorCode,\r\n  CreateOrderRequest,\r\n  CreateOrderResponse,\r\n  QueryOrderRequest,\r\n  QueryOrderResponse,\r\n  RefundRequest,\r\n  RefundResponse,\r\n} from '../../types/payment';\r\n\r\n/**\r\n * Provider 配置基础接口\r\n */\r\nexport interface BaseProviderConfig {\r\n  /** 是否启用 */\r\n  enabled: boolean;\r\n  /** 是否为沙箱环境 */\r\n  sandbox?: boolean;\r\n  /** 回调地址 */\r\n  notifyUrl?: string;\r\n}\r\n\r\n/**\r\n * Provider 验签结果\r\n */\r\nexport interface VerifyResult {\r\n  /** 验签是否成功 */\r\n  success: boolean;\r\n  /** 错误信息（如果有） */\r\n  error?: string;\r\n  /** 额外信息 */\r\n  details?: any;\r\n}\r\n\r\n/**\r\n * Provider 抽象基类\r\n * 所有支付提供商都必须实现这个抽象类\r\n */\r\nexport abstract class BaseProvider<\r\n  TConfig extends BaseProviderConfig = BaseProviderConfig,\r\n> {\r\n  protected config: TConfig;\r\n  protected readonly providerName: string;\r\n\r\n  constructor(config: TConfig, providerName: string) {\r\n    this.config = config;\r\n    this.providerName = providerName;\r\n    this.validateConfig();\r\n  }\r\n\r\n  /**\r\n   * 获取提供商名称\r\n   */\r\n  getProviderName(): string {\r\n    return this.providerName;\r\n  }\r\n\r\n  /**\r\n   * 获取配置\r\n   */\r\n  getConfig(): TConfig {\r\n    return { ...this.config };\r\n  }\r\n\r\n  /**\r\n   * 更新配置\r\n   * @param newConfig 新配置\r\n   */\r\n  updateConfig(newConfig: Partial<TConfig>): void {\r\n    this.config = { ...this.config, ...newConfig };\r\n    this.validateConfig();\r\n  }\r\n\r\n  /**\r\n   * 检查是否启用\r\n   */\r\n  isEnabled(): boolean {\r\n    return this.config.enabled;\r\n  }\r\n\r\n  /**\r\n   * 处理支付回调通知（主入口）\r\n   * @param payload 回调载荷\r\n   * @returns 统一格式的支付通知\r\n   */\r\n  async handleNotify(\r\n    payload: PaymentNotifyPayload\r\n  ): Promise<UnifiedPaymentNotification> {\r\n    if (!this.isEnabled()) {\r\n      throw new PaymentError(\r\n        PaymentErrorCode.CONFIG_ERROR,\r\n        `${this.providerName} 支付提供商未启用`\r\n      );\r\n    }\r\n\r\n    try {\r\n      // 1. 验证载荷格式\r\n      this.validatePayload(payload);\r\n\r\n      // 2. 验证签名\r\n      const verifyResult = await this.verifySignature(payload);\r\n      if (!verifyResult.success) {\r\n        throw new PaymentError(\r\n          PaymentErrorCode.VERIFY_FAILED,\r\n          `${this.providerName} 签名验证失败: ${verifyResult.error || '未知错误'}`\r\n        );\r\n      }\r\n\r\n      // 3. 解析和转换数据\r\n      const notification = await this.transformNotification(payload);\r\n\r\n      // 4. 后处理（子类可重写）\r\n      await this.postProcess(notification, payload);\r\n\r\n      return notification;\r\n    } catch (error) {\r\n      if (error instanceof PaymentError) {\r\n        throw error;\r\n      }\r\n\r\n      throw new PaymentError(\r\n        PaymentErrorCode.UNKNOWN_PROVIDER,\r\n        `${this.providerName} 回调处理失败`,\r\n        error\r\n      );\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 验证配置（抽象方法）\r\n   * 子类必须实现这个方法来验证特定的配置\r\n   */\r\n  protected abstract validateConfig(): void;\r\n\r\n  /**\r\n   * 验证载荷格式（抽象方法）\r\n   * @param payload 回调载荷\r\n   */\r\n  protected abstract validatePayload(payload: PaymentNotifyPayload): void;\r\n\r\n  /**\r\n   * 验证签名（抽象方法）\r\n   * @param payload 回调载荷\r\n   * @returns 验证结果\r\n   */\r\n  protected abstract verifySignature(\r\n    payload: PaymentNotifyPayload\r\n  ): Promise<VerifyResult>;\r\n\r\n  /**\r\n   * 转换通知数据为统一格式（抽象方法）\r\n   * @param payload 回调载荷\r\n   * @returns 统一格式的支付通知\r\n   */\r\n  protected abstract transformNotification(\r\n    payload: PaymentNotifyPayload\r\n  ): Promise<UnifiedPaymentNotification>;\r\n\r\n  /**\r\n   * 后处理逻辑（可选重写）\r\n   * @param notification 转换后的通知\r\n   * @param originalPayload 原始载荷\r\n   */\r\n  protected async postProcess(\r\n    _notification: UnifiedPaymentNotification,\r\n    _originalPayload: PaymentNotifyPayload\r\n  ): Promise<void> {\r\n    // 默认实现为空，子类可以重写进行额外处理\r\n  }\r\n\r\n  /**\r\n   * 生成成功响应（抽象方法）\r\n   * 不同提供商对成功响应的要求不同\r\n   */\r\n  abstract generateSuccessResponse(): string | object;\r\n\r\n  /**\r\n   * 生成失败响应（抽象方法）\r\n   * 不同提供商对失败响应的要求不同\r\n   */\r\n  abstract generateFailureResponse(error?: string): string | object;\r\n\r\n  /**\r\n   * 获取支持的支付方式（抽象方法）\r\n   * @returns 支持的支付方式列表\r\n   */\r\n  abstract getSupportedMethods(): string[];\r\n\r\n  /**\r\n   * 验证支付方式是否支持\r\n   * @param method 支付方式\r\n   * @returns 是否支持\r\n   */\r\n  isSupportedMethod(method: string): boolean {\r\n    return this.getSupportedMethods().includes(method);\r\n  }\r\n\r\n  /**\r\n   * 创建支付订单（抽象方法）\r\n   * @param method 支付方式\r\n   * @param request 订单创建请求\r\n   * @returns 订单创建响应\r\n   */\r\n  abstract createOrder(\r\n    method: string,\r\n    request: CreateOrderRequest\r\n  ): Promise<CreateOrderResponse>;\r\n\r\n  /**\r\n   * 查询支付订单（抽象方法）\r\n   * @param request 订单查询请求\r\n   * @returns 订单查询响应\r\n   */\r\n  abstract queryOrder(request: QueryOrderRequest): Promise<QueryOrderResponse>;\r\n\r\n  /**\r\n   * 发起退款（抽象方法）\r\n   * @param request 退款请求\r\n   * @returns 退款响应\r\n   */\r\n  abstract refund(request: RefundRequest): Promise<RefundResponse>;\r\n\r\n  /**\r\n   * 获取 Provider 状态信息\r\n   */\r\n  getStatus(): {\r\n    providerName: string;\r\n    enabled: boolean;\r\n    sandbox: boolean;\r\n    supportedMethods: string[];\r\n  } {\r\n    return {\r\n      providerName: this.providerName,\r\n      enabled: this.isEnabled(),\r\n      sandbox: this.config.sandbox || false,\r\n      supportedMethods: this.getSupportedMethods(),\r\n    };\r\n  }\r\n}\r\n","import {\r\n  createDecipheriv,\r\n  createVerify,\r\n  createSign,\r\n  randomBytes,\r\n} from 'crypto';\r\nimport { PaymentError, PaymentErrorCode } from '../types/payment';\r\n\r\n/**\r\n * AES-GCM 解密函数（微信支付 v3）\r\n * @param ciphertext 密文（base64）\r\n * @param nonce 随机数\r\n * @param associatedData 附加数据\r\n * @param apiV3Key API v3 密钥\r\n * @returns 解密后的明文\r\n */\r\nexport function aesGcmDecrypt(\r\n  ciphertext: string,\r\n  nonce: string,\r\n  associatedData: string,\r\n  apiV3Key: string\r\n): string {\r\n  try {\r\n    const buffer = Buffer.from(ciphertext, 'base64');\r\n    const authTag = buffer.slice(buffer.length - 16);\r\n    const data = buffer.slice(0, buffer.length - 16);\r\n\r\n    const decipher = createDecipheriv('aes-256-gcm', apiV3Key, nonce);\r\n    decipher.setAuthTag(authTag);\r\n    decipher.setAAD(Buffer.from(associatedData));\r\n\r\n    const decrypted = Buffer.concat([decipher.update(data), decipher.final()]);\r\n    return decrypted.toString('utf8');\r\n  } catch (error) {\r\n    throw new PaymentError(\r\n      PaymentErrorCode.DECRYPT_FAILED,\r\n      '微信支付回调数据解密失败',\r\n      error\r\n    );\r\n  }\r\n}\r\n\r\n/**\r\n * RSA2 验签函数（支付宝）\r\n * @param data 待验证的数据\r\n * @param signature 签名\r\n * @param publicKey 公钥\r\n * @returns 验证结果\r\n */\r\nexport function verifyWithRSA2(\r\n  data: string,\r\n  signature: string,\r\n  publicKey: string\r\n): boolean {\r\n  try {\r\n    const verify = createVerify('RSA-SHA256');\r\n    verify.write(data);\r\n    verify.end();\r\n\r\n    // 确保公钥格式正确\r\n    const formattedKey = formatPublicKey(publicKey);\r\n\r\n    return verify.verify(formattedKey, signature, 'base64');\r\n  } catch (error) {\r\n    throw new PaymentError(\r\n      PaymentErrorCode.VERIFY_FAILED,\r\n      '支付宝回调验签失败',\r\n      error\r\n    );\r\n  }\r\n}\r\n\r\n/**\r\n * RSA 验签函数（支付宝 RSA）\r\n * @param data 待验证的数据\r\n * @param signature 签名\r\n * @param publicKey 公钥\r\n * @returns 验证结果\r\n */\r\nexport function verifyWithRSA(\r\n  data: string,\r\n  signature: string,\r\n  publicKey: string\r\n): boolean {\r\n  try {\r\n    const verify = createVerify('RSA-SHA1');\r\n    verify.write(data);\r\n    verify.end();\r\n\r\n    const formattedKey = formatPublicKey(publicKey);\r\n\r\n    return verify.verify(formattedKey, signature, 'base64');\r\n  } catch (error) {\r\n    throw new PaymentError(\r\n      PaymentErrorCode.VERIFY_FAILED,\r\n      '支付宝回调验签失败',\r\n      error\r\n    );\r\n  }\r\n}\r\n\r\n/**\r\n * 格式化公钥\r\n * @param publicKey 公钥字符串\r\n * @returns 格式化后的公钥\r\n */\r\nfunction formatPublicKey(publicKey: string): string {\r\n  if (publicKey.includes('-----BEGIN PUBLIC KEY-----')) {\r\n    return publicKey;\r\n  }\r\n\r\n  return `-----BEGIN PUBLIC KEY-----\\n${publicKey}\\n-----END PUBLIC KEY-----`;\r\n}\r\n\r\n/**\r\n * 生成 RSA 签名（用于支付宝请求签名）\r\n * @param data 待签名数据\r\n * @param privateKey 私钥\r\n * @param algorithm 签名算法\r\n * @returns 签名结果\r\n */\r\nexport function signWithRSA(\r\n  data: string,\r\n  privateKey: string,\r\n  algorithm: 'RSA-SHA1' | 'RSA-SHA256' = 'RSA-SHA256'\r\n): string {\r\n  try {\r\n    const sign = createSign(algorithm);\r\n    sign.write(data);\r\n    sign.end();\r\n\r\n    const formattedKey = formatPrivateKey(privateKey);\r\n\r\n    return sign.sign(formattedKey, 'base64');\r\n  } catch (error) {\r\n    throw new PaymentError(\r\n      PaymentErrorCode.CONFIG_ERROR,\r\n      '生成签名失败',\r\n      error\r\n    );\r\n  }\r\n}\r\n\r\n/**\r\n * 格式化私钥\r\n * @param privateKey 私钥字符串\r\n * @returns 格式化后的私钥\r\n */\r\nfunction formatPrivateKey(privateKey: string): string {\r\n  if (privateKey.includes('-----BEGIN PRIVATE KEY-----')) {\r\n    return privateKey;\r\n  }\r\n\r\n  return `-----BEGIN PRIVATE KEY-----\\n${privateKey}\\n-----END PRIVATE KEY-----`;\r\n}\r\n\r\n/**\r\n * 微信支付签名验证\r\n * @param timestamp 时间戳\r\n * @param nonce 随机字符串\r\n * @param body 请求体\r\n * @param signature 签名\r\n * @param publicKey 微信支付平台公钥\r\n * @returns 验证结果\r\n */\r\nexport function verifyWechatSignature(\r\n  timestamp: string,\r\n  nonce: string,\r\n  body: string,\r\n  signature: string,\r\n  publicKey: string\r\n): boolean {\r\n  try {\r\n    const message = `${timestamp}\\n${nonce}\\n${body}\\n`;\r\n\r\n    const verify = createVerify('RSA-SHA256');\r\n    verify.write(message);\r\n    verify.end();\r\n\r\n    const formattedKey = formatPublicKey(publicKey);\r\n\r\n    return verify.verify(formattedKey, signature, 'base64');\r\n  } catch (error) {\r\n    throw new PaymentError(\r\n      PaymentErrorCode.VERIFY_FAILED,\r\n      '微信支付签名验证失败',\r\n      error\r\n    );\r\n  }\r\n}\r\n\r\n/**\r\n * 生成随机字符串\r\n */\r\nexport function generateNonce(length = 32): string {\r\n  const chars =\r\n    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\r\n  let result = '';\r\n  for (let i = 0; i < length; i++) {\r\n    result += chars.charAt(Math.floor(Math.random() * chars.length));\r\n  }\r\n  return result;\r\n}\r\n\r\n/**\r\n * 生成时间戳（秒）\r\n */\r\nexport function generateTimestamp(): number {\r\n  return Math.floor(Date.now() / 1000);\r\n}\r\n\r\n/**\r\n * 生成随机订单号\r\n */\r\nexport function generateOrderNo(prefix = ''): string {\r\n  const timestamp = Date.now();\r\n  const random = randomBytes(4).toString('hex').toUpperCase();\r\n  return `${prefix}${timestamp}${random}`;\r\n}\r\n\r\n/**\r\n * 格式化金额（分转元）\r\n */\r\nexport function formatAmount(amount: number): string {\r\n  return (amount / 100).toFixed(2);\r\n}\r\n\r\n/**\r\n * 解析金额（元转分）\r\n */\r\nexport function parseAmount(amount: string | number): number {\r\n  const num = typeof amount === 'string' ? parseFloat(amount) : amount;\r\n  return Math.round(num * 100);\r\n}\r\n\r\n/**\r\n * 验证订单号格式\r\n */\r\nexport function validateOrderNo(orderNo: string): boolean {\r\n  // 订单号应该是6-32位字符，只能包含数字、字母、下划线、横线\r\n  const regex = /^[a-zA-Z0-9_-]{6,32}$/;\r\n  return regex.test(orderNo);\r\n}\r\n\r\n/**\r\n * 生成UUID\r\n */\r\nexport function generateUUID(): string {\r\n  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\r\n    const r = (Math.random() * 16) | 0;\r\n    const v = c === 'x' ? r : (r & 0x3) | 0x8;\r\n    return v.toString(16);\r\n  });\r\n}\r\n\r\n/**\r\n * 安全比较字符串（防止时序攻击）\r\n */\r\nexport function safeCompare(a: string, b: string): boolean {\r\n  if (a.length !== b.length) {\r\n    return false;\r\n  }\r\n\r\n  let result = 0;\r\n  for (let i = 0; i < a.length; i++) {\r\n    result |= a.charCodeAt(i) ^ b.charCodeAt(i);\r\n  }\r\n\r\n  return result === 0;\r\n}\r\n\r\n/**\r\n * URL安全的Base64编码\r\n */\r\nexport function base64UrlEncode(str: string): string {\r\n  return Buffer.from(str, 'utf8')\r\n    .toString('base64')\r\n    .replace(/\\+/g, '-')\r\n    .replace(/\\//g, '_')\r\n    .replace(/=/g, '');\r\n}\r\n\r\n/**\r\n * URL安全的Base64解码\r\n */\r\nexport function base64UrlDecode(str: string): string {\r\n  // 补齐padding\r\n  const padding = '='.repeat((4 - (str.length % 4)) % 4);\r\n  const base64 = str.replace(/-/g, '+').replace(/_/g, '/') + padding;\r\n  return Buffer.from(base64, 'base64').toString('utf8');\r\n}\r\n","import { PaymentError, PaymentErrorCode } from '../types/payment';\r\n\r\n/**\r\n * HTTP 请求配置\r\n */\r\nexport interface HttpRequestConfig {\r\n  url: string;\r\n  method: 'GET' | 'POST' | 'PUT' | 'DELETE';\r\n  headers?: Record<string, string>;\r\n  data?: any;\r\n  timeout?: number;\r\n}\r\n\r\n/**\r\n * HTTP 响应\r\n */\r\nexport interface HttpResponse<T = any> {\r\n  status: number;\r\n  statusText: string;\r\n  headers: Record<string, string>;\r\n  data: T;\r\n}\r\n\r\n/**\r\n * HTTP 客户端类\r\n */\r\nexport class HttpClient {\r\n  private timeout: number;\r\n\r\n  constructor(timeout = 30000) {\r\n    this.timeout = timeout;\r\n  }\r\n\r\n  /**\r\n   * 发送 HTTP 请求\r\n   */\r\n  async request<T = any>(config: HttpRequestConfig): Promise<HttpResponse<T>> {\r\n    const { url, method, headers = {}, data, timeout = this.timeout } = config;\r\n\r\n    try {\r\n      const controller = new AbortController();\r\n      const timeoutId = setTimeout(() => controller.abort(), timeout);\r\n\r\n      const fetchOptions: RequestInit = {\r\n        method,\r\n        headers: {\r\n          'Content-Type': 'application/json',\r\n          ...headers,\r\n        },\r\n        signal: controller.signal,\r\n      };\r\n\r\n      if (data && (method === 'POST' || method === 'PUT')) {\r\n        fetchOptions.body =\r\n          typeof data === 'string' ? data : JSON.stringify(data);\r\n      }\r\n\r\n      const response = await fetch(url, fetchOptions);\r\n      clearTimeout(timeoutId);\r\n\r\n      const responseHeaders: Record<string, string> = {};\r\n      response.headers.forEach((value, key) => {\r\n        responseHeaders[key] = value;\r\n      });\r\n\r\n      let responseData: T;\r\n      const contentType = response.headers.get('content-type');\r\n\r\n      if (contentType && contentType.includes('application/json')) {\r\n        responseData = await response.json();\r\n      } else {\r\n        responseData = (await response.text()) as T;\r\n      }\r\n\r\n      return {\r\n        status: response.status,\r\n        statusText: response.statusText,\r\n        headers: responseHeaders,\r\n        data: responseData,\r\n      };\r\n    } catch (error) {\r\n      if (error instanceof Error) {\r\n        if (error.name === 'AbortError') {\r\n          throw new PaymentError(\r\n            PaymentErrorCode.NETWORK_ERROR,\r\n            '请求超时',\r\n            error\r\n          );\r\n        }\r\n        throw new PaymentError(\r\n          PaymentErrorCode.NETWORK_ERROR,\r\n          `网络请求失败: ${error.message}`,\r\n          error\r\n        );\r\n      }\r\n      throw new PaymentError(\r\n        PaymentErrorCode.NETWORK_ERROR,\r\n        '未知网络错误',\r\n        error\r\n      );\r\n    }\r\n  }\r\n\r\n  /**\r\n   * GET 请求\r\n   */\r\n  async get<T = any>(\r\n    url: string,\r\n    headers?: Record<string, string>\r\n  ): Promise<HttpResponse<T>> {\r\n    return this.request<T>({ url, method: 'GET', headers });\r\n  }\r\n\r\n  /**\r\n   * POST 请求\r\n   */\r\n  async post<T = any>(\r\n    url: string,\r\n    data?: any,\r\n    headers?: Record<string, string>\r\n  ): Promise<HttpResponse<T>> {\r\n    return this.request<T>({ url, method: 'POST', data, headers });\r\n  }\r\n}\r\n","import { createSign } from 'crypto';\r\nimport { PaymentError, PaymentErrorCode } from '../types/payment';\r\nimport { generateNonce, generateTimestamp } from './crypto';\r\nimport { HttpClient } from './http';\r\n\r\n/**\r\n * 微信支付V3 API基础URL\r\n */\r\nexport const WECHAT_PAY_API_BASE = 'https://api.mch.weixin.qq.com';\r\n\r\n/**\r\n * 微信支付V3签名工具\r\n */\r\nexport class WechatPayV3Signer {\r\n  private privateKey: string;\r\n  private mchId: string;\r\n  private serialNo: string;\r\n\r\n  constructor(privateKey: string, mchId: string, serialNo: string) {\r\n    this.privateKey = privateKey;\r\n    this.mchId = mchId;\r\n    this.serialNo = serialNo;\r\n  }\r\n\r\n  /**\r\n   * 生成微信支付V3签名\r\n   */\r\n  generateSignature(\r\n    method: string,\r\n    url: string,\r\n    timestamp: string,\r\n    nonce: string,\r\n    body: string\r\n  ): string {\r\n    // 构建待签名字符串\r\n    const signString = [method, url, timestamp, nonce, body].join('\\n') + '\\n';\r\n\r\n    try {\r\n      const sign = createSign('RSA-SHA256');\r\n      sign.update(signString, 'utf8');\r\n      return sign.sign(this.privateKey, 'base64');\r\n    } catch (error) {\r\n      throw new PaymentError(\r\n        PaymentErrorCode.CONFIG_ERROR,\r\n        '微信支付签名生成失败',\r\n        error\r\n      );\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 生成Authorization头\r\n   */\r\n  generateAuthorizationHeader(\r\n    method: string,\r\n    url: string,\r\n    body: string = ''\r\n  ): string {\r\n    const timestamp = generateTimestamp().toString();\r\n    const nonce = generateNonce();\r\n    const signature = this.generateSignature(\r\n      method,\r\n      url,\r\n      timestamp,\r\n      nonce,\r\n      body\r\n    );\r\n\r\n    return [\r\n      `WECHATPAY2-SHA256-RSA2048 mchid=\"${this.mchId}\"`,\r\n      `nonce_str=\"${nonce}\"`,\r\n      `signature=\"${signature}\"`,\r\n      `timestamp=\"${timestamp}\"`,\r\n      `serial_no=\"${this.serialNo}\"`,\r\n    ].join(',');\r\n  }\r\n}\r\n\r\n/**\r\n * 微信支付V3 API客户端\r\n */\r\nexport class WechatPayV3Client {\r\n  private httpClient: HttpClient;\r\n  private signer: WechatPayV3Signer;\r\n  private sandbox: boolean;\r\n\r\n  constructor(\r\n    privateKey: string,\r\n    mchId: string,\r\n    serialNo: string,\r\n    sandbox = false\r\n  ) {\r\n    this.httpClient = new HttpClient();\r\n    this.signer = new WechatPayV3Signer(privateKey, mchId, serialNo);\r\n    this.sandbox = sandbox;\r\n  }\r\n\r\n  /**\r\n   * 获取API基础URL\r\n   */\r\n  private getBaseUrl(): string {\r\n    return this.sandbox\r\n      ? 'https://api.mch.weixin.qq.com' // 微信支付V3暂无沙箱环境\r\n      : WECHAT_PAY_API_BASE;\r\n  }\r\n\r\n  /**\r\n   * 发送微信支付API请求\r\n   */\r\n  async request<T = any>(method: string, path: string, data?: any): Promise<T> {\r\n    const url = `${this.getBaseUrl()}${path}`;\r\n    const body = data ? JSON.stringify(data) : '';\r\n\r\n    const headers = {\r\n      Authorization: this.signer.generateAuthorizationHeader(\r\n        method,\r\n        path,\r\n        body\r\n      ),\r\n      'Content-Type': 'application/json',\r\n      'User-Agent': 'PayStream/2.0.0',\r\n    };\r\n\r\n    try {\r\n      const response = await this.httpClient.request<T>({\r\n        url,\r\n        method: method as any,\r\n        headers,\r\n        data: data || undefined,\r\n      });\r\n\r\n      if (response.status >= 400) {\r\n        // 如果有data 有code 有message 则使用data.message\r\n        if (\r\n          response.data &&\r\n          typeof response.data === 'object' &&\r\n          'code' in response.data &&\r\n          'message' in response.data\r\n        ) {\r\n          throw new PaymentError(\r\n            PaymentErrorCode.NETWORK_ERROR,\r\n            `微信支付API请求失败: ${response.data.code} ${response.data.message}`,\r\n            response.data.message\r\n          );\r\n        }\r\n        throw new PaymentError(\r\n          PaymentErrorCode.NETWORK_ERROR,\r\n          `微信支付API请求失败: ${response.status} ${response.statusText}`,\r\n          response.data\r\n        );\r\n      }\r\n\r\n      return response.data;\r\n    } catch (error) {\r\n      if (error instanceof PaymentError) {\r\n        throw error;\r\n      }\r\n      throw new PaymentError(\r\n        PaymentErrorCode.NETWORK_ERROR,\r\n        '微信支付API请求异常',\r\n        error\r\n      );\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Native支付下单\r\n   */\r\n  async createNativeOrder(\r\n    params: WechatNativeOrderParams\r\n  ): Promise<WechatNativeOrderResponse> {\r\n    return this.request<WechatNativeOrderResponse>(\r\n      'POST',\r\n      '/v3/pay/transactions/native',\r\n      params\r\n    );\r\n  }\r\n\r\n  /**\r\n   * JSAPI支付下单\r\n   */\r\n  async createJSAPIOrder(\r\n    params: WechatJSAPIOrderParams\r\n  ): Promise<WechatJSAPIOrderResponse> {\r\n    return this.request<WechatJSAPIOrderResponse>(\r\n      'POST',\r\n      '/v3/pay/transactions/jsapi',\r\n      params\r\n    );\r\n  }\r\n\r\n  /**\r\n   * H5支付下单\r\n   */\r\n  async createH5Order(\r\n    params: WechatH5OrderParams\r\n  ): Promise<WechatH5OrderResponse> {\r\n    return this.request<WechatH5OrderResponse>(\r\n      'POST',\r\n      '/v3/pay/transactions/h5',\r\n      params\r\n    );\r\n  }\r\n\r\n  /**\r\n   * 查询订单（通过商户订单号）\r\n   */\r\n  async queryOrderByOutTradeNo(\r\n    outTradeNo: string,\r\n    mchId: string\r\n  ): Promise<WechatOrderQueryResponse> {\r\n    return this.request<WechatOrderQueryResponse>(\r\n      'GET',\r\n      `/v3/pay/transactions/out-trade-no/${outTradeNo}?mchid=${mchId}`\r\n    );\r\n  }\r\n\r\n  /**\r\n   * 查询订单（通过微信支付订单号）\r\n   */\r\n  async queryOrderByTransactionId(\r\n    transactionId: string,\r\n    mchId: string\r\n  ): Promise<WechatOrderQueryResponse> {\r\n    return this.request<WechatOrderQueryResponse>(\r\n      'GET',\r\n      `/v3/pay/transactions/id/${transactionId}?mchid=${mchId}`\r\n    );\r\n  }\r\n\r\n  /**\r\n   * 申请退款\r\n   */\r\n  async createRefund(\r\n    params: WechatRefundParams\r\n  ): Promise<WechatRefundResponse> {\r\n    return this.request<WechatRefundResponse>(\r\n      'POST',\r\n      '/v3/refund/domestic/refunds',\r\n      params\r\n    );\r\n  }\r\n\r\n  /**\r\n   * 查询退款\r\n   */\r\n  async queryRefund(outRefundNo: string): Promise<WechatRefundQueryResponse> {\r\n    return this.request<WechatRefundQueryResponse>(\r\n      'GET',\r\n      `/v3/refund/domestic/refunds/${outRefundNo}`\r\n    );\r\n  }\r\n}\r\n\r\n/**\r\n * 微信支付Native下单参数\r\n */\r\nexport interface WechatNativeOrderParams {\r\n  appid: string;\r\n  mchid: string;\r\n  description: string;\r\n  out_trade_no: string;\r\n  time_expire?: string;\r\n  attach?: string;\r\n  notify_url: string;\r\n  goods_tag?: string;\r\n  support_fapiao?: boolean;\r\n  amount: {\r\n    total: number;\r\n    currency?: string;\r\n  };\r\n  detail?: {\r\n    cost_price?: number;\r\n    invoice_id?: string;\r\n    goods_detail?: Array<{\r\n      merchant_goods_id: string;\r\n      wechatpay_goods_id?: string;\r\n      goods_name?: string;\r\n      quantity: number;\r\n      unit_price: number;\r\n    }>;\r\n  };\r\n  scene_info?: {\r\n    payer_client_ip: string;\r\n    device_id?: string;\r\n    store_info?: {\r\n      id: string;\r\n      name?: string;\r\n      area_code?: string;\r\n      address?: string;\r\n    };\r\n  };\r\n  settle_info?: {\r\n    profit_sharing?: boolean;\r\n  };\r\n}\r\n\r\n/**\r\n * 微信支付Native下单响应\r\n */\r\nexport interface WechatNativeOrderResponse {\r\n  code_url: string;\r\n}\r\n\r\n/**\r\n * 微信支付JSAPI下单参数\r\n */\r\nexport interface WechatJSAPIOrderParams\r\n  extends Omit<WechatNativeOrderParams, 'scene_info'> {\r\n  payer: {\r\n    openid: string;\r\n  };\r\n  scene_info?: {\r\n    payer_client_ip: string;\r\n    device_id?: string;\r\n    store_info?: {\r\n      id: string;\r\n      name?: string;\r\n      area_code?: string;\r\n      address?: string;\r\n    };\r\n  };\r\n}\r\n\r\n/**\r\n * 微信支付JSAPI下单响应\r\n */\r\nexport interface WechatJSAPIOrderResponse {\r\n  prepay_id: string;\r\n}\r\n\r\n/**\r\n * 微信支付H5下单参数\r\n */\r\nexport interface WechatH5OrderParams\r\n  extends Omit<WechatNativeOrderParams, 'scene_info'> {\r\n  scene_info: {\r\n    payer_client_ip: string;\r\n    device_id?: string;\r\n    h5_info: {\r\n      type: 'Wap' | 'iOS' | 'Android';\r\n      app_name?: string;\r\n      app_url?: string;\r\n      bundle_id?: string;\r\n      package_name?: string;\r\n    };\r\n  };\r\n}\r\n\r\n/**\r\n * 微信支付H5下单响应\r\n */\r\nexport interface WechatH5OrderResponse {\r\n  h5_url: string;\r\n}\r\n\r\n/**\r\n * 微信支付订单查询响应\r\n */\r\nexport interface WechatOrderQueryResponse {\r\n  appid: string;\r\n  mchid: string;\r\n  out_trade_no: string;\r\n  transaction_id: string;\r\n  trade_type: string;\r\n  trade_state: string;\r\n  trade_state_desc: string;\r\n  bank_type: string;\r\n  attach?: string;\r\n  success_time?: string;\r\n  payer: {\r\n    openid: string;\r\n  };\r\n  amount: {\r\n    total: number;\r\n    payer_total: number;\r\n    currency: string;\r\n    payer_currency: string;\r\n  };\r\n}\r\n\r\n/**\r\n * 微信支付退款参数\r\n */\r\nexport interface WechatRefundParams {\r\n  transaction_id?: string;\r\n  out_trade_no?: string;\r\n  out_refund_no: string;\r\n  reason?: string;\r\n  notify_url?: string;\r\n  funds_account?: string;\r\n  amount: {\r\n    refund: number;\r\n    total: number;\r\n    currency?: string;\r\n  };\r\n  goods_detail?: Array<{\r\n    merchant_goods_id: string;\r\n    wechatpay_goods_id?: string;\r\n    goods_name?: string;\r\n    unit_price: number;\r\n    refund_amount: number;\r\n    refund_quantity: number;\r\n  }>;\r\n}\r\n\r\n/**\r\n * 微信支付退款响应\r\n */\r\nexport interface WechatRefundResponse {\r\n  refund_id: string;\r\n  out_refund_no: string;\r\n  transaction_id: string;\r\n  out_trade_no: string;\r\n  channel: string;\r\n  user_received_account: string;\r\n  success_time?: string;\r\n  create_time: string;\r\n  status: string;\r\n  funds_account?: string;\r\n  amount: {\r\n    total: number;\r\n    refund: number;\r\n    payer_total: number;\r\n    payer_refund: number;\r\n    settlement_refund: number;\r\n    settlement_total: number;\r\n    discount_refund: number;\r\n    currency: string;\r\n  };\r\n}\r\n\r\n/**\r\n * 微信支付退款查询响应\r\n */\r\nexport interface WechatRefundQueryResponse extends WechatRefundResponse {\r\n  promotion_detail?: Array<{\r\n    promotion_id: string;\r\n    scope: string;\r\n    type: string;\r\n    amount: number;\r\n    refund_amount: number;\r\n    goods_detail?: Array<{\r\n      goods_id: string;\r\n      quantity: number;\r\n      unit_price: number;\r\n      discount_amount: number;\r\n      goods_remark?: string;\r\n    }>;\r\n  }>;\r\n}\r\n\r\n/**\r\n * 生成JSAPI支付参数\r\n */\r\nexport function generateJSAPIPayParams(\r\n  appId: string,\r\n  prepayId: string,\r\n  privateKey: string\r\n): {\r\n  appId: string;\r\n  timeStamp: string;\r\n  nonceStr: string;\r\n  package: string;\r\n  signType: string;\r\n  paySign: string;\r\n} {\r\n  const timeStamp = generateTimestamp().toString();\r\n  const nonceStr = generateNonce();\r\n  const packageStr = `prepay_id=${prepayId}`;\r\n  const signType = 'RSA';\r\n\r\n  // 构建待签名字符串\r\n  const signString = [appId, timeStamp, nonceStr, packageStr].join('\\n') + '\\n';\r\n\r\n  // 生成签名\r\n  const sign = createSign('RSA-SHA256');\r\n  sign.update(signString, 'utf8');\r\n  const paySign = sign.sign(privateKey, 'base64');\r\n\r\n  return {\r\n    appId,\r\n    timeStamp,\r\n    nonceStr,\r\n    package: packageStr,\r\n    signType,\r\n    paySign,\r\n  };\r\n}\r\n","import { createHash, createHmac } from 'crypto';\r\nimport { PaymentError, PaymentErrorCode } from '../types/payment';\r\nimport { generateNonce } from './crypto';\r\nimport { HttpClient } from './http';\r\n\r\n/**\r\n * 微信支付V2 API基础URL\r\n */\r\nexport const WECHAT_PAY_V2_API_BASE = 'https://api.mch.weixin.qq.com';\r\n\r\n/**\r\n * 微信支付V2付款码支付请求参数\r\n */\r\nexport interface WechatV2MicropayRequest {\r\n  /** 公众账号ID */\r\n  appid: string;\r\n  /** 商户号 */\r\n  mch_id: string;\r\n  /** 设备号 */\r\n  device_info?: string;\r\n  /** 随机字符串 */\r\n  nonce_str: string;\r\n  /** 签名 */\r\n  sign: string;\r\n  /** 签名类型 */\r\n  sign_type?: 'MD5' | 'HMAC-SHA256';\r\n  /** 商品描述 */\r\n  body: string;\r\n  /** 商品详情 */\r\n  detail?: string;\r\n  /** 附加数据 */\r\n  attach?: string;\r\n  /** 商户订单号 */\r\n  out_trade_no: string;\r\n  /** 订单金额 */\r\n  total_fee: number;\r\n  /** 货币类型 */\r\n  fee_type?: string;\r\n  /** 终端IP */\r\n  spbill_create_ip: string;\r\n  /** 订单优惠标记 */\r\n  goods_tag?: string;\r\n  /** 指定支付方式 */\r\n  limit_pay?: string;\r\n  /** 交易起始时间 */\r\n  time_start?: string;\r\n  /** 交易结束时间 */\r\n  time_expire?: string;\r\n  /** 电子发票入口开放标识 */\r\n  receipt?: string;\r\n  /** 付款码 */\r\n  auth_code: string;\r\n  /** 是否需要分账 */\r\n  profit_sharing?: string;\r\n  /** 场景信息 */\r\n  scene_info?: string;\r\n}\r\n\r\n/**\r\n * 微信支付V2付款码支付响应\r\n */\r\nexport interface WechatV2MicropayResponse {\r\n  /** 返回状态码 */\r\n  return_code: string;\r\n  /** 返回信息 */\r\n  return_msg: string;\r\n  /** 公众账号ID */\r\n  appid?: string;\r\n  /** 商户号 */\r\n  mch_id?: string;\r\n  /** 设备号 */\r\n  device_info?: string;\r\n  /** 随机字符串 */\r\n  nonce_str?: string;\r\n  /** 签名 */\r\n  sign?: string;\r\n  /** 业务结果 */\r\n  result_code?: string;\r\n  /** 错误代码 */\r\n  err_code?: string;\r\n  /** 错误代码描述 */\r\n  err_code_des?: string;\r\n  /** 用户标识 */\r\n  openid?: string;\r\n  /** 是否关注公众账号 */\r\n  is_subscribe?: string;\r\n  /** 交易类型 */\r\n  trade_type?: string;\r\n  /** 付款银行 */\r\n  bank_type?: string;\r\n  /** 货币类型 */\r\n  fee_type?: string;\r\n  /** 订单金额 */\r\n  total_fee?: number;\r\n  /** 应结订单金额 */\r\n  settlement_total_fee?: number;\r\n  /** 代金券金额 */\r\n  coupon_fee?: number;\r\n  /** 现金支付货币类型 */\r\n  cash_fee_type?: string;\r\n  /** 现金支付金额 */\r\n  cash_fee?: number;\r\n  /** 微信支付订单号 */\r\n  transaction_id?: string;\r\n  /** 商户订单号 */\r\n  out_trade_no?: string;\r\n  /** 商家数据包 */\r\n  attach?: string;\r\n  /** 支付完成时间 */\r\n  time_end?: string;\r\n  /** 营销详情 */\r\n  promotion_detail?: string;\r\n}\r\n\r\n/**\r\n * 微信支付V2订单查询请求参数\r\n */\r\nexport interface WechatV2OrderQueryRequest {\r\n  /** 公众账号ID */\r\n  appid: string;\r\n  /** 商户号 */\r\n  mch_id: string;\r\n  /** 微信支付订单号 */\r\n  transaction_id?: string;\r\n  /** 商户订单号 */\r\n  out_trade_no?: string;\r\n  /** 随机字符串 */\r\n  nonce_str: string;\r\n  /** 签名 */\r\n  sign: string;\r\n  /** 签名类型 */\r\n  sign_type?: 'MD5' | 'HMAC-SHA256';\r\n}\r\n\r\n/**\r\n * 微信支付V2订单查询响应\r\n */\r\nexport interface WechatV2OrderQueryResponse extends WechatV2MicropayResponse {\r\n  /** 交易状态 */\r\n  trade_state?: string;\r\n  /** 交易状态描述 */\r\n  trade_state_desc?: string;\r\n}\r\n\r\n/**\r\n * 微信支付V2撤销订单请求参数\r\n */\r\nexport interface WechatV2ReverseRequest {\r\n  /** 公众账号ID */\r\n  appid: string;\r\n  /** 商户号 */\r\n  mch_id: string;\r\n  /** 微信支付订单号 */\r\n  transaction_id?: string;\r\n  /** 商户订单号 */\r\n  out_trade_no?: string;\r\n  /** 随机字符串 */\r\n  nonce_str: string;\r\n  /** 签名 */\r\n  sign: string;\r\n  /** 签名类型 */\r\n  sign_type?: 'MD5' | 'HMAC-SHA256';\r\n}\r\n\r\n/**\r\n * 微信支付V2撤销订单响应\r\n */\r\nexport interface WechatV2ReverseResponse {\r\n  /** 返回状态码 */\r\n  return_code: string;\r\n  /** 返回信息 */\r\n  return_msg: string;\r\n  /** 公众账号ID */\r\n  appid?: string;\r\n  /** 商户号 */\r\n  mch_id?: string;\r\n  /** 随机字符串 */\r\n  nonce_str?: string;\r\n  /** 签名 */\r\n  sign?: string;\r\n  /** 业务结果 */\r\n  result_code?: string;\r\n  /** 错误代码 */\r\n  err_code?: string;\r\n  /** 错误代码描述 */\r\n  err_code_des?: string;\r\n  /** 是否重调 */\r\n  recall?: string;\r\n}\r\n\r\nexport class WechatPayV2Client {\r\n  private httpClient: HttpClient;\r\n  private sandbox: boolean;\r\n  private appId: string;\r\n  private mchId: string;\r\n  private apiKey: string;\r\n  private signType: 'MD5' | 'HMAC-SHA256';\r\n\r\n  constructor(\r\n    appId: string,\r\n    mchId: string,\r\n    apiKey: string,\r\n    signType: 'MD5' | 'HMAC-SHA256' = 'MD5',\r\n    sandbox = false\r\n  ) {\r\n    this.httpClient = new HttpClient();\r\n    this.sandbox = sandbox;\r\n    this.appId = appId;\r\n    this.mchId = mchId;\r\n    this.apiKey = apiKey;\r\n    this.signType = signType;\r\n  }\r\n\r\n  /**\r\n   * 获取API基础URL\r\n   */\r\n  private getBaseUrl(): string {\r\n    return this.sandbox ? WECHAT_PAY_V2_API_BASE : WECHAT_PAY_V2_API_BASE;\r\n  }\r\n\r\n  /**\r\n   * 生成微信支付V2签名\r\n   */\r\n  public generateSignature(params: Record<string, any>): string {\r\n    // 过滤空值和sign字段\r\n    const filteredParams = Object.keys(params)\r\n      .filter(\r\n        key => params[key] !== undefined && params[key] !== '' && key !== 'sign'\r\n      )\r\n      .sort()\r\n      .reduce(\r\n        (obj, key) => {\r\n          obj[key] = params[key];\r\n          return obj;\r\n        },\r\n        {} as Record<string, any>\r\n      );\r\n\r\n    // 构建待签名字符串\r\n    const signString =\r\n      Object.keys(filteredParams)\r\n        .map(key => `${key}=${filteredParams[key]}`)\r\n        .join('&') + `&key=${this.apiKey}`;\r\n\r\n    // 生成签名\r\n    if (this.signType === 'HMAC-SHA256') {\r\n      return createHmac('sha256', this.apiKey)\r\n        .update(signString, 'utf8')\r\n        .digest('hex')\r\n        .toUpperCase();\r\n    } else {\r\n      return createHash('md5')\r\n        .update(signString, 'utf8')\r\n        .digest('hex')\r\n        .toUpperCase();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 验证微信支付V2签名\r\n   */\r\n  private verifySignature(params: Record<string, any>): boolean {\r\n    const receivedSign = params.sign;\r\n    const calculatedSign = this.generateSignature(params);\r\n    return receivedSign === calculatedSign;\r\n  }\r\n\r\n  /**\r\n   * 将对象转换为XML格式\r\n   */\r\n  private objectToXml(obj: Record<string, any>): string {\r\n    let xml = '<xml>';\r\n    for (const [key, value] of Object.entries(obj)) {\r\n      if (value !== undefined && value !== '') {\r\n        xml += `<${key}><![CDATA[${value}]]></${key}>`;\r\n      }\r\n    }\r\n    xml += '</xml>';\r\n    return xml;\r\n  }\r\n\r\n  /**\r\n   * 将XML转换为对象\r\n   */\r\n  private xmlToObject(xml: string): Record<string, any> {\r\n    const obj: Record<string, any> = {};\r\n    const regex = /<(\\w+)>(?:<!\\[CDATA\\[)?(.*?)(?:\\]\\]>)?<\\/\\1>/g;\r\n    let match;\r\n\r\n    while ((match = regex.exec(xml)) !== null) {\r\n      const key = match[1];\r\n      const value = match[2];\r\n      obj[key] = value;\r\n    }\r\n\r\n    return obj;\r\n  }\r\n\r\n  /**\r\n   * 发送微信支付V2 API请求\r\n   */\r\n  private async request<T = any>(\r\n    path: string,\r\n    data: Record<string, any>\r\n  ): Promise<T> {\r\n    const url = `${this.getBaseUrl()}${path}`;\r\n    const xmlData = this.objectToXml(data);\r\n\r\n    try {\r\n      const response = await this.httpClient.post(url, xmlData, {\r\n        'Content-Type': 'application/xml',\r\n        'User-Agent': 'PayStream/2.0.0',\r\n      });\r\n\r\n      if (response.status >= 400) {\r\n        throw new PaymentError(\r\n          PaymentErrorCode.NETWORK_ERROR,\r\n          `微信支付V2 API请求失败: ${response.status} ${response.statusText}`,\r\n          response.data\r\n        );\r\n      }\r\n\r\n      const result = this.xmlToObject(response.data as string);\r\n\r\n      // 验证返回签名\r\n      if (result.return_code === 'SUCCESS' && !this.verifySignature(result)) {\r\n        throw new PaymentError(\r\n          PaymentErrorCode.VERIFY_FAILED,\r\n          '微信支付V2响应签名验证失败',\r\n          result\r\n        );\r\n      }\r\n\r\n      return result as T;\r\n    } catch (error) {\r\n      if (error instanceof PaymentError) {\r\n        throw error;\r\n      }\r\n      throw new PaymentError(\r\n        PaymentErrorCode.NETWORK_ERROR,\r\n        '微信支付V2 API请求异常',\r\n        error\r\n      );\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 付款码支付\r\n   */\r\n  async micropay(params: {\r\n    body: string;\r\n    out_trade_no: string;\r\n    total_fee: number;\r\n    spbill_create_ip: string;\r\n    auth_code: string;\r\n    device_info?: string;\r\n    detail?: string;\r\n    attach?: string;\r\n    fee_type?: string;\r\n    goods_tag?: string;\r\n    limit_pay?: string;\r\n    time_start?: string;\r\n    time_expire?: string;\r\n    receipt?: string;\r\n    profit_sharing?: string;\r\n    scene_info?: {\r\n      store_info?: {\r\n        id: string;\r\n        name?: string;\r\n        area_code?: string;\r\n        address?: string;\r\n      };\r\n    };\r\n  }): Promise<WechatV2MicropayResponse> {\r\n    const requestData: WechatV2MicropayRequest = {\r\n      appid: this.appId,\r\n      mch_id: this.mchId,\r\n      nonce_str: generateNonce(),\r\n      sign_type: this.signType,\r\n      body: params.body,\r\n      out_trade_no: params.out_trade_no,\r\n      total_fee: params.total_fee,\r\n      spbill_create_ip: params.spbill_create_ip,\r\n      auth_code: params.auth_code,\r\n      device_info: params.device_info,\r\n      detail: params.detail,\r\n      attach: params.attach,\r\n      fee_type: params.fee_type || 'CNY',\r\n      goods_tag: params.goods_tag,\r\n      limit_pay: params.limit_pay,\r\n      time_start: params.time_start,\r\n      time_expire: params.time_expire,\r\n      receipt: params.receipt,\r\n      profit_sharing: params.profit_sharing,\r\n      scene_info: params.scene_info\r\n        ? JSON.stringify(params.scene_info)\r\n        : undefined,\r\n      sign: '', // 临时占位，下面会生成真实签名\r\n    };\r\n\r\n    // 生成签名\r\n    requestData.sign = this.generateSignature(requestData);\r\n\r\n    return this.request<WechatV2MicropayResponse>('/pay/micropay', requestData);\r\n  }\r\n\r\n  /**\r\n   * 查询订单\r\n   */\r\n  async queryOrder(params: {\r\n    transaction_id?: string;\r\n    out_trade_no?: string;\r\n  }): Promise<WechatV2OrderQueryResponse> {\r\n    if (!params.transaction_id && !params.out_trade_no) {\r\n      throw new PaymentError(\r\n        PaymentErrorCode.INVALID_PARAMS,\r\n        '微信支付订单号和商户订单号不能同时为空'\r\n      );\r\n    }\r\n\r\n    const requestData: WechatV2OrderQueryRequest = {\r\n      appid: this.appId,\r\n      mch_id: this.mchId,\r\n      transaction_id: params.transaction_id,\r\n      out_trade_no: params.out_trade_no,\r\n      nonce_str: generateNonce(),\r\n      sign_type: this.signType,\r\n      sign: '', // 临时占位，下面会生成真实签名\r\n    };\r\n\r\n    // 生成签名\r\n    requestData.sign = this.generateSignature(requestData);\r\n\r\n    return this.request<WechatV2OrderQueryResponse>(\r\n      '/pay/orderquery',\r\n      requestData\r\n    );\r\n  }\r\n\r\n  /**\r\n   * 撤销订单\r\n   */\r\n  async reverseOrder(params: {\r\n    transaction_id?: string;\r\n    out_trade_no?: string;\r\n  }): Promise<WechatV2ReverseResponse> {\r\n    if (!params.transaction_id && !params.out_trade_no) {\r\n      throw new PaymentError(\r\n        PaymentErrorCode.INVALID_PARAMS,\r\n        '微信支付订单号和商户订单号不能同时为空'\r\n      );\r\n    }\r\n\r\n    const requestData: WechatV2ReverseRequest = {\r\n      appid: this.appId,\r\n      mch_id: this.mchId,\r\n      transaction_id: params.transaction_id,\r\n      out_trade_no: params.out_trade_no,\r\n      nonce_str: generateNonce(),\r\n      sign_type: this.signType,\r\n      sign: '', // 临时占位，下面会生成真实签名\r\n    };\r\n\r\n    // 生成签名\r\n    requestData.sign = this.generateSignature(requestData);\r\n\r\n    return this.request<WechatV2ReverseResponse>(\r\n      '/secapi/pay/reverse',\r\n      requestData\r\n    );\r\n  }\r\n\r\n  /**\r\n   * 处理付款码支付流程（包含重试逻辑）\r\n   */\r\n  async processMicropay(params: {\r\n    body: string;\r\n    out_trade_no: string;\r\n    total_fee: number;\r\n    spbill_create_ip: string;\r\n    auth_code: string;\r\n    device_info?: string;\r\n    detail?: string;\r\n    attach?: string;\r\n    fee_type?: string;\r\n    goods_tag?: string;\r\n    limit_pay?: string;\r\n    time_start?: string;\r\n    time_expire?: string;\r\n    receipt?: string;\r\n    profit_sharing?: string;\r\n    scene_info?: {\r\n      store_info?: {\r\n        id: string;\r\n        name?: string;\r\n        area_code?: string;\r\n        address?: string;\r\n      };\r\n    };\r\n  }): Promise<WechatV2MicropayResponse> {\r\n    try {\r\n      const result = await this.micropay(params);\r\n\r\n      // 支付成功\r\n      if (\r\n        result.return_code === 'SUCCESS' &&\r\n        result.result_code === 'SUCCESS'\r\n      ) {\r\n        return result;\r\n      }\r\n\r\n      // 系统错误，需要查询订单状态\r\n      if (result.err_code === 'SYSTEMERROR') {\r\n        await this.sleep(5000); // 等待5秒\r\n        const queryResult = await this.queryOrder({\r\n          out_trade_no: params.out_trade_no,\r\n        });\r\n\r\n        if (\r\n          queryResult.return_code === 'SUCCESS' &&\r\n          queryResult.result_code === 'SUCCESS'\r\n        ) {\r\n          return queryResult as WechatV2MicropayResponse;\r\n        }\r\n\r\n        // 如果查询结果不明确，调用撤销订单\r\n        if (\r\n          queryResult.trade_state === 'NOTPAY' ||\r\n          queryResult.trade_state === 'PAYERROR'\r\n        ) {\r\n          await this.reverseOrder({ out_trade_no: params.out_trade_no });\r\n        }\r\n\r\n        throw new PaymentError(\r\n          PaymentErrorCode.NETWORK_ERROR,\r\n          '系统错误，支付状态不明确',\r\n          result\r\n        );\r\n      }\r\n\r\n      // 用户支付中，需要轮询查询\r\n      if (result.err_code === 'USERPAYING') {\r\n        return this.pollPaymentResult(params.out_trade_no, 45000); // 轮询45秒\r\n      }\r\n\r\n      // 其他错误直接返回\r\n      throw new PaymentError(\r\n        PaymentErrorCode.NETWORK_ERROR,\r\n        result.err_code_des || result.return_msg || '付款码支付失败',\r\n        result\r\n      );\r\n    } catch (error) {\r\n      if (error instanceof PaymentError) {\r\n        throw error;\r\n      }\r\n      throw new PaymentError(\r\n        PaymentErrorCode.NETWORK_ERROR,\r\n        '付款码支付异常',\r\n        error\r\n      );\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 轮询支付结果\r\n   */\r\n  private async pollPaymentResult(\r\n    outTradeNo: string,\r\n    timeout: number = 45000\r\n  ): Promise<WechatV2MicropayResponse> {\r\n    const startTime = Date.now();\r\n    const interval = 10000; // 10秒间隔\r\n\r\n    while (Date.now() - startTime < timeout) {\r\n      await this.sleep(interval);\r\n\r\n      try {\r\n        const queryResult = await this.queryOrder({ out_trade_no: outTradeNo });\r\n\r\n        if (\r\n          queryResult.return_code === 'SUCCESS' &&\r\n          queryResult.result_code === 'SUCCESS'\r\n        ) {\r\n          return queryResult as WechatV2MicropayResponse;\r\n        }\r\n\r\n        // 支付失败或订单关闭\r\n        if (\r\n          queryResult.trade_state === 'PAYERROR' ||\r\n          queryResult.trade_state === 'CLOSED'\r\n        ) {\r\n          throw new PaymentError(\r\n            PaymentErrorCode.NETWORK_ERROR,\r\n            queryResult.trade_state_desc || '支付失败',\r\n            queryResult\r\n          );\r\n        }\r\n      } catch (error) {\r\n        // 查询异常，继续轮询\r\n        console.warn('查询订单异常:', error);\r\n      }\r\n    }\r\n\r\n    // 超时后尝试撤销订单\r\n    try {\r\n      await this.reverseOrder({ out_trade_no: outTradeNo });\r\n    } catch (error) {\r\n      console.warn('撤销订单失败:', error);\r\n    }\r\n\r\n    throw new PaymentError(\r\n      PaymentErrorCode.NETWORK_ERROR,\r\n      '支付超时，订单已撤销',\r\n      { out_trade_no: outTradeNo }\r\n    );\r\n  }\r\n\r\n  /**\r\n   * 延时函数\r\n   */\r\n  private sleep(ms: number): Promise<void> {\r\n    return new Promise(resolve => setTimeout(resolve, ms));\r\n  }\r\n}\r\n","import {\r\n  BaseProvider,\r\n  BaseProviderConfig,\r\n  VerifyResult,\r\n} from '../base/BaseProvider';\r\nimport {\r\n  UnifiedPaymentNotification,\r\n  PaymentNotifyPayload,\r\n  PaymentError,\r\n  PaymentErrorCode,\r\n  WechatPayMethod,\r\n  CreateOrderRequest,\r\n  CreateOrderResponse,\r\n  QueryOrderRequest,\r\n  QueryOrderResponse,\r\n  RefundRequest,\r\n  RefundResponse,\r\n  WechatCreateOrderRequest,\r\n} from '../../types/payment';\r\nimport { aesGcmDecrypt, verifyWechatSignature } from '../../utils/crypto';\r\nimport {\r\n  WechatPayV3Client,\r\n  generateJSAPIPayParams,\r\n  WechatNativeOrderParams,\r\n  WechatJSAPIOrderParams,\r\n  WechatH5OrderParams,\r\n  WechatNativeOrderResponse,\r\n  WechatJSAPIOrderResponse,\r\n  WechatH5OrderResponse,\r\n  WechatOrderQueryResponse,\r\n} from '../../utils/wechat';\r\nimport { WechatPayV2Client } from '../../utils/wechat-v2';\r\n\r\n/**\r\n * 微信支付回调数据结构\r\n */\r\ninterface WechatNotification {\r\n  /** 通知ID */\r\n  id: string;\r\n  /** 通知创建时间 */\r\n  create_time: string;\r\n  /** 通知事件类型 */\r\n  event_type: string;\r\n  /** 通知资源类型 */\r\n  resource_type: string;\r\n  /** 通知资源数据 */\r\n  resource: {\r\n    /** 加密数据 */\r\n    ciphertext: string;\r\n    /** 随机串 */\r\n    nonce: string;\r\n    /** 附加数据 */\r\n    associated_data: string;\r\n  };\r\n}\r\n\r\n/**\r\n * 解密后的微信支付数据\r\n */\r\ninterface WechatTransactionData {\r\n  /** 商户号 */\r\n  mchid: string;\r\n  /** 应用ID */\r\n  appid: string;\r\n  /** 商户订单号 */\r\n  out_trade_no: string;\r\n  /** 微信支付订单号 */\r\n  transaction_id: string;\r\n  /** 交易类型 */\r\n  trade_type: string;\r\n  /** 交易状态 */\r\n  trade_state: string;\r\n  /** 交易状态描述 */\r\n  trade_state_desc: string;\r\n  /** 付款银行类型 */\r\n  bank_type: string;\r\n  /** 附加数据 */\r\n  attach?: string;\r\n  /** 支付完成时间 */\r\n  success_time: string;\r\n  /** 支付者信息 */\r\n  payer: {\r\n    /** 用户标识 */\r\n    openid: string;\r\n  };\r\n  /** 订单金额信息 */\r\n  amount: {\r\n    /** 订单总金额 */\r\n    total: number;\r\n    /** 用户支付金额 */\r\n    payer_total: number;\r\n    /** 货币类型 */\r\n    currency: string;\r\n    /** 用户支付币种 */\r\n    payer_currency: string;\r\n  };\r\n}\r\n\r\n/**\r\n * 微信支付 Provider 配置接口\r\n */\r\nexport interface WechatProviderConfig extends BaseProviderConfig {\r\n  /** 应用ID */\r\n  appId: string;\r\n  /** 商户号 */\r\n  mchId: string;\r\n  /** API v3 密钥 */\r\n  apiV3Key: string;\r\n  /** API v2 密钥 [可选，扫码枪支付必填] */\r\n  apiV2Key?: string;\r\n  /** 私钥内容或路径 */\r\n  privateKey: string;\r\n  /** 证书序列号 */\r\n  serialNo: string;\r\n  /** 微信支付平台证书（验签用） */\r\n  platformCertificate?: string;\r\n}\r\n\r\n/**\r\n * 微信支付 Provider 实现\r\n */\r\nexport class WechatProvider extends BaseProvider<WechatProviderConfig> {\r\n  private readonly supportedMethods: WechatPayMethod[] = [\r\n    'native',\r\n    'jsapi',\r\n    'h5',\r\n    'app',\r\n  ];\r\n\r\n  private wechatClient: WechatPayV3Client;\r\n\r\n  constructor(config: WechatProviderConfig) {\r\n    super(config, 'wechat');\r\n    this.wechatClient = new WechatPayV3Client(\r\n      config.privateKey,\r\n      config.mchId,\r\n      config.serialNo,\r\n      config.sandbox\r\n    );\r\n  }\r\n\r\n  /**\r\n   * 验证配置\r\n   */\r\n  protected validateConfig(): void {\r\n    const required = ['appId', 'mchId', 'apiV3Key', 'privateKey', 'serialNo'];\r\n\r\n    for (const key of required) {\r\n      if (!this.config[key as keyof WechatProviderConfig]) {\r\n        throw new PaymentError(\r\n          PaymentErrorCode.CONFIG_ERROR,\r\n          `微信支付配置缺少必要参数: ${key}`\r\n        );\r\n      }\r\n    }\r\n\r\n    // 验证 appId 格式\r\n    if (!this.config.appId.startsWith('wx')) {\r\n      throw new PaymentError(\r\n        PaymentErrorCode.CONFIG_ERROR,\r\n        '微信支付 appId 格式错误，应以 \"wx\" 开头'\r\n      );\r\n    }\r\n\r\n    // 验证商户号格式\r\n    if (!/^\\d{10}$/.test(this.config.mchId)) {\r\n      throw new PaymentError(\r\n        PaymentErrorCode.CONFIG_ERROR,\r\n        '微信支付商户号格式错误，应为10位数字'\r\n      );\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 验证载荷格式\r\n   */\r\n  protected validatePayload(payload: PaymentNotifyPayload): void {\r\n    if (!payload.raw) {\r\n      throw new PaymentError(\r\n        PaymentErrorCode.INVALID_PARAMS,\r\n        '微信支付回调数据为空'\r\n      );\r\n    }\r\n\r\n    const notification = payload.raw as WechatNotification;\r\n\r\n    // 检查必要字段\r\n    if (!notification.id || !notification.resource) {\r\n      throw new PaymentError(\r\n        PaymentErrorCode.INVALID_PARAMS,\r\n        '微信支付回调数据格式错误'\r\n      );\r\n    }\r\n\r\n    // 检查加密数据\r\n    const { ciphertext, nonce, associated_data } = notification.resource;\r\n    if (!ciphertext || !nonce || !associated_data) {\r\n      throw new PaymentError(\r\n        PaymentErrorCode.INVALID_PARAMS,\r\n        '微信支付回调缺少加密数据'\r\n      );\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 验证签名\r\n   */\r\n  protected async verifySignature(\r\n    payload: PaymentNotifyPayload\r\n  ): Promise<VerifyResult> {\r\n    try {\r\n      const { headers, raw } = payload;\r\n\r\n      if (!headers) {\r\n        return {\r\n          success: false,\r\n          error: '缺少请求头信息',\r\n        };\r\n      }\r\n\r\n      // 获取签名相关头部\r\n      const timestamp = headers['wechatpay-timestamp'];\r\n      const nonce = headers['wechatpay-nonce'];\r\n      const signature = headers['wechatpay-signature'];\r\n      const serial = headers['wechatpay-serial'];\r\n\r\n      if (!timestamp || !nonce || !signature || !serial) {\r\n        return {\r\n          success: false,\r\n          error: '缺少必要的签名头部信息',\r\n        };\r\n      }\r\n\r\n      // 构建待验签字符串\r\n      const body = typeof raw === 'string' ? raw : JSON.stringify(raw);\r\n\r\n      // 验证签名\r\n      const isValid = verifyWechatSignature(\r\n        timestamp,\r\n        nonce,\r\n        body,\r\n        signature,\r\n        this.config.platformCertificate || ''\r\n      );\r\n\r\n      return {\r\n        success: isValid,\r\n        error: isValid ? undefined : '签名验证失败',\r\n        details: {\r\n          timestamp,\r\n          nonce,\r\n          serial,\r\n        },\r\n      };\r\n    } catch (error) {\r\n      return {\r\n        success: false,\r\n        error: `签名验证过程出错: ${error}`,\r\n      };\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 转换通知数据为统一格式\r\n   */\r\n  protected async transformNotification(\r\n    payload: PaymentNotifyPayload\r\n  ): Promise<UnifiedPaymentNotification> {\r\n    const notification = payload.raw as WechatNotification;\r\n\r\n    // 解密数据\r\n    const decryptedData = aesGcmDecrypt(\r\n      notification.resource.ciphertext,\r\n      this.config.apiV3Key,\r\n      notification.resource.nonce,\r\n      notification.resource.associated_data\r\n    );\r\n\r\n    const transactionData: WechatTransactionData = JSON.parse(decryptedData);\r\n\r\n    // 转换为统一格式\r\n    const result: UnifiedPaymentNotification = {\r\n      provider: 'wechat',\r\n      tradeStatus: this.mapTradeStatus(transactionData.trade_state),\r\n      outTradeNo: transactionData.out_trade_no,\r\n      tradeNo: transactionData.transaction_id,\r\n      totalAmount: transactionData.amount.total,\r\n      payerId: transactionData.payer.openid,\r\n      raw: transactionData,\r\n      timestamp: Date.now(),\r\n    };\r\n\r\n    return result;\r\n  }\r\n\r\n  /**\r\n   * 映射微信支付交易状态到统一状态\r\n   */\r\n  private mapTradeStatus(\r\n    tradeState: string\r\n  ): UnifiedPaymentNotification['tradeStatus'] {\r\n    switch (tradeState) {\r\n      case 'SUCCESS':\r\n        return 'SUCCESS';\r\n      case 'REFUND':\r\n      case 'CLOSED':\r\n      case 'REVOKED':\r\n      case 'PAYERROR':\r\n        return 'FAIL';\r\n      case 'USERPAYING':\r\n      case 'NOTPAY':\r\n        return 'PENDING';\r\n      default:\r\n        return 'PENDING';\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 生成成功响应\r\n   */\r\n  generateSuccessResponse(): object {\r\n    return {\r\n      code: 'SUCCESS',\r\n      message: '成功',\r\n    };\r\n  }\r\n\r\n  /**\r\n   * 生成失败响应\r\n   */\r\n  generateFailureResponse(error?: string): object {\r\n    return {\r\n      code: 'FAIL',\r\n      message: error || '处理失败',\r\n    };\r\n  }\r\n\r\n  /**\r\n   * 获取支持的支付方式\r\n   */\r\n  getSupportedMethods(): string[] {\r\n    return this.supportedMethods.map(method => `wechat.${method}`);\r\n  }\r\n\r\n  /**\r\n   * 后处理逻辑\r\n   */\r\n  protected async postProcess(\r\n    notification: UnifiedPaymentNotification,\r\n    _originalPayload: PaymentNotifyPayload\r\n  ): Promise<void> {\r\n    // 记录处理日志\r\n    if (this.config.sandbox) {\r\n      console.log('🧪 微信支付沙箱环境处理完成:', {\r\n        outTradeNo: notification.outTradeNo,\r\n        tradeNo: notification.tradeNo,\r\n        status: notification.tradeStatus,\r\n        amount: notification.totalAmount,\r\n      });\r\n    }\r\n\r\n    // 可以在这里添加其他后处理逻辑，如数据持久化、缓存等\r\n  }\r\n\r\n  /**\r\n   * 创建响应对象\r\n   */\r\n  createResponse(\r\n    success: boolean,\r\n    _error?: string\r\n  ): {\r\n    status: number;\r\n    body: object;\r\n    headers: Record<string, string>;\r\n  } {\r\n    return {\r\n      status: success ? 200 : 400,\r\n      body: success\r\n        ? this.generateSuccessResponse()\r\n        : this.generateFailureResponse(),\r\n      headers: {\r\n        'Content-Type': 'application/json',\r\n      },\r\n    };\r\n  }\r\n\r\n  /**\r\n   * 创建支付订单\r\n   */\r\n  async createOrder(\r\n    method: string,\r\n    request: CreateOrderRequest\r\n  ): Promise<CreateOrderResponse> {\r\n    try {\r\n      const wechatMethod = method.replace('wechat.', '') as WechatPayMethod;\r\n\r\n      if (!this.supportedMethods.includes(wechatMethod)) {\r\n        throw new Error(\r\n          `不支持的支付方式: ${method}, 支持的支付方式: ${this.supportedMethods\r\n            .map(method => `wechat.${method}`)\r\n            .join(', ')}`\r\n        );\r\n      }\r\n\r\n      // 确保 notify_url 不为空\r\n      if (!request.notifyUrl) {\r\n        throw new Error('notify_url 是必需的');\r\n      }\r\n\r\n      let result:\r\n        | WechatNativeOrderResponse\r\n        | WechatJSAPIOrderResponse\r\n        | WechatH5OrderResponse;\r\n      const paymentData: Record<string, unknown> = {};\r\n\r\n      switch (wechatMethod) {\r\n        case 'native':\r\n          result = await this.createNativePayment(request);\r\n          paymentData.qrCode = (result as WechatNativeOrderResponse).code_url;\r\n          break;\r\n\r\n        case 'jsapi':\r\n          result = await this.createJSAPIPayment(request);\r\n          paymentData.payParams = generateJSAPIPayParams(\r\n            this.config.appId,\r\n            (result as WechatJSAPIOrderResponse).prepay_id,\r\n            this.config.privateKey\r\n          );\r\n          break;\r\n\r\n        case 'h5':\r\n          result = await this.createH5Payment(request);\r\n          paymentData.payUrl = (result as WechatH5OrderResponse).h5_url;\r\n          break;\r\n\r\n        default:\r\n          throw new Error(`不支持的微信支付方式: ${wechatMethod}`);\r\n      }\r\n\r\n      return {\r\n        success: true,\r\n        tradeNo: request.outTradeNo,\r\n        paymentData,\r\n        raw: result,\r\n      };\r\n    } catch (error) {\r\n      return {\r\n        success: false,\r\n        error: error instanceof Error ? error.message : '创建订单失败',\r\n      };\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 创建 Native 支付订单\r\n   */\r\n  private async createNativePayment(request: CreateOrderRequest) {\r\n    const params: WechatNativeOrderParams = {\r\n      ...this.buildBaseOrderParams(request),\r\n      scene_info: {\r\n        payer_client_ip: request.clientIp || '127.0.0.1',\r\n      },\r\n    };\r\n    return await this.wechatClient.createNativeOrder(params);\r\n  }\r\n\r\n  /**\r\n   * 利用v2接口来支持付款码条码付款\r\n   * 付款码支付必填参数：authCode、deviceInfo\r\n   */\r\n  public async createMicropay(request: CreateOrderRequest) {\r\n    // 判断 apiV2Key\r\n    if (!this.config.apiV2Key) {\r\n      throw new Error('扫码支付必须配置apiV2Key');\r\n    }\r\n\r\n    const client = new WechatPayV2Client(\r\n      this.config.appId,\r\n      this.config.mchId,\r\n      this.config.apiV2Key,\r\n      'MD5'\r\n    );\r\n    if (!request.authCode) {\r\n      throw new Error('authCode is required');\r\n    }\r\n    if (!request.deviceInfo) {\r\n      throw new Error('deviceInfo is required');\r\n    }\r\n\r\n    return client.micropay({\r\n      auth_code: request.authCode,\r\n      body: request.subject,\r\n      out_trade_no: request.outTradeNo,\r\n      total_fee: request.totalAmount,\r\n      spbill_create_ip: request.clientIp || '127.0.0.1',\r\n      device_info: request.deviceInfo,\r\n      detail: request.body,\r\n    });\r\n  }\r\n\r\n  /**\r\n   * 创建 JSAPI 支付订单\r\n   */\r\n  private async createJSAPIPayment(request: CreateOrderRequest) {\r\n    if (!request.openid) {\r\n      throw new Error('JSAPI支付需要提供openid');\r\n    }\r\n\r\n    const params: WechatJSAPIOrderParams = {\r\n      ...this.buildBaseOrderParams(request),\r\n      payer: {\r\n        openid: request.openid,\r\n      },\r\n      scene_info: {\r\n        payer_client_ip: request.clientIp || '127.0.0.1',\r\n      },\r\n    };\r\n    return await this.wechatClient.createJSAPIOrder(params);\r\n  }\r\n\r\n  /**\r\n   * 创建 H5 支付订单\r\n   */\r\n  private async createH5Payment(request: CreateOrderRequest) {\r\n    const wechatRequest = request as WechatCreateOrderRequest;\r\n    const params: WechatH5OrderParams = {\r\n      ...this.buildBaseOrderParams(request),\r\n      scene_info: {\r\n        payer_client_ip: request.clientIp || '127.0.0.1',\r\n        h5_info: {\r\n          type: 'Wap',\r\n          app_name: wechatRequest.sceneInfo?.h5Info?.appName || 'PayStream',\r\n          app_url:\r\n            wechatRequest.sceneInfo?.h5Info?.appUrl || 'https://example.com',\r\n        },\r\n      },\r\n    };\r\n    return await this.wechatClient.createH5Order(params);\r\n  }\r\n\r\n  /**\r\n   * 构建基础订单参数\r\n   */\r\n  private buildBaseOrderParams(\r\n    request: CreateOrderRequest\r\n  ): Omit<WechatNativeOrderParams, 'scene_info'> {\r\n    // 确保 notifyUrl 存在（在调用这个方法之前已经检查过）\r\n    if (!request.notifyUrl) {\r\n      throw new Error('notify_url is required');\r\n    }\r\n\r\n    return {\r\n      appid: this.config.appId,\r\n      mchid: this.config.mchId,\r\n      description: request.subject,\r\n      out_trade_no: request.outTradeNo,\r\n      notify_url: request.notifyUrl,\r\n      amount: {\r\n        total: request.totalAmount, // 单位为分\r\n        currency: 'CNY',\r\n      },\r\n      attach: request.body,\r\n      // 处理时间过期，转换为 ISO 时间字符串\r\n      ...(request.timeExpire && {\r\n        time_expire: new Date(\r\n          Date.now() + request.timeExpire * 60 * 1000\r\n        ).toISOString(),\r\n      }),\r\n    };\r\n  }\r\n\r\n  /**\r\n   * 查询支付订单\r\n   */\r\n  async queryOrder(request: QueryOrderRequest): Promise<QueryOrderResponse> {\r\n    try {\r\n      let result: WechatOrderQueryResponse;\r\n\r\n      if (request.tradeNo) {\r\n        // 通过微信支付订单号查询\r\n        result = await this.wechatClient.queryOrderByTransactionId(\r\n          request.tradeNo,\r\n          this.config.mchId\r\n        );\r\n      } else if (request.outTradeNo) {\r\n        // 通过商户订单号查询\r\n        result = await this.wechatClient.queryOrderByOutTradeNo(\r\n          request.outTradeNo,\r\n          this.config.mchId\r\n        );\r\n      } else {\r\n        throw new Error('必须提供 tradeNo 或 outTradeNo');\r\n      }\r\n\r\n      // 映射交易状态\r\n      const tradeStatus = this.mapTradeStatus(result.trade_state);\r\n\r\n      return {\r\n        success: true,\r\n        orderInfo: {\r\n          tradeStatus,\r\n          outTradeNo: result.out_trade_no,\r\n          tradeNo: result.transaction_id,\r\n          totalAmount: result.amount.total,\r\n          receiptAmount: result.amount.payer_total,\r\n          payerId: result.payer.openid,\r\n          createTime: new Date().toISOString(), // 微信支付V3不返回创建时间\r\n          payTime: result.success_time || new Date().toISOString(),\r\n        },\r\n        raw: result,\r\n      };\r\n    } catch (error) {\r\n      return {\r\n        success: false,\r\n        error: error instanceof Error ? error.message : '查询订单失败',\r\n      };\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 发起退款\r\n   */\r\n  async refund(request: RefundRequest): Promise<RefundResponse> {\r\n    try {\r\n      // 首先查询订单信息获取总金额\r\n      let totalAmount: number;\r\n\r\n      if (request.tradeNo || request.outTradeNo) {\r\n        const queryResult = await this.queryOrder({\r\n          tradeNo: request.tradeNo,\r\n          outTradeNo: request.outTradeNo,\r\n        });\r\n\r\n        if (!queryResult.success || !queryResult.orderInfo) {\r\n          throw new Error('查询原订单失败，无法确定总金额');\r\n        }\r\n\r\n        totalAmount = queryResult.orderInfo.totalAmount;\r\n      } else {\r\n        throw new Error('必须提供 tradeNo 或 outTradeNo');\r\n      }\r\n\r\n      const params = {\r\n        out_refund_no: request.outRefundNo,\r\n        reason: request.refundReason || '商户退款',\r\n        amount: {\r\n          refund: request.refundAmount,\r\n          total: totalAmount,\r\n          currency: 'CNY',\r\n        },\r\n        notify_url: request.notifyUrl,\r\n      };\r\n\r\n      // 根据提供的参数选择查询方式\r\n      if (request.tradeNo) {\r\n        (params as any).transaction_id = request.tradeNo;\r\n      } else if (request.outTradeNo) {\r\n        (params as any).out_trade_no = request.outTradeNo;\r\n      }\r\n\r\n      const result = await this.wechatClient.createRefund(params);\r\n\r\n      // 映射退款状态\r\n      let refundStatus: 'SUCCESS' | 'FAIL' | 'PENDING' = 'PENDING';\r\n      if (result.status === 'SUCCESS') {\r\n        refundStatus = 'SUCCESS';\r\n      } else if (result.status === 'CLOSED') {\r\n        refundStatus = 'FAIL';\r\n      }\r\n\r\n      return {\r\n        success: true,\r\n        refundInfo: {\r\n          refundId: result.refund_id,\r\n          outRefundNo: result.out_refund_no,\r\n          refundAmount: result.amount.refund,\r\n          refundStatus,\r\n          refundTime: result.success_time || result.create_time,\r\n        },\r\n        raw: result,\r\n      };\r\n    } catch (error) {\r\n      return {\r\n        success: false,\r\n        error: error instanceof Error ? error.message : '退款失败',\r\n      };\r\n    }\r\n  }\r\n}\r\n","import { createSign, createVerify } from 'crypto';\r\nimport { PaymentError, PaymentErrorCode } from '../types/payment';\r\nimport { HttpClient } from './http';\r\n\r\n/**\r\n * 支付宝API基础URL\r\n */\r\nexport const ALIPAY_API_BASE = 'https://openapi.alipay.com/gateway.do';\r\nexport const ALIPAY_SANDBOX_API_BASE =\r\n  'https://openapi.alipaydev.com/gateway.do';\r\n\r\n/**\r\n * 支付宝签名工具\r\n */\r\nexport class AlipaySignature {\r\n  private privateKey: string;\r\n  private signType: 'RSA' | 'RSA2';\r\n\r\n  constructor(privateKey: string, signType: 'RSA' | 'RSA2' = 'RSA2') {\r\n    this.privateKey = privateKey;\r\n    this.signType = signType;\r\n  }\r\n\r\n  /**\r\n   * 生成支付宝签名\r\n   */\r\n  generateSignature(params: Record<string, any>): string {\r\n    // 过滤空值并排序\r\n    const filteredParams = Object.keys(params)\r\n      .filter(key => params[key] !== '' && params[key] != null)\r\n      .sort()\r\n      .reduce(\r\n        (result, key) => {\r\n          result[key] = params[key];\r\n          return result;\r\n        },\r\n        {} as Record<string, any>\r\n      );\r\n\r\n    // 构建待签名字符串\r\n    const signString = Object.keys(filteredParams)\r\n      .map(key => `${key}=${filteredParams[key]}`)\r\n      .join('&');\r\n\r\n    try {\r\n      const algorithm = this.signType === 'RSA2' ? 'RSA-SHA256' : 'RSA-SHA1';\r\n      const sign = createSign(algorithm);\r\n      sign.update(signString, 'utf8');\r\n      return sign.sign(this.privateKey, 'base64');\r\n    } catch (error) {\r\n      throw new PaymentError(\r\n        PaymentErrorCode.CONFIG_ERROR,\r\n        '支付宝签名生成失败',\r\n        error\r\n      );\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 验证支付宝签名\r\n   */\r\n  verifySignature(\r\n    params: Record<string, any>,\r\n    signature: string,\r\n    publicKey: string\r\n  ): boolean {\r\n    // 移除签名参数\r\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n    const { sign, sign_type, ...filteredParams } = params;\r\n\r\n    // 构建待验签字符串\r\n    const signString = Object.keys(filteredParams)\r\n      .filter(key => filteredParams[key] !== '' && filteredParams[key] != null)\r\n      .sort()\r\n      .map(key => `${key}=${filteredParams[key]}`)\r\n      .join('&');\r\n\r\n    try {\r\n      const algorithm = sign_type === 'RSA2' ? 'RSA-SHA256' : 'RSA-SHA1';\r\n      const verify = createVerify(algorithm);\r\n      verify.update(signString, 'utf8');\r\n      return verify.verify(publicKey, signature, 'base64');\r\n    } catch (error) {\r\n      return false;\r\n    }\r\n  }\r\n}\r\n\r\n/**\r\n * 支付宝API客户端\r\n */\r\nexport class AlipayClient {\r\n  private httpClient: HttpClient;\r\n  private signature: AlipaySignature;\r\n  private appId: string;\r\n  private privateKey: string;\r\n  private alipayPublicKey: string;\r\n  private sandbox: boolean;\r\n  private signType: 'RSA' | 'RSA2';\r\n\r\n  constructor(\r\n    appId: string,\r\n    privateKey: string,\r\n    alipayPublicKey: string,\r\n    signType: 'RSA' | 'RSA2' = 'RSA2',\r\n    sandbox = false\r\n  ) {\r\n    this.httpClient = new HttpClient();\r\n    this.signature = new AlipaySignature(privateKey, signType);\r\n    this.appId = appId;\r\n    this.privateKey = privateKey;\r\n    this.alipayPublicKey = alipayPublicKey;\r\n    this.sandbox = sandbox;\r\n    this.signType = signType;\r\n  }\r\n\r\n  /**\r\n   * 获取API基础URL\r\n   */\r\n  private getBaseUrl(): string {\r\n    return this.sandbox ? ALIPAY_SANDBOX_API_BASE : ALIPAY_API_BASE;\r\n  }\r\n\r\n  /**\r\n   * 构建公共参数\r\n   */\r\n  private buildCommonParams(\r\n    method: string,\r\n    bizContent?: any\r\n  ): Record<string, any> {\r\n    const params: Record<string, any> = {\r\n      app_id: this.appId,\r\n      method,\r\n      format: 'JSON',\r\n      charset: 'utf-8',\r\n      sign_type: this.signType,\r\n      timestamp: new Date().toISOString().replace('T', ' ').substring(0, 19),\r\n      version: '1.0',\r\n    };\r\n\r\n    if (bizContent) {\r\n      params.biz_content = JSON.stringify(bizContent);\r\n    }\r\n\r\n    return params;\r\n  }\r\n\r\n  /**\r\n   * 发送支付宝API请求\r\n   */\r\n  async request<T extends { code: string; msg: string; sub_msg?: string }>(\r\n    method: string,\r\n    bizContent?: any,\r\n    extraParams?: Record<string, any>\r\n  ): Promise<T> {\r\n    const params = {\r\n      ...this.buildCommonParams(method, bizContent),\r\n      ...extraParams,\r\n    };\r\n\r\n    // 生成签名\r\n    params.sign = this.signature.generateSignature(params);\r\n\r\n    try {\r\n      const response = await this.httpClient.post<AlipayResponse<T>>(\r\n        this.getBaseUrl(),\r\n        new URLSearchParams(params).toString(),\r\n        {\r\n          'Content-Type': 'application/x-www-form-urlencoded',\r\n        }\r\n      );\r\n\r\n      if (response.status >= 400) {\r\n        throw new PaymentError(\r\n          PaymentErrorCode.NETWORK_ERROR,\r\n          `支付宝API请求失败: ${response.status} ${response.statusText}`,\r\n          response.data\r\n        );\r\n      }\r\n\r\n      // 解析响应\r\n      const responseKey = method.replace(/\\./g, '_') + '_response';\r\n      const result = response.data[responseKey] as T;\r\n\r\n      if (!result) {\r\n        throw new PaymentError(\r\n          PaymentErrorCode.NETWORK_ERROR,\r\n          '支付宝API响应格式错误',\r\n          response.data\r\n        );\r\n      }\r\n\r\n      if (result.code !== '10000') {\r\n        throw new PaymentError(\r\n          PaymentErrorCode.NETWORK_ERROR,\r\n          `支付宝API错误: ${result.code} ${result.msg || result.sub_msg}`,\r\n          result\r\n        );\r\n      }\r\n\r\n      return result;\r\n    } catch (error) {\r\n      if (error instanceof PaymentError) {\r\n        throw error;\r\n      }\r\n      throw new PaymentError(\r\n        PaymentErrorCode.NETWORK_ERROR,\r\n        '支付宝API请求异常',\r\n        error\r\n      );\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 统一收单交易创建接口（扫码支付）\r\n   */\r\n  async tradeCreate(\r\n    params: AlipayTradeCreateParams\r\n  ): Promise<AlipayTradeCreateResponse> {\r\n    return this.request<AlipayTradeCreateResponse>(\r\n      'alipay.trade.create',\r\n      params\r\n    );\r\n  }\r\n\r\n  /**\r\n   * 手机网站支付接口2.0（H5支付）\r\n   */\r\n  async tradeWapPay(params: AlipayTradeWapPayParams): Promise<string> {\r\n    const commonParams = this.buildCommonParams('alipay.trade.wap.pay', params);\r\n    commonParams.sign = this.signature.generateSignature(commonParams);\r\n\r\n    // 构建支付URL\r\n    const queryString = new URLSearchParams(commonParams).toString();\r\n    return `${this.getBaseUrl()}?${queryString}`;\r\n  }\r\n\r\n  /**\r\n   * 电脑网站支付（PC支付）\r\n   */\r\n  async tradePagePay(params: AlipayTradePagePayParams): Promise<string> {\r\n    const commonParams = this.buildCommonParams(\r\n      'alipay.trade.page.pay',\r\n      params\r\n    );\r\n    commonParams.sign = this.signature.generateSignature(commonParams);\r\n\r\n    // 构建支付表单\r\n    const formFields = Object.keys(commonParams)\r\n      .map(\r\n        key =>\r\n          `<input type=\"hidden\" name=\"${key}\" value=\"${commonParams[key]}\">`\r\n      )\r\n      .join('');\r\n\r\n    return `\r\n      <form id=\"alipayForm\" action=\"${this.getBaseUrl()}\" method=\"POST\">\r\n        ${formFields}\r\n      </form>\r\n      <script>document.getElementById('alipayForm').submit();</script>\r\n    `;\r\n  }\r\n\r\n  /**\r\n   * 统一收单线下交易查询\r\n   */\r\n  async tradeQuery(\r\n    params: AlipayTradeQueryParams\r\n  ): Promise<AlipayTradeQueryResponse> {\r\n    return this.request<AlipayTradeQueryResponse>('alipay.trade.query', params);\r\n  }\r\n\r\n  /**\r\n   * 统一收单交易关闭接口\r\n   */\r\n  async tradeClose(\r\n    params: AlipayTradeCloseParams\r\n  ): Promise<AlipayTradeCloseResponse> {\r\n    return this.request<AlipayTradeCloseResponse>('alipay.trade.close', params);\r\n  }\r\n\r\n  /**\r\n   * 统一收单交易退款接口\r\n   */\r\n  async tradeRefund(\r\n    params: AlipayTradeRefundParams\r\n  ): Promise<AlipayTradeRefundResponse> {\r\n    return this.request<AlipayTradeRefundResponse>(\r\n      'alipay.trade.refund',\r\n      params\r\n    );\r\n  }\r\n\r\n  /**\r\n   * 统一收单交易退款查询\r\n   */\r\n  async tradeRefundQuery(\r\n    params: AlipayTradeRefundQueryParams\r\n  ): Promise<AlipayTradeRefundQueryResponse> {\r\n    return this.request<AlipayTradeRefundQueryResponse>(\r\n      'alipay.trade.fastpay.refund.query',\r\n      params\r\n    );\r\n  }\r\n}\r\n\r\n/**\r\n * 支付宝API响应基础结构\r\n */\r\nexport interface AlipayResponse<T = any> {\r\n  [key: string]: T;\r\n}\r\n\r\n/**\r\n * 支付宝统一收单交易创建参数\r\n */\r\nexport interface AlipayTradeCreateParams {\r\n  out_trade_no: string;\r\n  total_amount: string;\r\n  subject: string;\r\n  body?: string;\r\n  buyer_id?: string;\r\n  seller_id?: string;\r\n  goods_detail?: Array<{\r\n    goods_id: string;\r\n    goods_name: string;\r\n    quantity: number;\r\n    price: string;\r\n    goods_category?: string;\r\n    categories_tree?: string;\r\n    body?: string;\r\n    show_url?: string;\r\n  }>;\r\n  product_code?: string;\r\n  operator_id?: string;\r\n  store_id?: string;\r\n  disable_pay_channels?: string;\r\n  enable_pay_channels?: string;\r\n  terminal_id?: string;\r\n  extend_params?: {\r\n    sys_service_provider_id?: string;\r\n    hb_fq_num?: string;\r\n    hb_fq_seller_percent?: string;\r\n    industry_reflux_info?: string;\r\n    card_type?: string;\r\n  };\r\n  timeout_express?: string;\r\n  settle_info?: {\r\n    settle_detail_infos: Array<{\r\n      trans_in_type: string;\r\n      trans_in: string;\r\n      summary_dimension?: string;\r\n      settle_entity_id?: string;\r\n      settle_entity_type?: string;\r\n      amount: string;\r\n    }>;\r\n  };\r\n  logistics_detail?: {\r\n    logistics_type?: string;\r\n  };\r\n  business_params?: {\r\n    campus_card?: string;\r\n    card_type?: string;\r\n    actual_order_time?: string;\r\n  };\r\n  receiver_address_info?: {\r\n    name?: string;\r\n    address?: string;\r\n    mobile?: string;\r\n    zip?: string;\r\n    division_code?: string;\r\n  };\r\n}\r\n\r\n/**\r\n * 支付宝统一收单交易创建响应\r\n */\r\nexport interface AlipayTradeCreateResponse {\r\n  code: string;\r\n  msg: string;\r\n  sub_code?: string;\r\n  sub_msg?: string;\r\n  trade_no: string;\r\n  out_trade_no: string;\r\n  qr_code?: string;\r\n}\r\n\r\n/**\r\n * 支付宝手机网站支付参数\r\n */\r\nexport interface AlipayTradeWapPayParams {\r\n  out_trade_no: string;\r\n  total_amount: string;\r\n  subject: string;\r\n  body?: string;\r\n  product_code?: string;\r\n  time_expire?: string;\r\n  goods_type?: string;\r\n  passback_params?: string;\r\n  promo_params?: string;\r\n  extend_params?: {\r\n    sys_service_provider_id?: string;\r\n    hb_fq_num?: string;\r\n    hb_fq_seller_percent?: string;\r\n    industry_reflux_info?: string;\r\n    card_type?: string;\r\n  };\r\n  merchant_order_no?: string;\r\n  enable_pay_channels?: string;\r\n  disable_pay_channels?: string;\r\n  store_id?: string;\r\n  quit_url?: string;\r\n  ext_user_info?: {\r\n    name?: string;\r\n    mobile?: string;\r\n    cert_type?: string;\r\n    cert_no?: string;\r\n    min_age?: string;\r\n    fix_buyer?: string;\r\n    need_check_info?: string;\r\n  };\r\n}\r\n\r\n/**\r\n * 支付宝电脑网站支付参数\r\n */\r\nexport interface AlipayTradePagePayParams extends AlipayTradeWapPayParams {\r\n  return_url?: string;\r\n  notify_url?: string;\r\n}\r\n\r\n/**\r\n * 支付宝交易查询参数\r\n */\r\nexport interface AlipayTradeQueryParams {\r\n  out_trade_no?: string;\r\n  trade_no?: string;\r\n  org_pid?: string;\r\n  query_options?: string[];\r\n}\r\n\r\n/**\r\n * 支付宝交易查询响应\r\n */\r\nexport interface AlipayTradeQueryResponse {\r\n  code: string;\r\n  msg: string;\r\n  sub_code?: string;\r\n  sub_msg?: string;\r\n  trade_no: string;\r\n  out_trade_no: string;\r\n  buyer_logon_id: string;\r\n  trade_status: string;\r\n  total_amount: string;\r\n  trans_currency?: string;\r\n  settle_currency?: string;\r\n  settle_amount?: string;\r\n  pay_currency?: string;\r\n  pay_amount?: string;\r\n  settle_trans_rate?: string;\r\n  trans_pay_rate?: string;\r\n  buyer_pay_amount?: string;\r\n  point_amount?: string;\r\n  invoice_amount?: string;\r\n  send_pay_date?: string;\r\n  receipt_amount?: string;\r\n  store_id?: string;\r\n  terminal_id?: string;\r\n  fund_bill_list?: Array<{\r\n    fund_channel: string;\r\n    bank_code?: string;\r\n    amount: string;\r\n    real_amount?: string;\r\n  }>;\r\n  store_name?: string;\r\n  buyer_user_id?: string;\r\n  buyer_user_type?: string;\r\n  mdiscount_amount?: string;\r\n  discount_amount?: string;\r\n  buyer_user_name?: string;\r\n  subject?: string;\r\n  body?: string;\r\n  alipay_sub_merchant_id?: string;\r\n  ext_infos?: string;\r\n}\r\n\r\n/**\r\n * 支付宝交易关闭参数\r\n */\r\nexport interface AlipayTradeCloseParams {\r\n  trade_no?: string;\r\n  out_trade_no?: string;\r\n  operator_id?: string;\r\n}\r\n\r\n/**\r\n * 支付宝交易关闭响应\r\n */\r\nexport interface AlipayTradeCloseResponse {\r\n  code: string;\r\n  msg: string;\r\n  sub_code?: string;\r\n  sub_msg?: string;\r\n  trade_no: string;\r\n  out_trade_no: string;\r\n}\r\n\r\n/**\r\n * 支付宝退款参数\r\n */\r\nexport interface AlipayTradeRefundParams {\r\n  trade_no?: string;\r\n  out_trade_no?: string;\r\n  refund_amount: string;\r\n  refund_currency?: string;\r\n  refund_reason?: string;\r\n  out_request_no?: string;\r\n  operator_id?: string;\r\n  store_id?: string;\r\n  terminal_id?: string;\r\n  goods_detail?: Array<{\r\n    goods_id: string;\r\n    alipay_goods_id?: string;\r\n    goods_name: string;\r\n    quantity: number;\r\n    price: string;\r\n    goods_category?: string;\r\n    categories_tree?: string;\r\n    body?: string;\r\n    show_url?: string;\r\n  }>;\r\n  refund_royalty_parameters?: Array<{\r\n    royalty_type?: string;\r\n    trans_out?: string;\r\n    trans_out_type?: string;\r\n    trans_in_type?: string;\r\n    trans_in?: string;\r\n    amount?: string;\r\n    amount_percentage?: string;\r\n    desc?: string;\r\n  }>;\r\n  org_pid?: string;\r\n}\r\n\r\n/**\r\n * 支付宝退款响应\r\n */\r\nexport interface AlipayTradeRefundResponse {\r\n  code: string;\r\n  msg: string;\r\n  sub_code?: string;\r\n  sub_msg?: string;\r\n  trade_no: string;\r\n  out_trade_no: string;\r\n  buyer_logon_id: string;\r\n  fund_change: string;\r\n  refund_fee: string;\r\n  refund_currency?: string;\r\n  gmt_refund_pay: string;\r\n  refund_detail_item_list?: Array<{\r\n    fund_channel: string;\r\n    bank_code?: string;\r\n    amount: string;\r\n    real_amount?: string;\r\n    fund_type?: string;\r\n  }>;\r\n  store_name?: string;\r\n  buyer_user_id: string;\r\n  refund_preset_paytool_list?: Array<{\r\n    amount: string;\r\n    assert_type_code: string;\r\n  }>;\r\n  refund_settlement_id?: string;\r\n  present_refund_buyer_amount?: string;\r\n  present_refund_discount_amount?: string;\r\n  present_refund_mdiscount_amount?: string;\r\n}\r\n\r\n/**\r\n * 支付宝退款查询参数\r\n */\r\nexport interface AlipayTradeRefundQueryParams {\r\n  trade_no?: string;\r\n  out_trade_no?: string;\r\n  out_request_no: string;\r\n  org_pid?: string;\r\n  query_options?: string[];\r\n}\r\n\r\n/**\r\n * 支付宝退款查询响应\r\n */\r\nexport interface AlipayTradeRefundQueryResponse {\r\n  code: string;\r\n  msg: string;\r\n  sub_code?: string;\r\n  sub_msg?: string;\r\n  trade_no: string;\r\n  out_trade_no: string;\r\n  out_request_no: string;\r\n  refund_reason?: string;\r\n  total_amount: string;\r\n  refund_amount: string;\r\n  refund_royaltys?: Array<{\r\n    refund_amount?: string;\r\n    royalty_type?: string;\r\n    result_code?: string;\r\n    trans_out?: string;\r\n    trans_out_email?: string;\r\n    trans_in?: string;\r\n    trans_in_email?: string;\r\n  }>;\r\n  refund_status: string;\r\n  refund_royalty_result?: Array<{\r\n    trans_out?: string;\r\n    trans_out_email?: string;\r\n    trans_in?: string;\r\n    trans_in_email?: string;\r\n    amount?: string;\r\n    result_code?: string;\r\n  }>;\r\n  refund_detail_item_list?: Array<{\r\n    fund_channel: string;\r\n    bank_code?: string;\r\n    amount: string;\r\n    real_amount?: string;\r\n    fund_type?: string;\r\n  }>;\r\n  send_back_fee?: string;\r\n  refund_settlement_id?: string;\r\n  present_refund_buyer_amount?: string;\r\n  present_refund_discount_amount?: string;\r\n  present_refund_mdiscount_amount?: string;\r\n}\r\n","import {\r\n  BaseProvider,\r\n  BaseProviderConfig,\r\n  VerifyResult,\r\n} from '../base/BaseProvider';\r\nimport {\r\n  UnifiedPaymentNotification,\r\n  PaymentNotifyPayload,\r\n  PaymentError,\r\n  PaymentErrorCode,\r\n  AlipayMethod,\r\n  CreateOrderRequest,\r\n  CreateOrderResponse,\r\n  QueryOrderRequest,\r\n  QueryOrderResponse,\r\n  RefundRequest,\r\n  RefundResponse,\r\n} from '../../types/payment';\r\nimport { verifyWithRSA2, verifyWithRSA } from '../../utils/crypto';\r\nimport {\r\n  AlipayClient,\r\n  AlipayTradeCreateParams,\r\n  AlipayTradeWapPayParams,\r\n  AlipayTradePagePayParams,\r\n  AlipayTradeQueryParams,\r\n  AlipayTradeRefundParams,\r\n} from '../../utils/alipay';\r\n\r\n/**\r\n * 支付宝回调参数\r\n */\r\ninterface AlipayNotifyParams {\r\n  /** 通知时间 */\r\n  notify_time: string;\r\n  /** 通知类型 */\r\n  notify_type: string;\r\n  /** 通知校验ID */\r\n  notify_id: string;\r\n  /** 应用ID */\r\n  app_id: string;\r\n  /** 编码格式 */\r\n  charset: string;\r\n  /** 接口版本 */\r\n  version: string;\r\n  /** 签名类型 */\r\n  sign_type: string;\r\n  /** 签名 */\r\n  sign: string;\r\n  /** 交易状态 */\r\n  trade_status: string;\r\n  /** 商户订单号 */\r\n  out_trade_no: string;\r\n  /** 支付宝交易号 */\r\n  trade_no: string;\r\n  /** 交易金额 */\r\n  total_amount: string;\r\n  /** 实际支付金额 */\r\n  receipt_amount?: string;\r\n  /** 付款方ID */\r\n  buyer_id: string;\r\n  /** 付款方账号 */\r\n  buyer_logon_id: string;\r\n  /** 商品描述 */\r\n  subject: string;\r\n  /** 商品详情 */\r\n  body?: string;\r\n  /** 交易创建时间 */\r\n  gmt_create: string;\r\n  /** 交易付款时间 */\r\n  gmt_payment: string;\r\n  /** 交易结束时间 */\r\n  gmt_close?: string;\r\n  /** 资金明细 */\r\n  fund_bill_list?: string;\r\n  /** 透传参数 */\r\n  passback_params?: string;\r\n  /** 优惠券信息 */\r\n  voucher_detail_list?: string;\r\n  [key: string]: any;\r\n}\r\n\r\n/**\r\n * 支付宝 Provider 配置接口\r\n */\r\nexport interface AlipayProviderConfig extends BaseProviderConfig {\r\n  /** 应用ID */\r\n  appId: string;\r\n  /** 应用私钥 */\r\n  privateKey: string;\r\n  /** 支付宝公钥 */\r\n  alipayPublicKey: string;\r\n  /** 签名类型 */\r\n  signType?: 'RSA2' | 'RSA';\r\n  /** 网关地址 */\r\n  gateway?: string;\r\n  /** 同步回调地址 */\r\n  returnUrl?: string;\r\n}\r\n\r\n/**\r\n * 支付宝 Provider 实现\r\n */\r\nexport class AlipayProvider extends BaseProvider<AlipayProviderConfig> {\r\n  private readonly supportedMethods: AlipayMethod[] = [\r\n    'qrcode',\r\n    'pc',\r\n    'h5',\r\n    'app',\r\n  ];\r\n\r\n  private alipayClient: AlipayClient;\r\n\r\n  constructor(config: AlipayProviderConfig) {\r\n    super(config, 'alipay');\r\n    this.alipayClient = new AlipayClient(\r\n      config.appId,\r\n      config.privateKey,\r\n      config.alipayPublicKey,\r\n      config.signType || 'RSA2',\r\n      config.sandbox\r\n    );\r\n  }\r\n\r\n  /**\r\n   * 验证配置\r\n   */\r\n  protected validateConfig(): void {\r\n    const required = ['appId', 'privateKey', 'alipayPublicKey'];\r\n\r\n    for (const key of required) {\r\n      if (!this.config[key as keyof AlipayProviderConfig]) {\r\n        throw new PaymentError(\r\n          PaymentErrorCode.CONFIG_ERROR,\r\n          `支付宝配置缺少必要参数: ${key}`\r\n        );\r\n      }\r\n    }\r\n\r\n    // 验证 appId 格式\r\n    if (!/^\\d{16}$/.test(this.config.appId)) {\r\n      throw new PaymentError(\r\n        PaymentErrorCode.CONFIG_ERROR,\r\n        '支付宝 appId 格式错误，应为16位数字'\r\n      );\r\n    }\r\n\r\n    // 验证签名类型\r\n    const signType = this.config.signType || 'RSA2';\r\n    if (!['RSA', 'RSA2'].includes(signType)) {\r\n      throw new PaymentError(\r\n        PaymentErrorCode.CONFIG_ERROR,\r\n        '支付宝签名类型错误，应为 RSA 或 RSA2'\r\n      );\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 验证载荷格式\r\n   */\r\n  protected validatePayload(payload: PaymentNotifyPayload): void {\r\n    if (!payload.raw) {\r\n      throw new PaymentError(\r\n        PaymentErrorCode.INVALID_PARAMS,\r\n        '支付宝回调数据为空'\r\n      );\r\n    }\r\n\r\n    const params = payload.raw as AlipayNotifyParams;\r\n\r\n    // 检查必要字段\r\n    const requiredFields = [\r\n      'notify_id',\r\n      'notify_type',\r\n      'trade_status',\r\n      'out_trade_no',\r\n      'trade_no',\r\n    ];\r\n    for (const field of requiredFields) {\r\n      if (!params[field]) {\r\n        throw new PaymentError(\r\n          PaymentErrorCode.INVALID_PARAMS,\r\n          `支付宝回调缺少必要字段: ${field}`\r\n        );\r\n      }\r\n    }\r\n\r\n    // 检查签名字段\r\n    if (!params.sign || !params.sign_type) {\r\n      throw new PaymentError(\r\n        PaymentErrorCode.INVALID_PARAMS,\r\n        '支付宝回调缺少签名信息'\r\n      );\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 验证签名\r\n   */\r\n  protected async verifySignature(\r\n    payload: PaymentNotifyPayload\r\n  ): Promise<VerifyResult> {\r\n    const params = payload.raw as AlipayNotifyParams;\r\n    const { sign, sign_type } = params;\r\n\r\n    try {\r\n      // 构建待验签字符串\r\n      const signString = this.buildSignString(params);\r\n\r\n      let isValid = false;\r\n\r\n      // 根据签名类型选择验签方法\r\n      if (sign_type === 'RSA2') {\r\n        isValid = verifyWithRSA2(signString, sign, this.config.alipayPublicKey);\r\n      } else if (sign_type === 'RSA') {\r\n        isValid = verifyWithRSA(signString, sign, this.config.alipayPublicKey);\r\n      } else {\r\n        return {\r\n          success: false,\r\n          error: `不支持的签名类型: ${sign_type}`,\r\n        };\r\n      }\r\n\r\n      return {\r\n        success: isValid,\r\n        error: isValid ? undefined : '签名验证失败',\r\n        details: {\r\n          signType: sign_type,\r\n          signString: signString.substring(0, 100) + '...', // 只记录前100个字符\r\n        },\r\n      };\r\n    } catch (error) {\r\n      return {\r\n        success: false,\r\n        error: `签名验证过程出错: ${error}`,\r\n      };\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 构建待验签字符串\r\n   */\r\n  private buildSignString(params: AlipayNotifyParams): string {\r\n    // 过滤掉签名参数和空值参数\r\n    const filteredParams: Record<string, string> = {};\r\n\r\n    Object.keys(params).forEach(key => {\r\n      if (\r\n        key !== 'sign' &&\r\n        key !== 'sign_type' &&\r\n        params[key] !== '' &&\r\n        params[key] != null\r\n      ) {\r\n        filteredParams[key] = String(params[key]);\r\n      }\r\n    });\r\n\r\n    // 按键名升序排序\r\n    const sortedKeys = Object.keys(filteredParams).sort();\r\n\r\n    // 构建查询字符串\r\n    return sortedKeys.map(key => `${key}=${filteredParams[key]}`).join('&');\r\n  }\r\n\r\n  /**\r\n   * 转换通知数据为统一格式\r\n   */\r\n  protected async transformNotification(\r\n    payload: PaymentNotifyPayload\r\n  ): Promise<UnifiedPaymentNotification> {\r\n    const params = payload.raw as AlipayNotifyParams;\r\n\r\n    // 转换为统一格式\r\n    const result: UnifiedPaymentNotification = {\r\n      provider: 'alipay',\r\n      tradeStatus: this.mapTradeStatus(params.trade_status),\r\n      outTradeNo: params.out_trade_no,\r\n      tradeNo: params.trade_no,\r\n      totalAmount: Math.round(parseFloat(params.total_amount) * 100), // 转为分\r\n      payerId: params.buyer_id,\r\n      raw: params,\r\n      timestamp: Date.now(),\r\n    };\r\n\r\n    return result;\r\n  }\r\n\r\n  /**\r\n   * 映射支付宝交易状态到统一状态\r\n   */\r\n  private mapTradeStatus(\r\n    tradeStatus: string\r\n  ): UnifiedPaymentNotification['tradeStatus'] {\r\n    switch (tradeStatus) {\r\n      case 'TRADE_SUCCESS':\r\n      case 'TRADE_FINISHED':\r\n        return 'SUCCESS';\r\n      case 'TRADE_CLOSED':\r\n        return 'FAIL';\r\n      case 'WAIT_BUYER_PAY':\r\n        return 'PENDING';\r\n      default:\r\n        return 'PENDING';\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 生成成功响应\r\n   */\r\n  generateSuccessResponse(): string {\r\n    return 'success';\r\n  }\r\n\r\n  /**\r\n   * 生成失败响应\r\n   */\r\n  generateFailureResponse(error?: string): string {\r\n    return error || 'failure';\r\n  }\r\n\r\n  /**\r\n   * 获取支持的支付方式\r\n   */\r\n  getSupportedMethods(): string[] {\r\n    return this.supportedMethods.map(method => `alipay.${method}`);\r\n  }\r\n\r\n  /**\r\n   * 后处理逻辑\r\n   */\r\n  protected async postProcess(\r\n    notification: UnifiedPaymentNotification,\r\n    _originalPayload: PaymentNotifyPayload\r\n  ): Promise<void> {\r\n    // 记录处理日志\r\n    if (this.config.sandbox) {\r\n      console.log('🧪 支付宝沙箱环境处理完成:', {\r\n        outTradeNo: notification.outTradeNo,\r\n        tradeNo: notification.tradeNo,\r\n        status: notification.tradeStatus,\r\n        amount: notification.totalAmount,\r\n      });\r\n    }\r\n\r\n    // 可以在这里添加其他后处理逻辑，如数据持久化、缓存等\r\n  }\r\n\r\n  /**\r\n   * 解析支付宝表单数据\r\n   */\r\n  parseFormData(formData: any): AlipayNotifyParams {\r\n    const params: any = {};\r\n\r\n    // 支持多种格式的表单数据\r\n    if (typeof formData === 'object' && formData !== null) {\r\n      // 如果是普通对象，直接使用\r\n      if (formData.constructor === Object) {\r\n        return formData as AlipayNotifyParams;\r\n      }\r\n\r\n      // 如果有 entries 方法（类似 FormData）\r\n      if (typeof formData.entries === 'function') {\r\n        for (const [key, value] of formData.entries()) {\r\n          params[key] = value;\r\n        }\r\n      } else {\r\n        // 其他情况，尝试遍历属性\r\n        for (const [key, value] of Object.entries(formData)) {\r\n          params[key] = value;\r\n        }\r\n      }\r\n    }\r\n\r\n    return params as AlipayNotifyParams;\r\n  }\r\n\r\n  /**\r\n   * 解析支付宝 URL 编码数据\r\n   */\r\n  parseUrlEncodedData(data: string): AlipayNotifyParams {\r\n    const params: any = {};\r\n    const pairs = data.split('&');\r\n\r\n    pairs.forEach(pair => {\r\n      const [key, value] = pair.split('=');\r\n      if (key && value) {\r\n        params[decodeURIComponent(key)] = decodeURIComponent(value);\r\n      }\r\n    });\r\n\r\n    return params as AlipayNotifyParams;\r\n  }\r\n\r\n  /**\r\n   * 创建响应对象\r\n   * @param success 是否成功\r\n   * @param error 错误信息\r\n   * @returns 响应对象\r\n   */\r\n  createResponse(\r\n    success: boolean,\r\n    error?: string\r\n  ): {\r\n    status: number;\r\n    body: string;\r\n    headers: Record<string, string>;\r\n  } {\r\n    return {\r\n      status: success ? 200 : error?.includes('验签') ? 401 : 400,\r\n      body: success\r\n        ? this.generateSuccessResponse()\r\n        : this.generateFailureResponse(),\r\n      headers: {\r\n        'Content-Type': 'text/plain',\r\n      },\r\n    };\r\n  }\r\n\r\n  /**\r\n   * 验证应用ID匹配\r\n   */\r\n  validateAppId(appId: string): boolean {\r\n    return this.config.appId === appId;\r\n  }\r\n\r\n  /**\r\n   * 获取签名类型\r\n   */\r\n  getSignType(): 'RSA' | 'RSA2' {\r\n    return this.config.signType || 'RSA2';\r\n  }\r\n\r\n  /**\r\n   * 创建支付订单\r\n   */\r\n  async createOrder(\r\n    method: string,\r\n    request: CreateOrderRequest\r\n  ): Promise<CreateOrderResponse> {\r\n    try {\r\n      const alipayMethod = method.replace('alipay.', '') as AlipayMethod;\r\n\r\n      if (!this.supportedMethods.includes(alipayMethod)) {\r\n        throw new Error(`不支持的支付方式: ${method}`);\r\n      }\r\n\r\n      let result: any;\r\n      const paymentData: any = {};\r\n\r\n      switch (alipayMethod) {\r\n        case 'qrcode':\r\n          result = await this.createQrcodePayment(request);\r\n          paymentData.qrCode = `https://qr.alipay.com/${result.qr_code}`;\r\n          break;\r\n\r\n        case 'h5':\r\n          result = await this.createH5Payment(request);\r\n          paymentData.payUrl = result; // H5支付返回URL\r\n          break;\r\n\r\n        case 'pc':\r\n          result = await this.createPCPayment(request);\r\n          paymentData.payForm = result; // PC支付返回表单HTML\r\n          break;\r\n\r\n        case 'app':\r\n          result = await this.createAppPayment(request);\r\n          paymentData.orderInfo = result; // APP支付返回订单信息\r\n          break;\r\n\r\n        default:\r\n          throw new Error(`不支持的支付宝支付方式: ${alipayMethod}`);\r\n      }\r\n\r\n      return {\r\n        success: true,\r\n        tradeNo: result?.trade_no || `alipay_${Date.now()}`,\r\n        paymentData,\r\n        raw: result,\r\n      };\r\n    } catch (error) {\r\n      return {\r\n        success: false,\r\n        error: error instanceof Error ? error.message : '创建订单失败',\r\n      };\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 创建二维码支付订单\r\n   */\r\n  private async createQrcodePayment(request: CreateOrderRequest) {\r\n    const params: AlipayTradeCreateParams = {\r\n      out_trade_no: request.outTradeNo,\r\n      total_amount: (request.totalAmount / 100).toString(), // 转换为元\r\n      subject: request.subject,\r\n      body: request.body,\r\n      product_code: 'FACE_TO_FACE_PAYMENT',\r\n      timeout_express: request.timeExpire ? `${request.timeExpire}m` : '30m',\r\n    };\r\n\r\n    return await this.alipayClient.tradeCreate(params);\r\n  }\r\n\r\n  /**\r\n   * 创建H5支付订单\r\n   */\r\n  private async createH5Payment(request: CreateOrderRequest) {\r\n    const params: AlipayTradeWapPayParams = {\r\n      out_trade_no: request.outTradeNo,\r\n      total_amount: (request.totalAmount / 100).toString(),\r\n      subject: request.subject,\r\n      body: request.body,\r\n      product_code: 'QUICK_WAP_WAY',\r\n      time_expire: request.timeExpire ? `${request.timeExpire}m` : '30m',\r\n      quit_url: request.returnUrl || 'https://example.com',\r\n    };\r\n\r\n    return await this.alipayClient.tradeWapPay(params);\r\n  }\r\n\r\n  /**\r\n   * 创建PC支付订单\r\n   */\r\n  private async createPCPayment(request: CreateOrderRequest) {\r\n    const params: AlipayTradePagePayParams = {\r\n      out_trade_no: request.outTradeNo,\r\n      total_amount: (request.totalAmount / 100).toString(),\r\n      subject: request.subject,\r\n      body: request.body,\r\n      product_code: 'FAST_INSTANT_TRADE_PAY',\r\n      time_expire: request.timeExpire ? `${request.timeExpire}m` : '30m',\r\n      return_url: request.returnUrl,\r\n      notify_url: request.notifyUrl,\r\n    };\r\n\r\n    return await this.alipayClient.tradePagePay(params);\r\n  }\r\n\r\n  /**\r\n   * 创建APP支付订单\r\n   */\r\n  private async createAppPayment(request: CreateOrderRequest) {\r\n    const params: AlipayTradeCreateParams = {\r\n      out_trade_no: request.outTradeNo,\r\n      total_amount: (request.totalAmount / 100).toString(),\r\n      subject: request.subject,\r\n      body: request.body,\r\n      product_code: 'QUICK_MSECURITY_PAY',\r\n      timeout_express: request.timeExpire ? `${request.timeExpire}m` : '30m',\r\n    };\r\n\r\n    return await this.alipayClient.tradeCreate(params);\r\n  }\r\n\r\n  /**\r\n   * 查询支付订单\r\n   */\r\n  async queryOrder(request: QueryOrderRequest): Promise<QueryOrderResponse> {\r\n    try {\r\n      const params: AlipayTradeQueryParams = {};\r\n\r\n      if (request.tradeNo) {\r\n        params.trade_no = request.tradeNo;\r\n      } else if (request.outTradeNo) {\r\n        params.out_trade_no = request.outTradeNo;\r\n      } else {\r\n        throw new Error('必须提供 tradeNo 或 outTradeNo');\r\n      }\r\n\r\n      const result = await this.alipayClient.tradeQuery(params);\r\n\r\n      // 映射交易状态\r\n      const tradeStatus = this.mapTradeStatus(result.trade_status);\r\n\r\n      return {\r\n        success: true,\r\n        orderInfo: {\r\n          tradeStatus,\r\n          outTradeNo: result.out_trade_no,\r\n          tradeNo: result.trade_no,\r\n          totalAmount: Math.round(parseFloat(result.total_amount) * 100), // 转换为分\r\n          receiptAmount: result.receipt_amount\r\n            ? Math.round(parseFloat(result.receipt_amount) * 100)\r\n            : undefined,\r\n          payerId: result.buyer_user_id,\r\n          createTime: new Date().toISOString(), // 支付宝不返回创建时间\r\n          payTime: result.send_pay_date || new Date().toISOString(),\r\n        },\r\n        raw: result,\r\n      };\r\n    } catch (error) {\r\n      return {\r\n        success: false,\r\n        error: error instanceof Error ? error.message : '查询订单失败',\r\n      };\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 发起退款\r\n   */\r\n  async refund(request: RefundRequest): Promise<RefundResponse> {\r\n    try {\r\n      const params: AlipayTradeRefundParams = {\r\n        refund_amount: (request.refundAmount / 100).toString(), // 转换为元\r\n        refund_reason: request.refundReason || '商户退款',\r\n        out_request_no: request.outRefundNo,\r\n      };\r\n\r\n      // 根据提供的参数选择查询方式\r\n      if (request.tradeNo) {\r\n        params.trade_no = request.tradeNo;\r\n      } else if (request.outTradeNo) {\r\n        params.out_trade_no = request.outTradeNo;\r\n      } else {\r\n        throw new Error('必须提供 tradeNo 或 outTradeNo');\r\n      }\r\n\r\n      const result = await this.alipayClient.tradeRefund(params);\r\n\r\n      return {\r\n        success: true,\r\n        refundInfo: {\r\n          refundId: `${result.trade_no}_${request.outRefundNo}`,\r\n          outRefundNo: request.outRefundNo,\r\n          refundAmount: Math.round(parseFloat(result.refund_fee) * 100), // 转换为分\r\n          refundStatus: result.fund_change === 'Y' ? 'SUCCESS' : 'FAIL',\r\n          refundTime: result.gmt_refund_pay || new Date().toISOString(),\r\n        },\r\n        raw: result,\r\n      };\r\n    } catch (error) {\r\n      return {\r\n        success: false,\r\n        error: error instanceof Error ? error.message : '退款失败',\r\n      };\r\n    }\r\n  }\r\n}\r\n","// 版本信息\r\nexport const version = '2.0.0';\r\n\r\n// 核心类型\r\nexport * from './types/payment';\r\n\r\n// 配置类型\r\nexport type { PaymentConfig, WechatPayConfig, EnvConfig } from './types/config';\r\n\r\n// 核心面向对象架构 - PayStream V2\r\nexport {\r\n  PaymentManagerV2,\r\n  createPaymentManagerV2,\r\n} from './core/PaymentManagerV2';\r\n\r\nexport { HookManager, callStatusHooks } from './core/hooks';\r\n\r\n// Provider 架构\r\nexport { BaseProvider } from './providers/base/BaseProvider';\r\nexport { WechatProvider } from './providers/wechat/WechatProvider';\r\nexport { AlipayProvider } from './providers/alipay/AlipayProvider';\r\n\r\n// Provider 工厂\r\nexport {\r\n  ProviderFactory,\r\n  defaultProviderFactory,\r\n  registerBuiltInProviders,\r\n  getRegisteredProviderInfo,\r\n} from './providers/base';\r\n\r\nexport type {\r\n  BaseProviderConfig,\r\n  VerifyResult,\r\n  ProviderConstructor,\r\n  ProviderRegistration,\r\n  WechatProviderConfig,\r\n  AlipayProviderConfig,\r\n} from './providers/base';\r\n\r\n// 配置管理\r\nexport {\r\n  getConfig,\r\n  loadConfigFromEnv,\r\n  mergeConfig,\r\n  validateWechatConfig,\r\n  validateAlipayConfig,\r\n} from './config';\r\n\r\n// 工具函数\r\nexport {\r\n  generateNonce,\r\n  generateTimestamp,\r\n  generateOrderNo,\r\n  generateUUID,\r\n  formatAmount,\r\n  parseAmount,\r\n  validateOrderNo,\r\n  safeCompare,\r\n  base64UrlEncode,\r\n  base64UrlDecode,\r\n} from './utils/crypto';\r\n\r\n// 加密工具（旧版兼容）\r\nexport {\r\n  aesGcmDecrypt,\r\n  verifyWithRSA2,\r\n  verifyWithRSA,\r\n  signWithRSA,\r\n  verifyWechatSignature,\r\n} from './utils/crypto';\r\n\r\n// HTTP客户端\r\nexport {\r\n  HttpClient,\r\n  type HttpRequestConfig,\r\n  type HttpResponse,\r\n} from './utils/http';\r\n\r\n// 微信支付工具\r\nexport {\r\n  WechatPayV3Client,\r\n  WechatPayV3Signer,\r\n  generateJSAPIPayParams,\r\n  WECHAT_PAY_API_BASE,\r\n  type WechatNativeOrderParams,\r\n  type WechatNativeOrderResponse,\r\n  type WechatJSAPIOrderParams,\r\n  type WechatJSAPIOrderResponse,\r\n  type WechatH5OrderParams,\r\n  type WechatH5OrderResponse,\r\n  type WechatOrderQueryResponse,\r\n  type WechatRefundParams,\r\n  type WechatRefundResponse,\r\n  type WechatRefundQueryResponse,\r\n} from './utils/wechat';\r\n\r\n// 支付宝工具\r\nexport {\r\n  AlipayClient,\r\n  AlipaySignature,\r\n  ALIPAY_API_BASE,\r\n  ALIPAY_SANDBOX_API_BASE,\r\n  type AlipayResponse,\r\n  type AlipayTradeCreateParams,\r\n  type AlipayTradeCreateResponse,\r\n  type AlipayTradeWapPayParams,\r\n  type AlipayTradePagePayParams,\r\n  type AlipayTradeQueryParams,\r\n  type AlipayTradeQueryResponse,\r\n  type AlipayTradeCloseParams,\r\n  type AlipayTradeCloseResponse,\r\n  type AlipayTradeRefundParams,\r\n  type AlipayTradeRefundResponse,\r\n  type AlipayTradeRefundQueryParams,\r\n  type AlipayTradeRefundQueryResponse,\r\n} from './utils/alipay';\r\n\r\nexport * from './adapters/nextjsV2';\r\n\r\n/**\r\n * 创建微信支付Provider\r\n */\r\nexport function createWechatProvider(\r\n  config: import('./providers/base').WechatProviderConfig\r\n): import('./providers/wechat/WechatProvider').WechatProvider {\r\n  // eslint-disable-next-line @typescript-eslint/no-var-requires\r\n  const { WechatProvider } = require('./providers/wechat/WechatProvider');\r\n  return new WechatProvider(config);\r\n}\r\n\r\n/**\r\n * 创建支付宝Provider\r\n */\r\nexport function createAlipayProvider(\r\n  config: import('./providers/base').AlipayProviderConfig\r\n): import('./providers/alipay/AlipayProvider').AlipayProvider {\r\n  // eslint-disable-next-line @typescript-eslint/no-var-requires\r\n  const { AlipayProvider } = require('./providers/alipay/AlipayProvider');\r\n  return new AlipayProvider(config);\r\n}\r\n","import {\r\n  PaymentMethod,\r\n  PaymentNotifyPayload,\r\n  UnifiedPaymentNotification,\r\n  PaymentError,\r\n  PaymentErrorCode,\r\n  CreateOrderRequest,\r\n  CreateOrderResponse,\r\n  QueryOrderRequest,\r\n  QueryOrderResponse,\r\n  RefundRequest,\r\n  RefundResponse,\r\n} from '../types/payment';\r\nimport { PaymentConfig } from '../types/config';\r\nimport { HookManager, callStatusHooks } from './hooks';\r\nimport {\r\n  BaseProvider,\r\n  defaultProviderFactory,\r\n  WechatProviderConfig,\r\n  AlipayProviderConfig,\r\n} from '../providers/base';\r\n\r\n/**\r\n * 新版支付管理器 - 使用面向对象的 Provider 架构\r\n */\r\nexport class PaymentManagerV2 {\r\n  private providers: Map<string, BaseProvider> = new Map();\r\n  private hookManager: HookManager;\r\n  private config: PaymentConfig;\r\n\r\n  /**\r\n   * 构造函数\r\n   * @param userConfig 用户配置\r\n   */\r\n  constructor(userConfig: Partial<PaymentConfig> = {}) {\r\n    this.config = this.mergeConfig(userConfig);\r\n    this.hookManager = new HookManager();\r\n    this.initializeProviders();\r\n    this.initializeHooks();\r\n  }\r\n\r\n  /**\r\n   * 合并配置\r\n   */\r\n  private mergeConfig(userConfig: Partial<PaymentConfig>): PaymentConfig {\r\n    const defaultConfig: PaymentConfig = {\r\n      global: {\r\n        timeout: 30000,\r\n        retries: 3,\r\n        logLevel: 'info',\r\n        enableLog: true,\r\n      },\r\n    };\r\n\r\n    return {\r\n      ...defaultConfig,\r\n      ...userConfig,\r\n      global: {\r\n        ...defaultConfig.global,\r\n        ...userConfig.global,\r\n      },\r\n    };\r\n  }\r\n\r\n  /**\r\n   * 初始化 Provider\r\n   */\r\n  private initializeProviders(): void {\r\n    // 初始化微信支付 Provider\r\n    if (this.config.wechat?.enabled) {\r\n      try {\r\n        const wechatProvider = defaultProviderFactory.create('wechat', {\r\n          enabled: this.config.wechat.enabled,\r\n          sandbox: this.config.wechat.sandbox,\r\n          notifyUrl: this.config.wechat.notifyUrl,\r\n          appId: this.config.wechat.appId,\r\n          mchId: this.config.wechat.mchId,\r\n          apiV3Key: this.config.wechat.apiV3Key,\r\n          privateKey: this.config.wechat.privateKey,\r\n          serialNo: this.config.wechat.serialNo,\r\n          platformCertificate: this.config.wechat.platformCertificate,\r\n        } as WechatProviderConfig);\r\n\r\n        this.providers.set('wechat', wechatProvider);\r\n\r\n        if (this.config.global?.enableLog) {\r\n          console.log('✅ 微信支付 Provider 初始化成功');\r\n        }\r\n      } catch (error) {\r\n        console.error('❌ 微信支付 Provider 初始化失败:', error);\r\n      }\r\n    }\r\n\r\n    // 初始化支付宝 Provider\r\n    if (this.config.alipay?.enabled) {\r\n      try {\r\n        const alipayProvider = defaultProviderFactory.create('alipay', {\r\n          enabled: this.config.alipay.enabled,\r\n          sandbox: this.config.alipay.sandbox,\r\n          notifyUrl: this.config.alipay.notifyUrl,\r\n          appId: this.config.alipay.appId,\r\n          privateKey: this.config.alipay.privateKey,\r\n          alipayPublicKey: this.config.alipay.alipayPublicKey,\r\n          signType: this.config.alipay.signType,\r\n          gateway: this.config.alipay.gateway,\r\n          returnUrl: this.config.alipay.returnUrl,\r\n        } as AlipayProviderConfig);\r\n\r\n        this.providers.set('alipay', alipayProvider);\r\n\r\n        if (this.config.global?.enableLog) {\r\n          console.log('✅ 支付宝 Provider 初始化成功');\r\n        }\r\n      } catch (error) {\r\n        console.error('❌ 支付宝 Provider 初始化失败:', error);\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 初始化 Hook\r\n   */\r\n  private initializeHooks(): void {\r\n    if (this.config.hooks) {\r\n      Object.entries(this.config.hooks).forEach(([event, handlers]) => {\r\n        handlers.forEach(handler => {\r\n          this.hookManager.on(event as any, handler);\r\n        });\r\n      });\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 处理支付回调通知\r\n   * @param method 支付方式\r\n   * @param payload 回调载荷\r\n   * @returns 统一格式的支付通知\r\n   */\r\n  async handleNotify(\r\n    method: PaymentMethod,\r\n    payload: PaymentNotifyPayload\r\n  ): Promise<UnifiedPaymentNotification> {\r\n    try {\r\n      // 解析 Provider 名称\r\n      const providerName = this.parseProviderName(method);\r\n\r\n      // 获取 Provider 实例\r\n      const provider = this.getProvider(providerName);\r\n\r\n      // 验证支付方式是否支持\r\n      if (!provider.isSupportedMethod(method)) {\r\n        throw new PaymentError(\r\n          PaymentErrorCode.INVALID_PARAMS,\r\n          `${providerName} Provider 不支持支付方式: ${method}`\r\n        );\r\n      }\r\n\r\n      // 使用 Provider 处理回调\r\n      const result = await provider.handleNotify(payload);\r\n\r\n      // 触发 Hook\r\n      await callStatusHooks(result, this.hookManager);\r\n\r\n      // 记录成功日志\r\n      if (this.config.global?.enableLog) {\r\n        console.log(`✅ ${providerName} 支付回调处理成功:`, {\r\n          outTradeNo: result.outTradeNo,\r\n          tradeNo: result.tradeNo,\r\n          status: result.tradeStatus,\r\n          amount: result.totalAmount,\r\n        });\r\n      }\r\n\r\n      return result;\r\n    } catch (error) {\r\n      // 记录错误日志\r\n      if (this.config.global?.enableLog) {\r\n        console.error('❌ 支付回调处理失败:', error);\r\n      }\r\n\r\n      if (error instanceof PaymentError) {\r\n        throw error;\r\n      }\r\n\r\n      throw new PaymentError(\r\n        PaymentErrorCode.UNKNOWN_PROVIDER,\r\n        '支付回调处理失败',\r\n        error\r\n      );\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 解析 Provider 名称\r\n   */\r\n  private parseProviderName(method: PaymentMethod): string {\r\n    const parts = method.split('.');\r\n    return parts[0]; // 'wechat.native' -> 'wechat'\r\n  }\r\n\r\n  /**\r\n   * 获取 Provider 实例\r\n   */\r\n  private getProvider(providerName: string): BaseProvider {\r\n    const provider = this.providers.get(providerName);\r\n\r\n    if (!provider) {\r\n      throw new PaymentError(\r\n        PaymentErrorCode.UNKNOWN_PROVIDER,\r\n        `未找到 Provider: ${providerName}`\r\n      );\r\n    }\r\n\r\n    if (!provider.isEnabled()) {\r\n      throw new PaymentError(\r\n        PaymentErrorCode.CONFIG_ERROR,\r\n        `${providerName} Provider 未启用`\r\n      );\r\n    }\r\n\r\n    return provider;\r\n  }\r\n\r\n  /**\r\n   * 添加 Provider\r\n   * @param name Provider 名称\r\n   * @param provider Provider 实例\r\n   */\r\n  addProvider(name: string, provider: BaseProvider): void {\r\n    this.providers.set(name, provider);\r\n\r\n    if (this.config.global?.enableLog) {\r\n      console.log(`➕ 添加 Provider: ${name}`);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 移除 Provider\r\n   * @param name Provider 名称\r\n   */\r\n  removeProvider(name: string): void {\r\n    this.providers.delete(name);\r\n\r\n    if (this.config.global?.enableLog) {\r\n      console.log(`➖ 移除 Provider: ${name}`);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 获取 Provider 实例\r\n   * @param name Provider 名称\r\n   * @returns Provider 实例或 undefined\r\n   */\r\n  getProviderInstance(providerName: string): BaseProvider | undefined {\r\n    return this.providers.get(providerName);\r\n  }\r\n\r\n  /**\r\n   * 注册 Hook\r\n   */\r\n  onNotify(\r\n    handler: (notification: UnifiedPaymentNotification) => void | Promise<void>\r\n  ): void {\r\n    this.hookManager.on('onNotify', handler);\r\n  }\r\n\r\n  onSuccess(\r\n    handler: (notification: UnifiedPaymentNotification) => void | Promise<void>\r\n  ): void {\r\n    this.hookManager.on('onSuccess', handler);\r\n  }\r\n\r\n  onFail(\r\n    handler: (notification: UnifiedPaymentNotification) => void | Promise<void>\r\n  ): void {\r\n    this.hookManager.on('onFail', handler);\r\n  }\r\n\r\n  onPending(\r\n    handler: (notification: UnifiedPaymentNotification) => void | Promise<void>\r\n  ): void {\r\n    this.hookManager.on('onPending', handler);\r\n  }\r\n\r\n  /**\r\n   * 获取配置\r\n   */\r\n  getConfig(): PaymentConfig {\r\n    return { ...this.config };\r\n  }\r\n\r\n  /**\r\n   * 更新配置\r\n   * @param newConfig 新配置\r\n   */\r\n  updateConfig(newConfig: Partial<PaymentConfig>): void {\r\n    this.config = this.mergeConfig(newConfig);\r\n\r\n    // 清空并重新初始化 Provider\r\n    this.providers.clear();\r\n    this.initializeProviders();\r\n\r\n    // 重新初始化 Hook\r\n    this.hookManager.clear();\r\n    this.initializeHooks();\r\n\r\n    if (this.config.global?.enableLog) {\r\n      console.log('🔄 配置已更新并重新初始化 Provider');\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 检查 Provider 是否启用\r\n   */\r\n  isProviderEnabled(provider: 'wechat' | 'alipay'): boolean {\r\n    const instance = this.providers.get(provider);\r\n    return instance ? instance.isEnabled() : false;\r\n  }\r\n\r\n  /**\r\n   * 获取已启用的 Provider 列表\r\n   */\r\n  getEnabledProviders(): string[] {\r\n    const enabledProviders: string[] = [];\r\n\r\n    for (const [name, provider] of this.providers) {\r\n      if (provider.isEnabled()) {\r\n        enabledProviders.push(name);\r\n      }\r\n    }\r\n\r\n    return enabledProviders;\r\n  }\r\n\r\n  /**\r\n   * 获取所有 Provider 状态\r\n   */\r\n  getProvidersStatus(): Array<{\r\n    name: string;\r\n    enabled: boolean;\r\n    sandbox: boolean;\r\n    supportedMethods: string[];\r\n  }> {\r\n    const statuses: Array<{\r\n      name: string;\r\n      enabled: boolean;\r\n      sandbox: boolean;\r\n      supportedMethods: string[];\r\n    }> = [];\r\n\r\n    for (const [name, provider] of this.providers) {\r\n      statuses.push({\r\n        name,\r\n        ...provider.getStatus(),\r\n      });\r\n    }\r\n\r\n    return statuses;\r\n  }\r\n\r\n  /**\r\n   * 获取支持的支付方式\r\n   */\r\n  getSupportedMethods(): string[] {\r\n    const methods: string[] = [];\r\n\r\n    for (const provider of this.providers.values()) {\r\n      if (provider.isEnabled()) {\r\n        methods.push(...provider.getSupportedMethods());\r\n      }\r\n    }\r\n\r\n    return methods;\r\n  }\r\n\r\n  /**\r\n   * 验证支付方式是否支持\r\n   */\r\n  isSupportedMethod(method: PaymentMethod): boolean {\r\n    try {\r\n      const providerName = this.parseProviderName(method);\r\n      const provider = this.providers.get(providerName);\r\n\r\n      return provider ? provider.isSupportedMethod(method) : false;\r\n    } catch {\r\n      return false;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 获取 Hook 管理器\r\n   */\r\n  getHookManager(): HookManager {\r\n    return this.hookManager;\r\n  }\r\n\r\n  /**\r\n   * 销毁管理器\r\n   */\r\n  destroy(): void {\r\n    this.providers.clear();\r\n    this.hookManager.clear();\r\n\r\n    if (this.config.global?.enableLog) {\r\n      console.log('🗑️ PaymentManager 已销毁');\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 创建支付订单\r\n   * @param method 支付方式\r\n   * @param request 订单创建请求\r\n   * @returns 订单创建响应\r\n   */\r\n  async createOrder(\r\n    method: PaymentMethod,\r\n    request: CreateOrderRequest\r\n  ): Promise<CreateOrderResponse> {\r\n    try {\r\n      // 解析 Provider 名称\r\n      const providerName = this.parseProviderName(method);\r\n\r\n      // 获取 Provider 实例\r\n      const provider = this.getProvider(providerName);\r\n\r\n      // 验证支付方式是否支持\r\n      if (!provider.isSupportedMethod(method)) {\r\n        throw new PaymentError(\r\n          PaymentErrorCode.INVALID_PARAMS,\r\n          `${providerName} Provider 不支持支付方式: ${method}`\r\n        );\r\n      }\r\n\r\n      // 使用 Provider 创建订单\r\n      const result = await provider.createOrder(method, request);\r\n\r\n      // 记录成功日志\r\n      if (this.config.global?.enableLog) {\r\n        console.log(`✅ ${providerName} 创建支付订单成功:`, {\r\n          outTradeNo: request.outTradeNo,\r\n          totalAmount: request.totalAmount,\r\n          method,\r\n        });\r\n      }\r\n\r\n      return result;\r\n    } catch (error) {\r\n      // 记录错误日志\r\n      if (this.config.global?.enableLog) {\r\n        console.error('❌ 创建支付订单失败:', error);\r\n      }\r\n\r\n      if (error instanceof PaymentError) {\r\n        throw error;\r\n      }\r\n\r\n      throw new PaymentError(\r\n        PaymentErrorCode.UNKNOWN_PROVIDER,\r\n        '创建支付订单失败',\r\n        error\r\n      );\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 查询支付订单\r\n   * @param providerName 支付提供商名称\r\n   * @param request 订单查询请求\r\n   * @returns 订单查询响应\r\n   */\r\n  async queryOrder(\r\n    providerName: string,\r\n    request: QueryOrderRequest\r\n  ): Promise<QueryOrderResponse> {\r\n    try {\r\n      // 获取 Provider 实例\r\n      const provider = this.getProvider(providerName);\r\n\r\n      // 使用 Provider 查询订单\r\n      const result = await provider.queryOrder(request);\r\n\r\n      // 记录成功日志\r\n      if (this.config.global?.enableLog) {\r\n        console.log(`✅ ${providerName} 查询支付订单成功:`, {\r\n          outTradeNo: request.outTradeNo,\r\n          tradeNo: request.tradeNo,\r\n        });\r\n      }\r\n\r\n      return result;\r\n    } catch (error) {\r\n      // 记录错误日志\r\n      if (this.config.global?.enableLog) {\r\n        console.error('❌ 查询支付订单失败:', error);\r\n      }\r\n\r\n      if (error instanceof PaymentError) {\r\n        throw error;\r\n      }\r\n\r\n      throw new PaymentError(\r\n        PaymentErrorCode.UNKNOWN_PROVIDER,\r\n        '查询支付订单失败',\r\n        error\r\n      );\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 发起退款\r\n   * @param providerName 支付提供商名称\r\n   * @param request 退款请求\r\n   * @returns 退款响应\r\n   */\r\n  async refund(\r\n    providerName: string,\r\n    request: RefundRequest\r\n  ): Promise<RefundResponse> {\r\n    try {\r\n      // 获取 Provider 实例\r\n      const provider = this.getProvider(providerName);\r\n\r\n      // 使用 Provider 发起退款\r\n      const result = await provider.refund(request);\r\n\r\n      // 记录成功日志\r\n      if (this.config.global?.enableLog) {\r\n        console.log(`✅ ${providerName} 发起退款成功:`, {\r\n          outRefundNo: request.outRefundNo,\r\n          refundAmount: request.refundAmount,\r\n        });\r\n      }\r\n\r\n      return result;\r\n    } catch (error) {\r\n      // 记录错误日志\r\n      if (this.config.global?.enableLog) {\r\n        console.error('❌ 发起退款失败:', error);\r\n      }\r\n\r\n      if (error instanceof PaymentError) {\r\n        throw error;\r\n      }\r\n\r\n      throw new PaymentError(\r\n        PaymentErrorCode.UNKNOWN_PROVIDER,\r\n        '发起退款失败',\r\n        error\r\n      );\r\n    }\r\n  }\r\n}\r\n\r\n/**\r\n * 创建支付管理器实例\r\n */\r\nexport function createPaymentManagerV2(\r\n  config?: Partial<PaymentConfig>\r\n): PaymentManagerV2 {\r\n  return new PaymentManagerV2(config);\r\n}\r\n","import {\r\n  UnifiedPaymentNotification,\r\n  HookHandler,\r\n  HookEvent,\r\n} from '../types/payment';\r\n\r\n/**\r\n * Hook 管理器\r\n */\r\nexport class HookManager {\r\n  private hooks: Map<HookEvent, HookHandler[]> = new Map();\r\n\r\n  /**\r\n   * 注册 Hook\r\n   * @param event 事件名称\r\n   * @param handler 处理函数\r\n   */\r\n  on(event: HookEvent, handler: HookHandler): void {\r\n    const handlers = this.hooks.get(event) || [];\r\n    handlers.push(handler);\r\n    this.hooks.set(event, handlers);\r\n  }\r\n\r\n  /**\r\n   * 注销 Hook\r\n   * @param event 事件名称\r\n   * @param handler 处理函数\r\n   */\r\n  off(event: HookEvent, handler: HookHandler): void {\r\n    const handlers = this.hooks.get(event) || [];\r\n    const index = handlers.indexOf(handler);\r\n    if (index > -1) {\r\n      handlers.splice(index, 1);\r\n      this.hooks.set(event, handlers);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 触发 Hook\r\n   * @param event 事件名称\r\n   * @param notification 支付通知\r\n   */\r\n  async emit(\r\n    event: HookEvent,\r\n    notification: UnifiedPaymentNotification\r\n  ): Promise<void> {\r\n    const handlers = this.hooks.get(event) || [];\r\n\r\n    // 并行执行所有处理函数\r\n    const promises = handlers.map(handler => {\r\n      try {\r\n        return Promise.resolve(handler(notification));\r\n      } catch (error) {\r\n        console.error(`Hook ${event} 执行失败:`, error);\r\n        return Promise.resolve();\r\n      }\r\n    });\r\n\r\n    await Promise.allSettled(promises);\r\n  }\r\n\r\n  /**\r\n   * 清除所有 Hook\r\n   */\r\n  clear(): void {\r\n    this.hooks.clear();\r\n  }\r\n\r\n  /**\r\n   * 获取指定事件的 Hook 数量\r\n   * @param event 事件名称\r\n   * @returns Hook 数量\r\n   */\r\n  getHookCount(event: HookEvent): number {\r\n    return this.hooks.get(event)?.length || 0;\r\n  }\r\n\r\n  /**\r\n   * 获取所有已注册的事件\r\n   * @returns 事件列表\r\n   */\r\n  getRegisteredEvents(): HookEvent[] {\r\n    return Array.from(this.hooks.keys());\r\n  }\r\n}\r\n\r\n/**\r\n * 根据支付状态触发相应的 Hook\r\n * @param notification 支付通知\r\n * @param hookManager Hook 管理器\r\n */\r\nexport async function callStatusHooks(\r\n  notification: UnifiedPaymentNotification,\r\n  hookManager: HookManager\r\n): Promise<void> {\r\n  // 先触发通用的 onNotify Hook\r\n  await hookManager.emit('onNotify', notification);\r\n\r\n  // 再根据状态触发对应的 Hook\r\n  switch (notification.tradeStatus) {\r\n    case 'SUCCESS':\r\n      await hookManager.emit('onSuccess', notification);\r\n      break;\r\n    case 'FAIL':\r\n      await hookManager.emit('onFail', notification);\r\n      break;\r\n    case 'PENDING':\r\n      await hookManager.emit('onPending', notification);\r\n      break;\r\n  }\r\n}\r\n","// 导出基础抽象类和接口\r\nexport { BaseProvider } from './BaseProvider';\r\nexport type { BaseProviderConfig, VerifyResult } from './BaseProvider';\r\nexport { ProviderFactory, defaultProviderFactory } from './ProviderFactory';\r\nexport type {\r\n  ProviderConstructor,\r\n  ProviderRegistration,\r\n} from './ProviderFactory';\r\n\r\n// 导出具体的 Provider 实现\r\nexport { WechatProvider } from '../wechat/WechatProvider';\r\nexport type { WechatProviderConfig } from '../wechat/WechatProvider';\r\nexport { AlipayProvider } from '../alipay/AlipayProvider';\r\nexport type { AlipayProviderConfig } from '../alipay/AlipayProvider';\r\n\r\n// 自动注册内置 Provider\r\nimport { defaultProviderFactory } from './ProviderFactory';\r\nimport { WechatProvider } from '../wechat/WechatProvider';\r\nimport { AlipayProvider } from '../alipay/AlipayProvider';\r\n\r\n/**\r\n * 注册内置 Provider\r\n */\r\nexport function registerBuiltInProviders(): void {\r\n  // 注册微信支付 Provider\r\n  if (!defaultProviderFactory.isRegistered('wechat')) {\r\n    defaultProviderFactory.register('wechat', {\r\n      constructor: WechatProvider,\r\n      defaultConfig: {\r\n        enabled: false,\r\n        sandbox: false,\r\n      },\r\n      description: '微信支付 Provider - 支持微信支付 v3 API',\r\n    });\r\n  }\r\n\r\n  // 注册支付宝 Provider\r\n  if (!defaultProviderFactory.isRegistered('alipay')) {\r\n    defaultProviderFactory.register('alipay', {\r\n      constructor: AlipayProvider,\r\n      defaultConfig: {\r\n        enabled: false,\r\n        sandbox: false,\r\n        signType: 'RSA2',\r\n        gateway: 'https://openapi.alipay.com/gateway.do',\r\n      },\r\n      description: '支付宝 Provider - 支持支付宝开放平台 API',\r\n    });\r\n  }\r\n}\r\n\r\n/**\r\n * 获取所有注册的 Provider 信息\r\n */\r\nexport function getRegisteredProviderInfo(): Array<{\r\n  name: string;\r\n  description?: string;\r\n  supportedMethods: string[];\r\n  defaultConfig: any;\r\n}> {\r\n  const providers: Array<{\r\n    name: string;\r\n    description?: string;\r\n    supportedMethods: string[];\r\n    defaultConfig: any;\r\n  }> = [];\r\n\r\n  const registrations = defaultProviderFactory.getAllRegistrations();\r\n\r\n  for (const [name, registration] of registrations) {\r\n    // 创建临时实例获取支持的方法\r\n    try {\r\n      const tempInstance = new registration.constructor({\r\n        enabled: false,\r\n        ...registration.defaultConfig,\r\n        // 提供最小必要配置以通过验证\r\n        ...(name === 'wechat'\r\n          ? {\r\n              appId: 'wx0000000000000000',\r\n              mchId: '0000000000',\r\n              apiV3Key: '00000000000000000000000000000000',\r\n              privateKey: 'temp-key',\r\n              serialNo: 'temp-serial',\r\n            }\r\n          : {}),\r\n        ...(name === 'alipay'\r\n          ? {\r\n              appId: '0000000000000000',\r\n              privateKey: 'temp-key',\r\n              alipayPublicKey: 'temp-key',\r\n            }\r\n          : {}),\r\n      } as any);\r\n\r\n      providers.push({\r\n        name,\r\n        description: registration.description,\r\n        supportedMethods: tempInstance.getSupportedMethods(),\r\n        defaultConfig: registration.defaultConfig,\r\n      });\r\n    } catch (error) {\r\n      // 如果无法创建实例，至少提供基本信息\r\n      providers.push({\r\n        name,\r\n        description: registration.description,\r\n        supportedMethods: [],\r\n        defaultConfig: registration.defaultConfig,\r\n      });\r\n    }\r\n  }\r\n\r\n  return providers;\r\n}\r\n\r\n// 自动注册内置 Provider\r\nregisterBuiltInProviders();\r\n","import { BaseProvider, BaseProviderConfig } from './BaseProvider';\r\nimport { PaymentError, PaymentErrorCode } from '../../types/payment';\r\n\r\n/**\r\n * Provider 构造函数类型\r\n */\r\nexport type ProviderConstructor<\r\n  TConfig extends BaseProviderConfig = BaseProviderConfig,\r\n> = {\r\n  new (config: TConfig): BaseProvider<TConfig>;\r\n};\r\n\r\n/**\r\n * Provider 注册信息\r\n */\r\nexport interface ProviderRegistration<\r\n  TConfig extends BaseProviderConfig = BaseProviderConfig,\r\n> {\r\n  /** Provider 构造函数 */\r\n  constructor: ProviderConstructor<TConfig>;\r\n  /** 默认配置 */\r\n  defaultConfig?: Partial<TConfig>;\r\n  /** 描述信息 */\r\n  description?: string;\r\n}\r\n\r\n/**\r\n * Provider 工厂类\r\n * 负责管理和创建 Provider 实例\r\n */\r\nexport class ProviderFactory {\r\n  private static instance: ProviderFactory;\r\n  private providers: Map<string, ProviderRegistration<any>> = new Map();\r\n  private instances: Map<string, BaseProvider> = new Map();\r\n\r\n  /**\r\n   * 获取单例实例\r\n   */\r\n  static getInstance(): ProviderFactory {\r\n    if (!ProviderFactory.instance) {\r\n      ProviderFactory.instance = new ProviderFactory();\r\n    }\r\n    return ProviderFactory.instance;\r\n  }\r\n\r\n  /**\r\n   * 注册 Provider\r\n   * @param name Provider 名称\r\n   * @param registration 注册信息\r\n   */\r\n  register<TConfig extends BaseProviderConfig>(\r\n    name: string,\r\n    registration: ProviderRegistration<TConfig>\r\n  ): void {\r\n    if (this.providers.has(name)) {\r\n      throw new PaymentError(\r\n        PaymentErrorCode.CONFIG_ERROR,\r\n        `Provider ${name} 已经注册`\r\n      );\r\n    }\r\n\r\n    this.providers.set(name, registration);\r\n  }\r\n\r\n  /**\r\n   * 注销 Provider\r\n   * @param name Provider 名称\r\n   */\r\n  unregister(name: string): void {\r\n    this.providers.delete(name);\r\n    this.instances.delete(name);\r\n  }\r\n\r\n  /**\r\n   * 创建 Provider 实例\r\n   * @param name Provider 名称\r\n   * @param config 配置\r\n   * @returns Provider 实例\r\n   */\r\n  create<TConfig extends BaseProviderConfig>(\r\n    name: string,\r\n    config: TConfig\r\n  ): BaseProvider<TConfig> {\r\n    const registration = this.providers.get(\r\n      name\r\n    ) as ProviderRegistration<TConfig>;\r\n    if (!registration) {\r\n      throw new PaymentError(\r\n        PaymentErrorCode.UNKNOWN_PROVIDER,\r\n        `未知的 Provider: ${name}`\r\n      );\r\n    }\r\n\r\n    // 合并默认配置\r\n    const finalConfig = {\r\n      ...registration.defaultConfig,\r\n      ...config,\r\n    } as TConfig;\r\n\r\n    const instance = new registration.constructor(finalConfig);\r\n\r\n    // 缓存实例\r\n    this.instances.set(name, instance);\r\n\r\n    return instance;\r\n  }\r\n\r\n  /**\r\n   * 获取或创建 Provider 实例\r\n   * @param name Provider 名称\r\n   * @param config 配置（如果实例不存在）\r\n   * @returns Provider 实例\r\n   */\r\n  getOrCreate<TConfig extends BaseProviderConfig>(\r\n    name: string,\r\n    config?: TConfig\r\n  ): BaseProvider<TConfig> {\r\n    const existingInstance = this.instances.get(name);\r\n    if (existingInstance) {\r\n      return existingInstance as BaseProvider<TConfig>;\r\n    }\r\n\r\n    if (!config) {\r\n      throw new PaymentError(\r\n        PaymentErrorCode.CONFIG_ERROR,\r\n        `Provider ${name} 不存在且未提供配置`\r\n      );\r\n    }\r\n\r\n    return this.create(name, config);\r\n  }\r\n\r\n  /**\r\n   * 获取已创建的 Provider 实例\r\n   * @param name Provider 名称\r\n   * @returns Provider 实例或 undefined\r\n   */\r\n  getInstance(name: string): BaseProvider | undefined {\r\n    return this.instances.get(name);\r\n  }\r\n\r\n  /**\r\n   * 检查 Provider 是否已注册\r\n   * @param name Provider 名称\r\n   * @returns 是否已注册\r\n   */\r\n  isRegistered(name: string): boolean {\r\n    return this.providers.has(name);\r\n  }\r\n\r\n  /**\r\n   * 获取所有已注册的 Provider 名称\r\n   * @returns Provider 名称列表\r\n   */\r\n  getRegisteredProviders(): string[] {\r\n    return Array.from(this.providers.keys());\r\n  }\r\n\r\n  /**\r\n   * 获取所有已创建的实例\r\n   * @returns 实例映射\r\n   */\r\n  getAllInstances(): Map<string, BaseProvider> {\r\n    return new Map(this.instances);\r\n  }\r\n\r\n  /**\r\n   * 批量创建 Provider 实例\r\n   * @param configs Provider 配置映射\r\n   * @returns 创建的实例映射\r\n   */\r\n  createBatch(\r\n    configs: Record<string, BaseProviderConfig>\r\n  ): Map<string, BaseProvider> {\r\n    const results = new Map<string, BaseProvider>();\r\n\r\n    for (const [name, config] of Object.entries(configs)) {\r\n      try {\r\n        const instance = this.create(name, config);\r\n        results.set(name, instance);\r\n      } catch (error) {\r\n        console.warn(`创建 Provider ${name} 失败:`, error);\r\n      }\r\n    }\r\n\r\n    return results;\r\n  }\r\n\r\n  /**\r\n   * 清除所有实例\r\n   */\r\n  clearInstances(): void {\r\n    this.instances.clear();\r\n  }\r\n\r\n  /**\r\n   * 清除所有注册和实例\r\n   */\r\n  reset(): void {\r\n    this.providers.clear();\r\n    this.instances.clear();\r\n  }\r\n\r\n  /**\r\n   * 获取 Provider 注册信息\r\n   * @param name Provider 名称\r\n   * @returns 注册信息\r\n   */\r\n  getRegistration(name: string): ProviderRegistration<any> | undefined {\r\n    return this.providers.get(name);\r\n  }\r\n\r\n  /**\r\n   * 获取所有注册信息\r\n   * @returns 注册信息映射\r\n   */\r\n  getAllRegistrations(): Map<string, ProviderRegistration<any>> {\r\n    return new Map(this.providers);\r\n  }\r\n}\r\n\r\n/**\r\n * 默认工厂实例\r\n */\r\nexport const defaultProviderFactory = ProviderFactory.getInstance();\r\n","import {\r\n  PaymentConfig,\r\n  WechatPayConfig,\r\n  AlipayConfig,\r\n  EnvConfig,\r\n} from '../types/config';\r\nimport { PaymentError, PaymentErrorCode } from '../types/payment';\r\n\r\n/**\r\n * 默认配置\r\n */\r\nconst defaultConfig: Partial<PaymentConfig> = {\r\n  global: {\r\n    timeout: 30000,\r\n    retries: 3,\r\n    logLevel: 'info',\r\n    enableLog: true,\r\n  },\r\n};\r\n\r\n/**\r\n * 从环境变量加载配置\r\n * @returns 配置对象\r\n */\r\nexport function loadConfigFromEnv(): Partial<PaymentConfig> {\r\n  const env = process.env as unknown as EnvConfig;\r\n\r\n  const config: Partial<PaymentConfig> = {\r\n    ...defaultConfig,\r\n  };\r\n\r\n  // 微信支付配置\r\n  if (env.WECHAT_APP_ID && env.WECHAT_MCH_ID) {\r\n    config.wechat = {\r\n      enabled: true,\r\n      sandbox: false,\r\n      appId: env.WECHAT_APP_ID,\r\n      mchId: env.WECHAT_MCH_ID,\r\n      apiV3Key: env.WECHAT_API_V3_KEY || '',\r\n      privateKey: env.WECHAT_PRIVATE_KEY || '',\r\n      serialNo: env.WECHAT_SERIAL_NO || '',\r\n      platformCertificate: env.WECHAT_PLATFORM_CERT,\r\n      notifyUrl: env.WECHAT_NOTIFY_URL,\r\n    };\r\n  }\r\n\r\n  // 支付宝配置\r\n  if (env.ALIPAY_APP_ID && env.ALIPAY_PRIVATE_KEY) {\r\n    config.alipay = {\r\n      enabled: true,\r\n      sandbox: false,\r\n      appId: env.ALIPAY_APP_ID,\r\n      privateKey: env.ALIPAY_PRIVATE_KEY,\r\n      alipayPublicKey: env.ALIPAY_PUBLIC_KEY || '',\r\n      signType: (env.ALIPAY_SIGN_TYPE as 'RSA2' | 'RSA') || 'RSA2',\r\n      gateway: env.ALIPAY_GATEWAY || 'https://openapi.alipay.com/gateway.do',\r\n      notifyUrl: env.ALIPAY_NOTIFY_URL,\r\n      returnUrl: env.ALIPAY_RETURN_URL,\r\n    };\r\n  }\r\n\r\n  // 全局配置\r\n  if (env.PAYMENT_TIMEOUT) {\r\n    config.global!.timeout = parseInt(env.PAYMENT_TIMEOUT, 10);\r\n  }\r\n  if (env.PAYMENT_RETRIES) {\r\n    config.global!.retries = parseInt(env.PAYMENT_RETRIES, 10);\r\n  }\r\n  if (env.PAYMENT_LOG_LEVEL) {\r\n    config.global!.logLevel = env.PAYMENT_LOG_LEVEL as any;\r\n  }\r\n  if (env.PAYMENT_ENABLE_LOG) {\r\n    config.global!.enableLog = env.PAYMENT_ENABLE_LOG === 'true';\r\n  }\r\n\r\n  return config;\r\n}\r\n\r\n/**\r\n * 验证微信支付配置\r\n * @param config 微信支付配置\r\n */\r\nexport function validateWechatConfig(config: WechatPayConfig): void {\r\n  const required = ['appId', 'mchId', 'apiV3Key', 'privateKey', 'serialNo'];\r\n\r\n  for (const key of required) {\r\n    if (!config[key as keyof WechatPayConfig]) {\r\n      throw new PaymentError(\r\n        PaymentErrorCode.CONFIG_ERROR,\r\n        `微信支付配置缺少必要参数: ${key}`\r\n      );\r\n    }\r\n  }\r\n}\r\n\r\n/**\r\n * 验证支付宝配置\r\n * @param config 支付宝配置\r\n */\r\nexport function validateAlipayConfig(config: AlipayConfig): void {\r\n  const required = ['appId', 'privateKey', 'alipayPublicKey'];\r\n\r\n  for (const key of required) {\r\n    if (!config[key as keyof AlipayConfig]) {\r\n      throw new PaymentError(\r\n        PaymentErrorCode.CONFIG_ERROR,\r\n        `支付宝配置缺少必要参数: ${key}`\r\n      );\r\n    }\r\n  }\r\n}\r\n\r\n/**\r\n * 合并配置\r\n * @param userConfig 用户配置\r\n * @param envConfig 环境变量配置\r\n * @returns 合并后的配置\r\n */\r\nexport function mergeConfig(\r\n  userConfig: Partial<PaymentConfig> = {},\r\n  envConfig: Partial<PaymentConfig> = {}\r\n): PaymentConfig {\r\n  return {\r\n    wechat: { ...envConfig.wechat, ...userConfig.wechat },\r\n    alipay: { ...envConfig.alipay, ...userConfig.alipay },\r\n    hooks: { ...envConfig.hooks, ...userConfig.hooks },\r\n    global: {\r\n      ...defaultConfig.global,\r\n      ...envConfig.global,\r\n      ...userConfig.global,\r\n    },\r\n  } as PaymentConfig;\r\n}\r\n\r\n/**\r\n * 获取完整配置\r\n * @param userConfig 用户配置\r\n * @returns 完整配置\r\n */\r\nexport function getConfig(\r\n  userConfig: Partial<PaymentConfig> = {}\r\n): PaymentConfig {\r\n  const envConfig = loadConfigFromEnv();\r\n  const finalConfig = mergeConfig(userConfig, envConfig);\r\n\r\n  // 验证配置\r\n  if (finalConfig.wechat?.enabled) {\r\n    validateWechatConfig(finalConfig.wechat);\r\n  }\r\n\r\n  if (finalConfig.alipay?.enabled) {\r\n    validateAlipayConfig(finalConfig.alipay);\r\n  }\r\n\r\n  return finalConfig;\r\n}\r\n","import { PaymentManagerV2 } from '../core/PaymentManagerV2';\r\nimport {\r\n  PaymentNotifyPayload,\r\n  PaymentMethod,\r\n  UnifiedPaymentNotification,\r\n  PaymentError,\r\n  PaymentErrorCode,\r\n} from '../types/payment';\r\nimport {\r\n  BaseProvider,\r\n  WechatProvider,\r\n  AlipayProvider,\r\n} from '../providers/base';\r\n\r\n/**\r\n * Next.js App Router 响应类型\r\n */\r\ntype NextResponse = Response;\r\n\r\n/**\r\n * Next.js App Router 请求类型\r\n */\r\ninterface NextRequest extends Request {\r\n  formData(): Promise<FormData>;\r\n  json(): Promise<any>;\r\n}\r\n\r\n/**\r\n * 响应构建器接口\r\n */\r\ninterface ResponseBuilder {\r\n  buildSuccessResponse(): {\r\n    status: number;\r\n    body: any;\r\n    headers: Record<string, string>;\r\n  };\r\n  buildFailureResponse(error?: string): {\r\n    status: number;\r\n    body: any;\r\n    headers: Record<string, string>;\r\n  };\r\n}\r\n\r\n/**\r\n * V2 回调处理器配置\r\n */\r\nexport interface NotifyHandlerV2Config {\r\n  /** 支付管理器 V2 */\r\n  paymentManager: PaymentManagerV2;\r\n  /** 支付方式 */\r\n  method: PaymentMethod;\r\n  /** 成功回调 */\r\n  onSuccess?: (\r\n    notification: UnifiedPaymentNotification\r\n  ) => void | Promise<void>;\r\n  /** 失败回调 */\r\n  onFail?: (notification: UnifiedPaymentNotification) => void | Promise<void>;\r\n  /** 待处理回调 */\r\n  onPending?: (\r\n    notification: UnifiedPaymentNotification\r\n  ) => void | Promise<void>;\r\n  /** 错误回调 */\r\n  onError?: (error: PaymentError) => void | Promise<void>;\r\n  /** 自定义响应构建器 */\r\n  responseBuilder?: ResponseBuilder;\r\n  /** 启用调试日志 */\r\n  enableDebugLog?: boolean;\r\n}\r\n\r\n/**\r\n * 默认响应构建器\r\n */\r\nclass DefaultResponseBuilder implements ResponseBuilder {\r\n  constructor(private provider: BaseProvider) {}\r\n\r\n  buildSuccessResponse() {\r\n    const response = this.provider.generateSuccessResponse();\r\n    return {\r\n      status: 200,\r\n      body: response,\r\n      headers: this.getHeaders(response),\r\n    };\r\n  }\r\n\r\n  buildFailureResponse(error?: string) {\r\n    const response = this.provider.generateFailureResponse(error);\r\n    return {\r\n      status: 400,\r\n      body: response,\r\n      headers: this.getHeaders(response),\r\n    };\r\n  }\r\n\r\n  private getHeaders(_response: any): Record<string, string> {\r\n    if (this.provider instanceof WechatProvider) {\r\n      return { 'Content-Type': 'application/json' };\r\n    }\r\n    if (this.provider instanceof AlipayProvider) {\r\n      return { 'Content-Type': 'text/plain' };\r\n    }\r\n    return { 'Content-Type': 'application/json' };\r\n  }\r\n}\r\n\r\n/**\r\n * 创建 V2 通用回调处理器\r\n * @param config 配置\r\n * @returns 路由处理函数\r\n */\r\nexport function createNotifyHandlerV2(config: NotifyHandlerV2Config) {\r\n  const {\r\n    paymentManager,\r\n    method,\r\n    onSuccess,\r\n    onFail,\r\n    onPending,\r\n    onError,\r\n    responseBuilder,\r\n    enableDebugLog = false,\r\n  } = config;\r\n\r\n  return async function POST(request: NextRequest): Promise<NextResponse> {\r\n    const startTime = Date.now();\r\n\r\n    try {\r\n      if (enableDebugLog) {\r\n        console.log(`🔄 [${method}] 开始处理支付回调...`);\r\n      }\r\n\r\n      // 解析支付载荷\r\n      const payload = await parsePaymentPayload(request, method);\r\n\r\n      if (enableDebugLog) {\r\n        console.log(`📦 [${method}] 载荷解析完成`);\r\n      }\r\n\r\n      // 使用 PaymentManagerV2 处理回调\r\n      const result = await paymentManager.handleNotify(method, payload);\r\n\r\n      if (enableDebugLog) {\r\n        console.log(`✅ [${method}] 回调处理完成:`, {\r\n          outTradeNo: result.outTradeNo,\r\n          status: result.tradeStatus,\r\n          duration: Date.now() - startTime,\r\n        });\r\n      }\r\n\r\n      // 执行状态回调\r\n      await executeStatusCallbacks(result, { onSuccess, onFail, onPending });\r\n\r\n      // 构建响应\r\n      const response = await buildResponse(\r\n        paymentManager,\r\n        method,\r\n        result,\r\n        responseBuilder\r\n      );\r\n\r\n      return new Response(\r\n        typeof response.body === 'string'\r\n          ? response.body\r\n          : JSON.stringify(response.body),\r\n        {\r\n          status: response.status,\r\n          headers: response.headers,\r\n        }\r\n      );\r\n    } catch (error) {\r\n      const duration = Date.now() - startTime;\r\n\r\n      if (enableDebugLog) {\r\n        console.error(`❌ [${method}] 回调处理失败 (${duration}ms):`, error);\r\n      }\r\n\r\n      // 执行错误回调\r\n      if (onError && error instanceof PaymentError) {\r\n        try {\r\n          await onError(error);\r\n        } catch (callbackError) {\r\n          console.error('错误回调执行失败:', callbackError);\r\n        }\r\n      }\r\n\r\n      // 构建错误响应\r\n      const errorResponse = await buildErrorResponse(\r\n        paymentManager,\r\n        method,\r\n        error,\r\n        responseBuilder\r\n      );\r\n\r\n      return new Response(\r\n        typeof errorResponse.body === 'string'\r\n          ? errorResponse.body\r\n          : JSON.stringify(errorResponse.body),\r\n        {\r\n          status: errorResponse.status,\r\n          headers: errorResponse.headers,\r\n        }\r\n      );\r\n    }\r\n  };\r\n}\r\n\r\n/**\r\n * 解析支付载荷\r\n */\r\nasync function parsePaymentPayload(\r\n  request: NextRequest,\r\n  method: PaymentMethod\r\n): Promise<PaymentNotifyPayload> {\r\n  if (method.startsWith('wechat.')) {\r\n    const raw = await request.json();\r\n    const headers: Record<string, string> = {};\r\n    request.headers.forEach((value, key) => {\r\n      headers[key] = value;\r\n    });\r\n\r\n    return {\r\n      provider: 'wechat',\r\n      raw,\r\n      headers,\r\n    };\r\n  }\r\n\r\n  if (method.startsWith('alipay.')) {\r\n    const formData = await request.formData();\r\n    const raw: Record<string, string> = {};\r\n\r\n    formData.forEach((value, key) => {\r\n      raw[key] = value.toString();\r\n    });\r\n\r\n    return {\r\n      provider: 'alipay',\r\n      raw,\r\n    };\r\n  }\r\n\r\n  throw new PaymentError(\r\n    PaymentErrorCode.INVALID_PARAMS,\r\n    `不支持的支付方式: ${method}`\r\n  );\r\n}\r\n\r\n/**\r\n * 执行状态回调\r\n */\r\nasync function executeStatusCallbacks(\r\n  result: UnifiedPaymentNotification,\r\n  callbacks: {\r\n    onSuccess?: (\r\n      notification: UnifiedPaymentNotification\r\n    ) => void | Promise<void>;\r\n    onFail?: (notification: UnifiedPaymentNotification) => void | Promise<void>;\r\n    onPending?: (\r\n      notification: UnifiedPaymentNotification\r\n    ) => void | Promise<void>;\r\n  }\r\n) {\r\n  const { onSuccess, onFail, onPending } = callbacks;\r\n\r\n  try {\r\n    switch (result.tradeStatus) {\r\n      case 'SUCCESS':\r\n        if (onSuccess) await onSuccess(result);\r\n        break;\r\n      case 'FAIL':\r\n        if (onFail) await onFail(result);\r\n        break;\r\n      case 'PENDING':\r\n        if (onPending) await onPending(result);\r\n        break;\r\n    }\r\n  } catch (error) {\r\n    console.error('状态回调执行失败:', error);\r\n    // 不抛出错误，避免影响主流程\r\n  }\r\n}\r\n\r\n/**\r\n * 构建响应\r\n */\r\nasync function buildResponse(\r\n  paymentManager: PaymentManagerV2,\r\n  method: PaymentMethod,\r\n  result: UnifiedPaymentNotification,\r\n  customBuilder?: ResponseBuilder\r\n) {\r\n  const providerName = method.split('.')[0];\r\n  const provider = paymentManager.getProviderInstance(providerName);\r\n\r\n  if (!provider) {\r\n    throw new PaymentError(\r\n      PaymentErrorCode.UNKNOWN_PROVIDER,\r\n      `未找到 Provider: ${providerName}`\r\n    );\r\n  }\r\n\r\n  const builder = customBuilder || new DefaultResponseBuilder(provider);\r\n\r\n  if (result.tradeStatus === 'SUCCESS') {\r\n    return builder.buildSuccessResponse();\r\n  }\r\n\r\n  return builder.buildFailureResponse(`处理失败: ${result.tradeStatus}`);\r\n}\r\n\r\n/**\r\n * 构建错误响应\r\n */\r\nasync function buildErrorResponse(\r\n  paymentManager: PaymentManagerV2,\r\n  method: PaymentMethod,\r\n  error: any,\r\n  customBuilder?: ResponseBuilder\r\n) {\r\n  const providerName = method.split('.')[0];\r\n  const provider = paymentManager.getProviderInstance(providerName);\r\n\r\n  if (provider) {\r\n    const builder = customBuilder || new DefaultResponseBuilder(provider);\r\n    return {\r\n      ...builder.buildFailureResponse(error.message || '服务器错误'),\r\n      status: 500,\r\n    };\r\n  }\r\n\r\n  // 默认错误响应\r\n  return {\r\n    status: 500,\r\n    body: { code: 'FAIL', message: '服务器错误' },\r\n    headers: { 'Content-Type': 'application/json' },\r\n  };\r\n}\r\n\r\n/**\r\n * 创建快捷微信支付处理器\r\n */\r\nexport function createWechatNotifyHandlerV2(\r\n  paymentManager: PaymentManagerV2,\r\n  method: PaymentMethod = 'wechat.native',\r\n  options?: Omit<NotifyHandlerV2Config, 'paymentManager' | 'method'>\r\n) {\r\n  return createNotifyHandlerV2({\r\n    paymentManager,\r\n    method,\r\n    ...options,\r\n  });\r\n}\r\n\r\n/**\r\n * 创建快捷支付宝处理器\r\n */\r\nexport function createAlipayNotifyHandlerV2(\r\n  paymentManager: PaymentManagerV2,\r\n  method: PaymentMethod = 'alipay.qrcode',\r\n  options?: Omit<NotifyHandlerV2Config, 'paymentManager' | 'method'>\r\n) {\r\n  return createNotifyHandlerV2({\r\n    paymentManager,\r\n    method,\r\n    ...options,\r\n  });\r\n}\r\n"]}