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