{"version":3,"sources":["../../../src/frameworks/express/index.ts","../../../src/frameworks/express/router.ts","../../../src/errors/newebpay-error.ts","../../../src/infrastructure/aes256-encoder.ts","../../../src/infrastructure/check-value-encoder.ts","../../../src/utils/timestamp.ts","../../../src/content.ts","../../../src/form-builder.ts","../../../src/operations/credit-payment.ts","../../../src/operations/credit-installment.ts","../../../src/operations/atm-payment.ts","../../../src/operations/web-atm-payment.ts","../../../src/operations/cvs-payment.ts","../../../src/operations/barcode-payment.ts","../../../src/operations/linepay-payment.ts","../../../src/operations/taiwanpay-payment.ts","../../../src/operations/esun-wallet-payment.ts","../../../src/operations/bitopay-payment.ts","../../../src/operations/twqr-payment.ts","../../../src/operations/fula-payment.ts","../../../src/operations/cvscom-payment.ts","../../../src/operations/all-in-one-payment.ts","../../../src/notifications/payment-notify.ts","../../../src/notifications/atm-notify.ts","../../../src/notifications/cvs-notify.ts","../../../src/notifications/cvscom-notify.ts","../../../src/queries/query-order.ts","../../../src/infrastructure/http/fetch-http-client.ts","../../../src/queries/query-credit-detail.ts","../../../src/actions/credit-close.ts","../../../src/actions/credit-cancel.ts","../../../src/actions/ewallet-refund.ts","../../../src/frameworks/common/payment-builder.ts","../../../src/frameworks/common/newebpay-service.ts","../../../src/frameworks/express/middleware.ts","../../../src/frameworks/common/config.ts"],"sourcesContent":["export { createNewebPayRouter } from './router.js';\nexport {\n  paymentNotifyMiddleware,\n  atmNotifyMiddleware,\n  cvsNotifyMiddleware,\n  cvscomNotifyMiddleware,\n} from './middleware.js';\nexport type { NewebPayConfig } from '../common/config.js';\nexport { NewebPayService } from '../common/newebpay-service.js';\nexport { PaymentBuilder } from '../common/payment-builder.js';\nexport { loadConfigFromEnv } from '../common/config.js';\n","import type { Router } from 'express';\nimport express from 'express';\nimport type { NewebPayConfig } from '../common/config.js';\nimport { NewebPayService } from '../common/newebpay-service.js';\nimport {\n  atmNotifyMiddleware,\n  cvsNotifyMiddleware,\n  cvscomNotifyMiddleware,\n  paymentNotifyMiddleware,\n} from './middleware.js';\n\n/**\n * 建立藍新金流 Express Router\n */\nexport function createNewebPayRouter(config: NewebPayConfig): Router {\n  const router = express.Router();\n  const newebpay = new NewebPayService(config);\n\n  // POST /payment/create - 建立支付\n  router.post('/payment/create', express.json(), (req, res): void => {\n    try {\n      const { orderId, amount, itemDesc, email, paymentType, expireDate } = req.body;\n\n      if (!orderId || !amount || !itemDesc) {\n        res.status(400).json({\n          error: 'Missing required fields: orderId, amount, itemDesc',\n        });\n        return;\n      }\n\n      const builder = newebpay.payment(orderId, amount, itemDesc, email ?? '');\n\n      // 根據 paymentType 設定支付方式\n      switch (paymentType) {\n        case 'credit':\n          builder.creditCard();\n          break;\n        case 'installment':\n          builder.creditInstallment(req.body.installments);\n          break;\n        case 'webatm':\n          builder.webAtm();\n          break;\n        case 'atm':\n          builder.atm(expireDate);\n          break;\n        case 'cvs':\n          builder.cvs(expireDate);\n          break;\n        case 'barcode':\n          builder.barcode(expireDate);\n          break;\n        case 'linepay':\n          builder.linePay();\n          break;\n        case 'taiwanpay':\n          builder.taiwanPay();\n          break;\n        case 'allinone':\n          builder.allInOne();\n          break;\n        default:\n          builder.creditCard();\n      }\n\n      // 自訂設定（透過設定物件，而非 function）\n      // 注意：JSON body 無法包含 function，此處保留供未來擴展使用\n\n      const params = builder.getParams();\n\n      res.json({\n        success: true,\n        data: params,\n      });\n      return;\n    } catch (error) {\n      res.status(500).json({\n        error: error instanceof Error ? error.message : 'Unknown error',\n      });\n      return;\n    }\n  });\n\n  // POST /payment/notify - 支付完成通知\n  router.post(\n    '/payment/notify',\n    express.urlencoded({ extended: true }),\n    paymentNotifyMiddleware(config),\n    (req, res): void => {\n      const notify = req.newebpayNotify;\n\n      if (!notify || !notify.isVerified()) {\n        res.status(400).send('Verification failed');\n        return;\n      }\n\n      if (notify.isSuccess()) {\n        // 觸發事件或處理邏輯\n        // 例如：req.app.emit('newebpay:payment:success', notify);\n      }\n\n      res.send('OK');\n    }\n  );\n\n  // POST /atm/notify - ATM 取號通知\n  router.post(\n    '/atm/notify',\n    express.urlencoded({ extended: true }),\n    atmNotifyMiddleware(config),\n    (req, res): void => {\n      const notify = req.newebpayNotify;\n\n      if (!notify || !notify.isVerified()) {\n        res.status(400).send('Verification failed');\n        return;\n      }\n\n      res.send('OK');\n    }\n  );\n\n  // POST /cvs/notify - 超商取號通知\n  router.post(\n    '/cvs/notify',\n    express.urlencoded({ extended: true }),\n    cvsNotifyMiddleware(config),\n    (req, res): void => {\n      const notify = req.newebpayNotify;\n\n      if (!notify || !notify.isVerified()) {\n        res.status(400).send('Verification failed');\n        return;\n      }\n\n      res.send('OK');\n    }\n  );\n\n  // POST /cvscom/notify - 超商取貨付款通知\n  router.post(\n    '/cvscom/notify',\n    express.urlencoded({ extended: true }),\n    cvscomNotifyMiddleware(config),\n    (req, res): void => {\n      const notify = req.newebpayNotify;\n\n      if (!notify || !notify.isVerified()) {\n        res.status(400).send('Verification failed');\n        return;\n      }\n\n      res.send('OK');\n    }\n  );\n\n  return router;\n}\n","/**\n * 藍新金流 SDK 自訂例外。\n */\nexport class NewebPayError extends Error {\n  /**\n   * 錯誤代碼。\n   */\n  public readonly code: string | undefined;\n\n  /**\n   * HTTP 狀態碼（僅適用於 HTTP 錯誤）。\n   */\n  public readonly httpStatus?: number;\n\n  /**\n   * 請求 URL（僅適用於網路相關錯誤）。\n   */\n  public readonly url?: string;\n\n  /**\n   * 欄位名稱（僅適用於驗證錯誤）。\n   */\n  public readonly field?: string;\n\n  constructor(\n    message: string,\n    code?: string,\n    options?: {\n      httpStatus?: number | undefined;\n      url?: string | undefined;\n      field?: string | undefined;\n    }\n  ) {\n    super(message);\n    this.name = 'NewebPayError';\n    this.code = code;\n    if (options?.httpStatus !== undefined) {\n      this.httpStatus = options.httpStatus;\n    }\n    if (options?.url !== undefined) {\n      this.url = options.url;\n    }\n    if (options?.field !== undefined) {\n      this.field = options.field;\n    }\n    Object.setPrototypeOf(this, NewebPayError.prototype);\n  }\n\n  /**\n   * 必要欄位未填寫。\n   */\n  static required(field: string): NewebPayError {\n    return new NewebPayError(`${field} 為必填欄位`, 'REQUIRED_FIELD', { field });\n  }\n\n  /**\n   * 欄位值過長。\n   */\n  static tooLong(field: string, maxLength: number): NewebPayError {\n    return new NewebPayError(`${field} 超過最大長度 ${maxLength}`, 'FIELD_TOO_LONG', { field });\n  }\n\n  /**\n   * 欄位值無效。\n   */\n  static invalid(field: string, reason: string): NewebPayError {\n    return new NewebPayError(`${field} 無效：${reason}`, 'INVALID_FIELD', { field });\n  }\n\n  /**\n   * 解密失敗。\n   */\n  static decryptFailed(): NewebPayError {\n    return new NewebPayError('解密失敗', 'DECRYPT_FAILED');\n  }\n\n  /**\n   * CheckValue 驗證失敗。\n   */\n  static checkValueFailed(): NewebPayError {\n    return new NewebPayError('CheckValue 驗證失敗', 'CHECK_VALUE_FAILED');\n  }\n\n  /**\n   * API 請求錯誤。\n   */\n  static apiError(message: string, code?: string): NewebPayError {\n    return new NewebPayError(message, code ?? 'API_ERROR');\n  }\n\n  /**\n   * HTTP 錯誤。\n   */\n  static httpError(status: number, statusText: string, url?: string): NewebPayError {\n    return new NewebPayError(\n      `HTTP Error: ${status} ${statusText}`,\n      'HTTP_ERROR',\n      url !== undefined ? { httpStatus: status, url } : { httpStatus: status }\n    );\n  }\n\n  /**\n   * 請求超時。\n   */\n  static timeout(timeoutMs: number, url?: string): NewebPayError {\n    return new NewebPayError(\n      `Request timeout after ${timeoutMs}ms`,\n      'REQUEST_TIMEOUT',\n      url !== undefined ? { url } : undefined\n    );\n  }\n\n  /**\n   * 網路錯誤。\n   */\n  static networkError(message: string, url?: string): NewebPayError {\n    return new NewebPayError(\n      `Network error: ${message}`,\n      'NETWORK_ERROR',\n      url !== undefined ? { url } : undefined\n    );\n  }\n\n  /**\n   * 轉換為 JSON 物件。\n   */\n  toJSON(): Record<string, unknown> {\n    return {\n      name: this.name,\n      message: this.message,\n      code: this.code,\n      httpStatus: this.httpStatus,\n      url: this.url,\n      field: this.field,\n    };\n  }\n}\n","import { createCipheriv, createDecipheriv } from 'node:crypto';\nimport { NewebPayError } from '../errors/newebpay-error.js';\n\n/**\n * AES-256-CBC 加解密器。\n *\n * 依據藍新金流技術文件 4.1.1 AES256 加密規範實作。\n */\nexport class Aes256Encoder {\n  /**\n   * 加密演算法。\n   */\n  private static readonly CIPHER_METHOD = 'aes-256-cbc' as const;\n\n  /**\n   * 建立加解密器。\n   *\n   * @param hashKey HashKey\n   * @param hashIV HashIV\n   */\n  constructor(\n    private readonly hashKey: string,\n    private readonly hashIV: string\n  ) {}\n\n  /**\n   * 從設定建立加解密器。\n   *\n   * @param hashKey HashKey\n   * @param hashIV HashIV\n   */\n  static create(hashKey: string, hashIV: string): Aes256Encoder {\n    return new Aes256Encoder(hashKey, hashIV);\n  }\n\n  /**\n   * 加密資料。\n   *\n   * 將資料物件轉換為 URL 編碼查詢字串後進行 AES-256-CBC 加密。\n   *\n   * @param data 原始資料\n   * @returns 加密後的十六進位字串\n   */\n  encrypt(data: Record<string, unknown>): string {\n    // 1. 將參數組成 URL 編碼查詢字串\n    const queryString = this.buildQueryString(data);\n\n    // 2. 使用 AES-256-CBC 加密\n    const cipher = createCipheriv(Aes256Encoder.CIPHER_METHOD, this.hashKey, this.hashIV);\n\n    let encrypted = cipher.update(queryString, 'utf8', 'hex');\n    encrypted += cipher.final('hex');\n\n    return encrypted;\n  }\n\n  /**\n   * 解密資料。\n   *\n   * 將十六進位加密字串解密為資料物件。\n   *\n   * @param tradeInfo 加密的 TradeInfo 字串\n   * @returns 解密後的資料物件\n   * @throws NewebPayError 當解密失敗時\n   */\n  decrypt(tradeInfo: string): Record<string, string> {\n    // 檢查是否為有效的十六進位字串\n    if (!/^[0-9a-fA-F]+$/.test(tradeInfo) || tradeInfo.length % 2 !== 0) {\n      throw NewebPayError.decryptFailed();\n    }\n\n    try {\n      const decipher = createDecipheriv(Aes256Encoder.CIPHER_METHOD, this.hashKey, this.hashIV);\n\n      let decrypted = decipher.update(tradeInfo, 'hex', 'utf8');\n      decrypted += decipher.final('utf8');\n\n      // 解析 URL 編碼查詢字串\n      return this.parseQueryString(decrypted);\n    } catch (error) {\n      const errorMessage = error instanceof Error ? error.message : 'Unknown decryption error';\n      throw new NewebPayError(`解密失敗: ${errorMessage}`, 'DECRYPT_FAILED');\n    }\n  }\n\n  /**\n   * 建立 URL 編碼查詢字串。\n   */\n  private buildQueryString(data: Record<string, unknown>): string {\n    const params = new URLSearchParams();\n\n    for (const [key, value] of Object.entries(data)) {\n      if (value !== undefined && value !== null && value !== '') {\n        params.append(key, String(value));\n      }\n    }\n\n    return params.toString();\n  }\n\n  /**\n   * 解析 URL 編碼查詢字串。\n   */\n  private parseQueryString(queryString: string): Record<string, string> {\n    const params = new URLSearchParams(queryString);\n    const result: Record<string, string> = {};\n\n    for (const [key, value] of params.entries()) {\n      result[key] = value;\n    }\n\n    return result;\n  }\n}\n","import { createHash } from 'node:crypto';\nimport { NewebPayError } from '../errors/newebpay-error.js';\n\n/**\n * CheckValue (TradeSha) 編碼器。\n *\n * 依據藍新金流技術文件 4.1.5 CheckValue 規範實作。\n * 用於驗證交易資料的完整性。\n */\nexport class CheckValueEncoder {\n  /**\n   * 建立編碼器。\n   *\n   * @param hashKey HashKey\n   * @param hashIV HashIV\n   */\n  constructor(\n    private readonly hashKey: string,\n    private readonly hashIV: string\n  ) {}\n\n  /**\n   * 從設定建立編碼器。\n   *\n   * @param hashKey HashKey\n   * @param hashIV HashIV\n   */\n  static create(hashKey: string, hashIV: string): CheckValueEncoder {\n    return new CheckValueEncoder(hashKey, hashIV);\n  }\n\n  /**\n   * 產生 CheckValue (TradeSha)。\n   *\n   * 計算方式：SHA256(HashKey={HashKey}&{TradeInfo}&HashIV={HashIV})\n   *\n   * @param tradeInfo 加密後的 TradeInfo 字串\n   * @returns 大寫的 SHA256 雜湊值\n   */\n  generate(tradeInfo: string): string {\n    const raw = `HashKey=${this.hashKey}&${tradeInfo}&HashIV=${this.hashIV}`;\n    return createHash('sha256').update(raw).digest('hex').toUpperCase();\n  }\n\n  /**\n   * 驗證 CheckValue (TradeSha)。\n   *\n   * @param tradeInfo 加密後的 TradeInfo 字串\n   * @param tradeSha 收到的 TradeSha 值\n   */\n  verify(tradeInfo: string, tradeSha: string): boolean {\n    const calculated = this.generate(tradeInfo);\n    return tradeSha.toUpperCase() === calculated;\n  }\n\n  /**\n   * 驗證並拋出例外。\n   *\n   * @param tradeInfo 加密後的 TradeInfo 字串\n   * @param tradeSha 收到的 TradeSha 值\n   * @throws NewebPayError 當驗證失敗時\n   */\n  verifyOrFail(tradeInfo: string, tradeSha: string): void {\n    if (!this.verify(tradeInfo, tradeSha)) {\n      throw NewebPayError.checkValueFailed();\n    }\n  }\n}\n","/**\n * 取得當前 Unix 時間戳（秒）。\n *\n * @returns Unix 時間戳字串\n */\nexport function getTimestamp(): string {\n  return String(Math.floor(Date.now() / 1000));\n}\n\n/**\n * 取得當前 Unix 時間戳數字（秒）。\n *\n * @returns Unix 時間戳數字\n */\nexport function getTimestampNumber(): number {\n  return Math.floor(Date.now() / 1000);\n}\n","import { NewebPayError } from './errors/newebpay-error.js';\nimport { Aes256Encoder } from './infrastructure/aes256-encoder.js';\nimport { CheckValueEncoder } from './infrastructure/check-value-encoder.js';\nimport type { PaymentContent, PaymentInterface } from './types/payment.js';\nimport { getTimestamp } from './utils/timestamp.js';\n\n/**\n * 藍新金流 Content 基礎類別。\n *\n * 所有 MPG 支付操作類別的基類。\n */\nexport abstract class Content implements PaymentInterface {\n  /**\n   * 特店訂單編號最大長度。\n   */\n  static readonly MERCHANT_ORDER_NO_MAX_LENGTH = 30;\n\n  /**\n   * 商品資訊最大長度。\n   */\n  static readonly ITEM_DESC_MAX_LENGTH = 50;\n\n  /**\n   * Email 最大長度。\n   */\n  static readonly EMAIL_MAX_LENGTH = 50;\n\n  /**\n   * MPG API 版本。\n   */\n  protected version = '2.0';\n\n  /**\n   * API 請求路徑。\n   */\n  protected requestPath = '/MPG/mpg_gateway';\n\n  /**\n   * 是否為測試環境。\n   */\n  protected isTest = false;\n\n  /**\n   * 內容資料。\n   */\n  protected content: Record<string, unknown> = {};\n\n  /**\n   * AES256 編碼器。\n   */\n  private aesEncoder?: Aes256Encoder;\n\n  /**\n   * CheckValue 編碼器。\n   */\n  private checkValueEncoder?: CheckValueEncoder;\n\n  /**\n   * 建立 Content 實例。\n   *\n   * @param merchantId 特店編號\n   * @param hashKey HashKey\n   * @param hashIV HashIV\n   */\n  constructor(\n    protected merchantId = '',\n    protected hashKey = '',\n    protected hashIV = ''\n  ) {\n    this.validateCredentials();\n    this.initContent();\n  }\n\n  /**\n   * 驗證憑證參數。\n   */\n  private validateCredentials(): void {\n    if (!this.hashKey || this.hashKey.trim() === '') {\n      throw NewebPayError.required('HashKey');\n    }\n\n    if (!this.hashIV || this.hashIV.trim() === '') {\n      throw NewebPayError.required('HashIV');\n    }\n  }\n\n  /**\n   * 初始化內容。\n   */\n  protected initContent(): void {\n    this.content = {\n      MerchantID: this.merchantId,\n      MerchantOrderNo: '',\n      TimeStamp: getTimestamp(),\n      Version: this.version,\n      Amt: 0,\n      ItemDesc: '',\n      RespondType: 'JSON',\n      LangType: 'zh-tw',\n    };\n  }\n\n  /**\n   * 設定特店編號。\n   */\n  setMerchantID(id: string): this {\n    this.merchantId = id;\n    this.content.MerchantID = id;\n    return this;\n  }\n\n  /**\n   * 取得特店編號。\n   */\n  getMerchantID(): string {\n    return this.merchantId;\n  }\n\n  /**\n   * 設定 HashKey。\n   */\n  setHashKey(key: string): this {\n    this.hashKey = key;\n    return this;\n  }\n\n  /**\n   * 設定 HashIV。\n   */\n  setHashIV(iv: string): this {\n    this.hashIV = iv;\n    return this;\n  }\n\n  /**\n   * 設定是否為測試環境。\n   */\n  setTestMode(isTest: boolean): this {\n    this.isTest = isTest;\n    return this;\n  }\n\n  /**\n   * 是否為測試環境。\n   */\n  isTestMode(): boolean {\n    return this.isTest;\n  }\n\n  /**\n   * 設定特店訂單編號。\n   */\n  setMerchantOrderNo(orderNo: string): this {\n    if (orderNo.length > Content.MERCHANT_ORDER_NO_MAX_LENGTH) {\n      throw NewebPayError.tooLong('MerchantOrderNo', Content.MERCHANT_ORDER_NO_MAX_LENGTH);\n    }\n    this.content.MerchantOrderNo = orderNo;\n    return this;\n  }\n\n  /**\n   * 設定時間戳記。\n   */\n  setTimeStamp(timestamp: number | string): this {\n    this.content.TimeStamp = String(timestamp);\n    return this;\n  }\n\n  /**\n   * 設定訂單金額。\n   */\n  setAmt(amount: number): this {\n    if (amount <= 0) {\n      throw NewebPayError.invalid('Amt', '金額必須大於 0');\n    }\n    this.content.Amt = amount;\n    return this;\n  }\n\n  /**\n   * 設定商品資訊。\n   */\n  setItemDesc(desc: string): this {\n    if (desc.length > Content.ITEM_DESC_MAX_LENGTH) {\n      throw NewebPayError.tooLong('ItemDesc', Content.ITEM_DESC_MAX_LENGTH);\n    }\n    this.content.ItemDesc = desc;\n    return this;\n  }\n\n  /**\n   * 設定交易限制秒數。\n   */\n  setTradeLimit(seconds: number): this {\n    if (seconds < 60 || seconds > 900) {\n      throw NewebPayError.invalid('TradeLimit', '限制秒數必須在 60-900 之間');\n    }\n    this.content.TradeLimit = seconds;\n    return this;\n  }\n\n  /**\n   * 設定繳費有效期限。\n   */\n  setExpireDate(expireDate: string): this {\n    this.content.ExpireDate = expireDate;\n    return this;\n  }\n\n  /**\n   * 設定支付完成返回網址。\n   */\n  setReturnURL(url: string): this {\n    this.content.ReturnURL = url;\n    return this;\n  }\n\n  /**\n   * 設定支付通知網址。\n   */\n  setNotifyURL(url: string): this {\n    this.content.NotifyURL = url;\n    return this;\n  }\n\n  /**\n   * 設定取號完成返回網址。\n   */\n  setCustomerURL(url: string): this {\n    this.content.CustomerURL = url;\n    return this;\n  }\n\n  /**\n   * 設定返回商店網址。\n   */\n  setClientBackURL(url: string): this {\n    this.content.ClientBackURL = url;\n    return this;\n  }\n\n  /**\n   * 設定付款人電子信箱。\n   */\n  setEmail(email: string): this {\n    if (email.length > Content.EMAIL_MAX_LENGTH) {\n      throw NewebPayError.tooLong('Email', Content.EMAIL_MAX_LENGTH);\n    }\n    this.content.Email = email;\n    return this;\n  }\n\n  /**\n   * 設定是否開啟付款人資料修改。\n   */\n  setEmailModify(modify: number): this {\n    this.content.EmailModify = modify;\n    return this;\n  }\n\n  /**\n   * 設定商店備註。\n   */\n  setOrderComment(orderComment: string): this {\n    this.content.OrderComment = orderComment;\n    return this;\n  }\n\n  /**\n   * 設定語系。\n   */\n  setLangType(lang: string): this {\n    this.content.LangType = lang;\n    return this;\n  }\n\n  /**\n   * 取得請求路徑。\n   */\n  getRequestPath(): string {\n    return this.requestPath;\n  }\n\n  /**\n   * 取得 API 基礎網址。\n   */\n  getBaseUrl(): string {\n    return this.isTest ? 'https://ccore.newebpay.com' : 'https://core.newebpay.com';\n  }\n\n  /**\n   * 取得完整 API 網址。\n   */\n  getApiUrl(): string {\n    return this.getBaseUrl() + this.getRequestPath();\n  }\n\n  /**\n   * 取得 AES256 編碼器。\n   */\n  getAesEncoder(): Aes256Encoder {\n    if (!this.aesEncoder) {\n      this.aesEncoder = new Aes256Encoder(this.hashKey, this.hashIV);\n    }\n    return this.aesEncoder;\n  }\n\n  /**\n   * 取得 CheckValue 編碼器。\n   */\n  getCheckValueEncoder(): CheckValueEncoder {\n    if (!this.checkValueEncoder) {\n      this.checkValueEncoder = new CheckValueEncoder(this.hashKey, this.hashIV);\n    }\n    return this.checkValueEncoder;\n  }\n\n  /**\n   * 驗證內容資料。\n   */\n  protected abstract validation(): void;\n\n  /**\n   * 驗證基礎參數。\n   */\n  protected validateBaseParams(): void {\n    if (!this.merchantId) {\n      throw NewebPayError.required('MerchantID');\n    }\n\n    if (!this.content.MerchantOrderNo) {\n      throw NewebPayError.required('MerchantOrderNo');\n    }\n\n    const amt = this.content.Amt;\n    if (!amt || (typeof amt === 'number' && amt <= 0)) {\n      throw NewebPayError.required('Amt');\n    }\n\n    if (!this.content.ItemDesc) {\n      throw NewebPayError.required('ItemDesc');\n    }\n  }\n\n  /**\n   * 取得 Payload。\n   */\n  getPayload(): Record<string, unknown> {\n    this.validation();\n\n    // 同步 MerchantID\n    this.content.MerchantID = this.merchantId;\n\n    // 過濾空值\n    const payload: Record<string, unknown> = {};\n    for (const [key, value] of Object.entries(this.content)) {\n      if (value !== '' && value !== null && value !== undefined) {\n        payload[key] = value;\n      }\n    }\n\n    return payload;\n  }\n\n  /**\n   * 取得已加密的內容。\n   */\n  getContent(): PaymentContent {\n    const payload = this.getPayload();\n    const encoder = this.getAesEncoder();\n    const checkValueEncoder = this.getCheckValueEncoder();\n\n    // 1. 加密 TradeInfo\n    const tradeInfo = encoder.encrypt(payload);\n\n    // 2. 產生 TradeSha\n    const tradeSha = checkValueEncoder.generate(tradeInfo);\n\n    return {\n      MerchantID: this.merchantId,\n      TradeInfo: tradeInfo,\n      TradeSha: tradeSha,\n      Version: this.version,\n    };\n  }\n\n  /**\n   * 取得原始內容物件。\n   */\n  getRawContent(): Record<string, unknown> {\n    return { ...this.content };\n  }\n\n  /**\n   * 設定自訂內容。\n   */\n  set(key: string, value: unknown): this {\n    this.content[key] = value;\n    return this;\n  }\n\n  /**\n   * 取得內容值。\n   */\n  get<T = unknown>(key: string, defaultValue?: T): T | undefined {\n    if (key in this.content) {\n      return this.content[key] as T;\n    }\n    return defaultValue;\n  }\n}\n","import type { PaymentInterface } from './types/payment.js';\n\n/**\n * HTML 表單產生器選項。\n */\nexport interface FormBuilderOptions {\n  /**\n   * 是否自動送出表單。\n   */\n  autoSubmit?: boolean;\n\n  /**\n   * 表單 ID。\n   */\n  formId?: string;\n\n  /**\n   * 送出按鈕文字。\n   */\n  submitButtonText?: string;\n}\n\n/**\n * HTML 表單產生器。\n *\n * 用於產生自動送出或手動送出的支付表單。\n *\n * ## 使用情境\n *\n * ### 1. 傳統 HTML 表單（自動送出）\n * ```typescript\n * const builder = FormBuilder.create(payment);\n * const html = builder.build(); // 產生包含自動送出腳本的 HTML\n * ```\n *\n * ### 2. 前端自訂表單\n * 當你需要在前端框架（React、Vue 等）中自訂表單 UI 時，可以使用以下方法：\n *\n * - `getFormData()` 或 `getData()`: 取得完整的表單資料（包含 action、method、fields）\n * - `getFields()`: 只取得表單欄位資料\n *\n * ```typescript\n * const builder = FormBuilder.create(payment);\n * const { action, method, fields } = builder.getData();\n * // 或只取得欄位\n * const fields = builder.getFields();\n * ```\n *\n * 這樣你就可以在前端使用 Fetch API、Axios 或其他 HTTP 客戶端來提交表單資料。\n */\nexport class FormBuilder {\n  private readonly payment: PaymentInterface;\n  private readonly options: Required<FormBuilderOptions>;\n\n  /**\n   * 建立表單產生器。\n   *\n   * @param payment 支付操作物件\n   * @param options 選項\n   */\n  constructor(payment: PaymentInterface, options: FormBuilderOptions = {}) {\n    this.payment = payment;\n    this.options = {\n      autoSubmit: options.autoSubmit ?? true,\n      formId: options.formId ?? 'newebpay-form',\n      submitButtonText: options.submitButtonText ?? '前往付款',\n    };\n  }\n\n  /**\n   * 從支付操作物件建立表單產生器。\n   *\n   * @param payment 支付操作物件\n   * @param options 選項\n   */\n  static create(payment: PaymentInterface, options?: FormBuilderOptions): FormBuilder {\n    return new FormBuilder(payment, options);\n  }\n\n  /**\n   * 設定是否自動送出。\n   */\n  setAutoSubmit(autoSubmit: boolean): this {\n    (this.options as { autoSubmit: boolean }).autoSubmit = autoSubmit;\n    return this;\n  }\n\n  /**\n   * 設定表單 ID。\n   */\n  setFormId(formId: string): this {\n    (this.options as { formId: string }).formId = formId;\n    return this;\n  }\n\n  /**\n   * 設定送出按鈕文字。\n   */\n  setSubmitButtonText(text: string): this {\n    (this.options as { submitButtonText: string }).submitButtonText = text;\n    return this;\n  }\n\n  /**\n   * 產生 HTML 表單。\n   */\n  build(): string {\n    const content = this.payment.getContent();\n    const apiUrl = this.getApiUrl();\n\n    const hiddenFields = Object.entries(content)\n      .map(\n        ([name, value]) =>\n          `<input type=\"hidden\" name=\"${this.escapeHtml(name)}\" value=\"${this.escapeHtml(String(value))}\">`\n      )\n      .join('\\n    ');\n\n    const autoSubmitScript = this.options.autoSubmit\n      ? `<script>document.getElementById('${this.escapeHtml(this.options.formId)}').submit();</script>`\n      : '';\n\n    const submitButton = this.options.autoSubmit\n      ? ''\n      : `<button type=\"submit\">${this.escapeHtml(this.options.submitButtonText)}</button>`;\n\n    return `<form id=\"${this.escapeHtml(this.options.formId)}\" method=\"POST\" action=\"${this.escapeHtml(apiUrl)}\">\n    ${hiddenFields}\n    ${submitButton}\n</form>\n${autoSubmitScript}`;\n  }\n\n  /**\n   * 取得表單資料（不含 HTML）。\n   *\n   * 返回包含 action、method 和 fields 的完整表單資料物件。\n   * 適用於前端自訂表單的情境，可以使用 Fetch API 或其他 HTTP 客戶端提交。\n   *\n   * @returns 表單資料物件，包含 action（API 端點）、method（HTTP 方法）和 fields（表單欄位）\n   *\n   * @example\n   * ```typescript\n   * const builder = FormBuilder.create(payment);\n   * const { action, method, fields } = builder.getFormData();\n   *\n   * // 使用 Fetch API 提交\n   * const formData = new FormData();\n   * Object.entries(fields).forEach(([key, value]) => {\n   *   formData.append(key, value);\n   * });\n   * await fetch(action, { method, body: formData });\n   * ```\n   */\n  getFormData(): {\n    action: string;\n    method: string;\n    fields: Record<string, string>;\n  } {\n    const content = this.payment.getContent();\n\n    return {\n      action: this.getApiUrl(),\n      method: 'POST',\n      fields: {\n        MerchantID: content.MerchantID,\n        TradeInfo: content.TradeInfo,\n        TradeSha: content.TradeSha,\n        Version: content.Version,\n      },\n    };\n  }\n\n  /**\n   * 取得表單資料（不含 HTML）。\n   *\n   * 這是 `getFormData()` 的別名方法，提供更簡潔的命名。\n   * 適用於前端自訂表單的情境。\n   *\n   * @returns 表單資料物件，包含 action（API 端點）、method（HTTP 方法）和 fields（表單欄位）\n   *\n   * @example\n   * ```typescript\n   * const builder = FormBuilder.create(payment);\n   * const { action, method, fields } = builder.getData();\n   * ```\n   */\n  getData(): {\n    action: string;\n    method: string;\n    fields: Record<string, string>;\n  } {\n    return this.getFormData();\n  }\n\n  /**\n   * 取得表單欄位資料。\n   *\n   * 只返回表單欄位物件，不包含 action 和 method。\n   * 適用於只需要欄位資料的情境，例如在 React/Vue 中動態建立表單元素。\n   *\n   * @returns 表單欄位物件，包含 MerchantID、TradeInfo、TradeSha、Version\n   *\n   * @example\n   * ```typescript\n   * const builder = FormBuilder.create(payment);\n   * const fields = builder.getFields();\n   *\n   * // 在 React 中使用\n   * Object.entries(fields).map(([name, value]) => (\n   *   <input key={name} type=\"hidden\" name={name} value={value} />\n   * ));\n   * ```\n   */\n  getFields(): Record<string, string> {\n    return this.getFormData().fields;\n  }\n\n  /**\n   * 取得 API 網址。\n   */\n  private getApiUrl(): string {\n    // 檢查 payment 是否有 getApiUrl 方法\n    if ('getApiUrl' in this.payment && typeof this.payment.getApiUrl === 'function') {\n      return (this.payment as { getApiUrl: () => string }).getApiUrl();\n    }\n\n    // 檢查 payment 是否有 getBaseUrl 和 getRequestPath 方法\n    if ('getBaseUrl' in this.payment && typeof this.payment.getBaseUrl === 'function') {\n      const baseUrl = (this.payment as { getBaseUrl: () => string }).getBaseUrl();\n      return baseUrl + this.payment.getRequestPath();\n    }\n\n    // 檢查是否為測試模式\n    const isTest =\n      'isTestMode' in this.payment && typeof this.payment.isTestMode === 'function'\n        ? (this.payment as { isTestMode: () => boolean }).isTestMode()\n        : false;\n\n    const baseUrl = isTest ? 'https://ccore.newebpay.com' : 'https://core.newebpay.com';\n    return baseUrl + this.payment.getRequestPath();\n  }\n\n  /**\n   * HTML 跳脫。\n   */\n  private escapeHtml(str: string): string {\n    const htmlEscapes: Record<string, string> = {\n      '&': '&amp;',\n      '<': '&lt;',\n      '>': '&gt;',\n      '\"': '&quot;',\n      \"'\": '&#39;',\n    };\n\n    return str.replace(/[&<>\"']/g, (char) => htmlEscapes[char] ?? char);\n  }\n}\n","import { Content } from '../content.js';\n\n/**\n * 信用卡一次付清支付。\n *\n * 支援信用卡一次付清、紅利折抵等功能。\n */\nexport class CreditPayment extends Content {\n  /**\n   * 初始化內容。\n   */\n  protected override initContent(): void {\n    super.initContent();\n    // 啟用信用卡付款\n    this.content.CREDIT = 1;\n  }\n\n  /**\n   * 設定是否啟用紅利折抵。\n   */\n  setRedeem(enable: number): this {\n    this.content.CreditRed = enable;\n    return this;\n  }\n\n  /**\n   * 設定是否啟用銀聯卡。\n   */\n  setUnionPay(enable: number): this {\n    this.content.UNIONPAY = enable;\n    return this;\n  }\n\n  /**\n   * 設定是否啟用 Google Pay。\n   */\n  setGooglePay(enable: number): this {\n    this.content.ANDROIDPAY = enable;\n    return this;\n  }\n\n  /**\n   * 設定是否啟用 Samsung Pay。\n   */\n  setSamsungPay(enable: number): this {\n    this.content.SAMSUNGPAY = enable;\n    return this;\n  }\n\n  /**\n   * 設定信用卡快速結帳。\n   */\n  setTokenTerm(enable: number): this {\n    this.content.TokenTerm = enable;\n    return this;\n  }\n\n  /**\n   * 設定信用卡快速結帳使用者識別碼。\n   */\n  setTokenTermDemand(tokenTermId: string): this {\n    this.content.TokenTermDemand = tokenTermId;\n    return this;\n  }\n\n  /**\n   * 驗證內容資料。\n   */\n  protected validation(): void {\n    this.validateBaseParams();\n  }\n}\n","import { Content } from '../content.js';\nimport { NewebPayError } from '../errors/newebpay-error.js';\n\n/**\n * 信用卡分期支付。\n *\n * 支援 3/6/12/18/24/30 期分期付款。\n */\nexport class CreditInstallment extends Content {\n  /**\n   * 允許的分期期數。\n   */\n  private static readonly ALLOWED_INSTALLMENTS = [3, 6, 12, 18, 24, 30];\n\n  /**\n   * 初始化內容。\n   */\n  protected override initContent(): void {\n    super.initContent();\n    // 啟用信用卡分期\n    this.content.InstFlag = 1;\n  }\n\n  /**\n   * 設定分期期數選項。\n   *\n   * @param installments 分期期數陣列，例如 [3, 6, 12]\n   */\n  setInstallment(installments: number[]): this {\n    // 驗證分期期數\n    for (const inst of installments) {\n      if (!CreditInstallment.ALLOWED_INSTALLMENTS.includes(inst)) {\n        throw NewebPayError.invalid(\n          'Installment',\n          `不支援 ${inst} 期，允許的期數：${CreditInstallment.ALLOWED_INSTALLMENTS.join(', ')}`\n        );\n      }\n    }\n\n    this.content.InstFlag = installments.join(',');\n    return this;\n  }\n\n  /**\n   * 驗證內容資料。\n   */\n  protected validation(): void {\n    this.validateBaseParams();\n  }\n}\n","import { Content } from '../content.js';\nimport { BankType } from '../types/parameters.js';\n\n/**\n * ATM 虛擬帳號支付。\n *\n * 產生虛擬帳號供消費者轉帳。\n */\nexport class AtmPayment extends Content {\n  /**\n   * 台灣銀行。\n   */\n  static readonly BANK_BOT = BankType.BOT;\n\n  /**\n   * 華南銀行。\n   */\n  static readonly BANK_HNCB = BankType.HNCB;\n\n  /**\n   * 第一銀行。\n   */\n  static readonly BANK_FCB = BankType.FCB;\n\n  /**\n   * 初始化內容。\n   */\n  protected override initContent(): void {\n    super.initContent();\n    // 啟用 ATM 付款\n    this.content.VACC = 1;\n  }\n\n  /**\n   * 設定指定銀行。\n   */\n  setBankType(bankType: BankType | string): this {\n    this.content.BankType = bankType;\n    return this;\n  }\n\n  /**\n   * 驗證內容資料。\n   */\n  protected validation(): void {\n    this.validateBaseParams();\n  }\n}\n","import { Content } from '../content.js';\n\n/**\n * WebATM 支付。\n *\n * 即時網路 ATM 轉帳。\n */\nexport class WebAtmPayment extends Content {\n  /**\n   * 初始化內容。\n   */\n  protected override initContent(): void {\n    super.initContent();\n    // 啟用 WebATM 付款\n    this.content.WEBATM = 1;\n  }\n\n  /**\n   * 驗證內容資料。\n   */\n  protected validation(): void {\n    this.validateBaseParams();\n  }\n}\n","import { Content } from '../content.js';\nimport { NewebPayError } from '../errors/newebpay-error.js';\n\n/**\n * 超商代碼繳費支付。\n *\n * 金額限制 30~20,000 元。\n */\nexport class CvsPayment extends Content {\n  /**\n   * 最小金額。\n   */\n  static readonly MIN_AMT = 30;\n\n  /**\n   * 最大金額。\n   */\n  static readonly MAX_AMT = 20000;\n\n  /**\n   * 初始化內容。\n   */\n  protected override initContent(): void {\n    super.initContent();\n    // 啟用超商代碼付款\n    this.content.CVS = 1;\n  }\n\n  /**\n   * 驗證內容資料。\n   */\n  protected validation(): void {\n    this.validateBaseParams();\n\n    const amt = this.content.Amt as number;\n    if (amt < CvsPayment.MIN_AMT || amt > CvsPayment.MAX_AMT) {\n      throw NewebPayError.invalid(\n        'Amt',\n        `超商代碼金額必須在 ${CvsPayment.MIN_AMT}~${CvsPayment.MAX_AMT} 元之間`\n      );\n    }\n  }\n}\n","import { Content } from '../content.js';\nimport { NewebPayError } from '../errors/newebpay-error.js';\n\n/**\n * 超商條碼繳費支付。\n *\n * 金額限制 20~40,000 元。\n */\nexport class BarcodePayment extends Content {\n  /**\n   * 最小金額。\n   */\n  static readonly MIN_AMT = 20;\n\n  /**\n   * 最大金額。\n   */\n  static readonly MAX_AMT = 40000;\n\n  /**\n   * 初始化內容。\n   */\n  protected override initContent(): void {\n    super.initContent();\n    // 啟用超商條碼付款\n    this.content.BARCODE = 1;\n  }\n\n  /**\n   * 驗證內容資料。\n   */\n  protected validation(): void {\n    this.validateBaseParams();\n\n    const amt = this.content.Amt as number;\n    if (amt < BarcodePayment.MIN_AMT || amt > BarcodePayment.MAX_AMT) {\n      throw NewebPayError.invalid(\n        'Amt',\n        `超商條碼金額必須在 ${BarcodePayment.MIN_AMT}~${BarcodePayment.MAX_AMT} 元之間`\n      );\n    }\n  }\n}\n","import { Content } from '../content.js';\n\n/**\n * LINE Pay 支付。\n *\n * LINE Pay 電子錢包支付。\n */\nexport class LinePayPayment extends Content {\n  /**\n   * 初始化內容。\n   */\n  protected override initContent(): void {\n    super.initContent();\n    // 啟用 LINE Pay 付款\n    this.content.LINEPAY = 1;\n  }\n\n  /**\n   * 設定是否使用 LINE Pay 產品圖片。\n   */\n  setImageUrl(url: string): this {\n    this.content.LINEPayProductImageUrl = url;\n    return this;\n  }\n\n  /**\n   * 驗證內容資料。\n   */\n  protected validation(): void {\n    this.validateBaseParams();\n  }\n}\n","import { Content } from '../content.js';\n\n/**\n * 台灣 Pay 支付。\n *\n * 台灣 Pay 行動支付。\n */\nexport class TaiwanPayPayment extends Content {\n  /**\n   * 初始化內容。\n   */\n  protected override initContent(): void {\n    super.initContent();\n    // 啟用台灣 Pay 付款\n    this.content.TAIWANPAY = 1;\n  }\n\n  /**\n   * 驗證內容資料。\n   */\n  protected validation(): void {\n    this.validateBaseParams();\n  }\n}\n","import { Content } from '../content.js';\n\n/**\n * 玉山 Wallet 支付。\n *\n * 玉山銀行電子錢包支付。\n */\nexport class EsunWalletPayment extends Content {\n  /**\n   * 初始化內容。\n   */\n  protected override initContent(): void {\n    super.initContent();\n    // 啟用玉山 Wallet 付款\n    this.content.ESUNWALLET = 1;\n  }\n\n  /**\n   * 驗證內容資料。\n   */\n  protected validation(): void {\n    this.validateBaseParams();\n  }\n}\n","import { Content } from '../content.js';\n\n/**\n * BitoPay 支付。\n *\n * 加密貨幣支付。\n */\nexport class BitoPayPayment extends Content {\n  /**\n   * 初始化內容。\n   */\n  protected override initContent(): void {\n    super.initContent();\n    // 啟用 BitoPay 付款\n    this.content.BITOPAY = 1;\n  }\n\n  /**\n   * 驗證內容資料。\n   */\n  protected validation(): void {\n    this.validateBaseParams();\n  }\n}\n","import { Content } from '../content.js';\n\n/**\n * TWQR 共通支付。\n *\n * 台灣 QR Code 共通支付。\n */\nexport class TwqrPayment extends Content {\n  /**\n   * 初始化內容。\n   */\n  protected override initContent(): void {\n    super.initContent();\n    // 啟用 TWQR 付款\n    this.content.TWQR = 1;\n  }\n\n  /**\n   * 驗證內容資料。\n   */\n  protected validation(): void {\n    this.validateBaseParams();\n  }\n}\n","import { Content } from '../content.js';\n\n/**\n * 付啦支付。\n *\n * 先買後付服務。\n */\nexport class FulaPayment extends Content {\n  /**\n   * 初始化內容。\n   */\n  protected override initContent(): void {\n    super.initContent();\n    // 啟用付啦付款\n    this.content.FULA = 1;\n  }\n\n  /**\n   * 驗證內容資料。\n   */\n  protected validation(): void {\n    this.validateBaseParams();\n  }\n}\n","import { Content } from '../content.js';\nimport { NewebPayError } from '../errors/newebpay-error.js';\nimport { LgsType } from '../types/parameters.js';\n\n/**\n * 超商取貨付款支付。\n *\n * 超商物流取貨付款服務。\n */\nexport class CvscomPayment extends Content {\n  /**\n   * 全家。\n   */\n  static readonly LGS_FAMI = LgsType.FAMIC2C;\n\n  /**\n   * 萊爾富。\n   */\n  static readonly LGS_HILIFE = LgsType.HILIFEC2C;\n\n  /**\n   * OK。\n   */\n  static readonly LGS_OK = LgsType.OKMARTC2C;\n\n  /**\n   * 統一。\n   */\n  static readonly LGS_UNIMART = LgsType.UNIMARTC2C;\n\n  /**\n   * 初始化內容。\n   */\n  protected override initContent(): void {\n    super.initContent();\n    // 啟用超商取貨付款\n    this.content.CVSCOM = 1;\n  }\n\n  /**\n   * 設定物流類型。\n   */\n  setLgsType(lgsType: LgsType | string): this {\n    this.content.LgsType = lgsType;\n    return this;\n  }\n\n  /**\n   * 設定取貨人姓名。\n   */\n  setReceiverName(name: string): this {\n    if (name.length > 60) {\n      throw NewebPayError.tooLong('ReceiverName', 60);\n    }\n    this.content.CVSCOMName = name;\n    return this;\n  }\n\n  /**\n   * 設定取貨人電話。\n   */\n  setReceiverPhone(phone: string): this {\n    if (phone.length > 20) {\n      throw NewebPayError.tooLong('ReceiverPhone', 20);\n    }\n    this.content.CVSCOMPhone = phone;\n    return this;\n  }\n\n  /**\n   * 驗證內容資料。\n   */\n  protected validation(): void {\n    this.validateBaseParams();\n  }\n}\n","import { Content } from '../content.js';\n\n/**\n * 全支付方式。\n *\n * 自訂啟用多種支付方式。\n */\nexport class AllInOnePayment extends Content {\n  /**\n   * 啟用信用卡。\n   */\n  enableCredit(enable = true): this {\n    this.content.CREDIT = enable ? 1 : 0;\n    return this;\n  }\n\n  /**\n   * 啟用 WebATM。\n   */\n  enableWebAtm(enable = true): this {\n    this.content.WEBATM = enable ? 1 : 0;\n    return this;\n  }\n\n  /**\n   * 啟用 ATM 轉帳。\n   */\n  enableAtm(enable = true): this {\n    this.content.VACC = enable ? 1 : 0;\n    return this;\n  }\n\n  /**\n   * 啟用超商代碼。\n   */\n  enableCvs(enable = true): this {\n    this.content.CVS = enable ? 1 : 0;\n    return this;\n  }\n\n  /**\n   * 啟用超商條碼。\n   */\n  enableBarcode(enable = true): this {\n    this.content.BARCODE = enable ? 1 : 0;\n    return this;\n  }\n\n  /**\n   * 啟用 LINE Pay。\n   */\n  enableLinePay(enable = true): this {\n    this.content.LINEPAY = enable ? 1 : 0;\n    return this;\n  }\n\n  /**\n   * 啟用台灣 Pay。\n   */\n  enableTaiwanPay(enable = true): this {\n    this.content.TAIWANPAY = enable ? 1 : 0;\n    return this;\n  }\n\n  /**\n   * 啟用玉山 Wallet。\n   */\n  enableEsunWallet(enable = true): this {\n    this.content.ESUNWALLET = enable ? 1 : 0;\n    return this;\n  }\n\n  /**\n   * 啟用 BitoPay。\n   */\n  enableBitoPay(enable = true): this {\n    this.content.BITOPAY = enable ? 1 : 0;\n    return this;\n  }\n\n  /**\n   * 啟用 TWQR。\n   */\n  enableTwqr(enable = true): this {\n    this.content.TWQR = enable ? 1 : 0;\n    return this;\n  }\n\n  /**\n   * 啟用付啦。\n   */\n  enableFula(enable = true): this {\n    this.content.FULA = enable ? 1 : 0;\n    return this;\n  }\n\n  /**\n   * 啟用信用卡分期。\n   */\n  enableInstallment(installments: number[]): this {\n    this.content.InstFlag = installments.join(',');\n    return this;\n  }\n\n  /**\n   * 啟用紅利折抵。\n   */\n  enableRedeem(enable = true): this {\n    this.content.CreditRed = enable ? 1 : 0;\n    return this;\n  }\n\n  /**\n   * 啟用銀聯卡。\n   */\n  enableUnionPay(enable = true): this {\n    this.content.UNIONPAY = enable ? 1 : 0;\n    return this;\n  }\n\n  /**\n   * 驗證內容資料。\n   */\n  protected validation(): void {\n    this.validateBaseParams();\n  }\n}\n","import { NewebPayError } from '../errors/newebpay-error.js';\nimport { Aes256Encoder } from '../infrastructure/aes256-encoder.js';\nimport { CheckValueEncoder } from '../infrastructure/check-value-encoder.js';\nimport type {\n  NotifyHandlerInterface,\n  NotifyRawData,\n  PaymentResultData,\n} from '../types/notification.js';\n\n/**\n * 支付完成通知處理器。\n *\n * 處理藍新金流 ReturnURL / NotifyURL 回傳的支付結果通知。\n */\nexport class PaymentNotify implements NotifyHandlerInterface {\n  private readonly aesEncoder: Aes256Encoder;\n  private readonly checkValueEncoder: CheckValueEncoder;\n\n  /**\n   * 原始通知資料。\n   */\n  private rawData: NotifyRawData = {};\n\n  /**\n   * 解密後的交易資料。\n   */\n  private data: Record<string, unknown> = {};\n\n  /**\n   * 是否已驗證。\n   */\n  private verified = false;\n\n  /**\n   * 建立通知處理器。\n   *\n   * @param hashKey HashKey\n   * @param hashIV HashIV\n   */\n  constructor(hashKey: string, hashIV: string) {\n    this.aesEncoder = new Aes256Encoder(hashKey, hashIV);\n    this.checkValueEncoder = new CheckValueEncoder(hashKey, hashIV);\n  }\n\n  /**\n   * 從設定建立通知處理器。\n   */\n  static create(hashKey: string, hashIV: string): PaymentNotify {\n    return new PaymentNotify(hashKey, hashIV);\n  }\n\n  /**\n   * 驗證通知資料。\n   */\n  verify(data: NotifyRawData): boolean {\n    this.rawData = data;\n\n    // 檢查必要欄位\n    if (!data.TradeInfo || !data.TradeSha) {\n      return false;\n    }\n\n    // 驗證 TradeSha\n    if (!this.checkValueEncoder.verify(String(data.TradeInfo), String(data.TradeSha))) {\n      return false;\n    }\n\n    // 解密 TradeInfo\n    try {\n      const decrypted = this.aesEncoder.decrypt(String(data.TradeInfo));\n\n      // 解析 JSON 格式的 Result\n      this.data = this.parseDecryptedData(decrypted);\n      this.verified = true;\n\n      return true;\n    } catch {\n      return false;\n    }\n  }\n\n  /**\n   * 驗證並拋出例外。\n   */\n  verifyOrFail(data: NotifyRawData): this {\n    if (!this.verify(data)) {\n      throw NewebPayError.checkValueFailed();\n    }\n    return this;\n  }\n\n  /**\n   * 解析解密後的資料。\n   */\n  private parseDecryptedData(decrypted: Record<string, string>): Record<string, unknown> {\n    const result: Record<string, unknown> = {};\n\n    for (const [key, value] of Object.entries(decrypted)) {\n      // 嘗試解析 JSON\n      if (key === 'Result' && typeof value === 'string') {\n        try {\n          result[key] = JSON.parse(value);\n        } catch {\n          result[key] = value;\n        }\n      } else {\n        result[key] = value;\n      }\n    }\n\n    return result;\n  }\n\n  /**\n   * 取得解密後的資料。\n   */\n  getData(): Record<string, unknown> {\n    return this.data;\n  }\n\n  /**\n   * 取得原始通知資料。\n   */\n  getRawData(): NotifyRawData {\n    return this.rawData;\n  }\n\n  /**\n   * 是否成功。\n   */\n  isSuccess(): boolean {\n    return this.getStatus() === 'SUCCESS';\n  }\n\n  /**\n   * 取得狀態。\n   */\n  getStatus(): string {\n    return String(this.data.Status ?? '');\n  }\n\n  /**\n   * 取得訊息。\n   */\n  getMessage(): string {\n    return String(this.data.Message ?? '');\n  }\n\n  /**\n   * 取得特店編號。\n   */\n  getMerchantID(): string {\n    return String(this.data.MerchantID ?? '');\n  }\n\n  /**\n   * 取得特店訂單編號。\n   */\n  getMerchantOrderNo(): string {\n    const result = this.getResult();\n    return String(result.MerchantOrderNo ?? '');\n  }\n\n  /**\n   * 取得藍新金流交易序號。\n   */\n  getTradeNo(): string {\n    const result = this.getResult();\n    return String(result.TradeNo ?? '');\n  }\n\n  /**\n   * 取得交易金額。\n   */\n  getAmt(): number {\n    const result = this.getResult();\n    return Number(result.Amt ?? 0);\n  }\n\n  /**\n   * 取得支付方式。\n   */\n  getPaymentType(): string {\n    const result = this.getResult();\n    return String(result.PaymentType ?? '');\n  }\n\n  /**\n   * 取得交易時間。\n   */\n  getPayTime(): string {\n    const result = this.getResult();\n    return String(result.PayTime ?? '');\n  }\n\n  /**\n   * 取得 IP 位址。\n   */\n  getIP(): string {\n    const result = this.getResult();\n    return String(result.IP ?? '');\n  }\n\n  /**\n   * 取得付款銀行。\n   */\n  getPayBankCode(): string {\n    const result = this.getResult();\n    return String(result.PayBankCode ?? '');\n  }\n\n  /**\n   * 取得授權碼（信用卡）。\n   */\n  getAuthCode(): string {\n    const result = this.getResult();\n    return String(result.Auth ?? '');\n  }\n\n  /**\n   * 取得卡號末四碼（信用卡）。\n   */\n  getCard4No(): string {\n    const result = this.getResult();\n    return String(result.Card4No ?? '');\n  }\n\n  /**\n   * 取得卡號前六碼（信用卡）。\n   */\n  getCard6No(): string {\n    const result = this.getResult();\n    return String(result.Card6No ?? '');\n  }\n\n  /**\n   * 取得 ECI 值（3D 驗證）。\n   */\n  getECI(): string {\n    const result = this.getResult();\n    return String(result.ECI ?? '');\n  }\n\n  /**\n   * 取得分期期數。\n   */\n  getInst(): number {\n    const result = this.getResult();\n    return Number(result.Inst ?? 0);\n  }\n\n  /**\n   * 取得首期金額。\n   */\n  getInstFirst(): number {\n    const result = this.getResult();\n    return Number(result.InstFirst ?? 0);\n  }\n\n  /**\n   * 取得每期金額。\n   */\n  getInstEach(): number {\n    const result = this.getResult();\n    return Number(result.InstEach ?? 0);\n  }\n\n  /**\n   * 取得交易結果物件。\n   */\n  getResult(): PaymentResultData {\n    return (this.data.Result as PaymentResultData) ?? {};\n  }\n\n  /**\n   * 是否已驗證。\n   */\n  isVerified(): boolean {\n    return this.verified;\n  }\n}\n","import { NewebPayError } from '../errors/newebpay-error.js';\nimport { Aes256Encoder } from '../infrastructure/aes256-encoder.js';\nimport { CheckValueEncoder } from '../infrastructure/check-value-encoder.js';\nimport type {\n  AtmResultData,\n  NotifyHandlerInterface,\n  NotifyRawData,\n} from '../types/notification.js';\n\n/**\n * ATM 取號通知處理器。\n *\n * 處理 ATM 虛擬帳號取號完成的通知。\n */\nexport class AtmNotify implements NotifyHandlerInterface {\n  private readonly aesEncoder: Aes256Encoder;\n  private readonly checkValueEncoder: CheckValueEncoder;\n\n  /**\n   * 原始通知資料。\n   */\n  private rawData: NotifyRawData = {};\n\n  /**\n   * 解密後的交易資料。\n   */\n  private data: Record<string, unknown> = {};\n\n  /**\n   * 是否已驗證。\n   */\n  private verified = false;\n\n  /**\n   * 建立通知處理器。\n   */\n  constructor(hashKey: string, hashIV: string) {\n    this.aesEncoder = new Aes256Encoder(hashKey, hashIV);\n    this.checkValueEncoder = new CheckValueEncoder(hashKey, hashIV);\n  }\n\n  /**\n   * 從設定建立通知處理器。\n   */\n  static create(hashKey: string, hashIV: string): AtmNotify {\n    return new AtmNotify(hashKey, hashIV);\n  }\n\n  /**\n   * 驗證通知資料。\n   */\n  verify(data: NotifyRawData): boolean {\n    this.rawData = data;\n\n    if (!data.TradeInfo || !data.TradeSha) {\n      return false;\n    }\n\n    if (!this.checkValueEncoder.verify(String(data.TradeInfo), String(data.TradeSha))) {\n      return false;\n    }\n\n    try {\n      const decrypted = this.aesEncoder.decrypt(String(data.TradeInfo));\n      this.data = this.parseDecryptedData(decrypted);\n      this.verified = true;\n      return true;\n    } catch {\n      return false;\n    }\n  }\n\n  /**\n   * 驗證並拋出例外。\n   */\n  verifyOrFail(data: NotifyRawData): this {\n    if (!this.verify(data)) {\n      throw NewebPayError.checkValueFailed();\n    }\n    return this;\n  }\n\n  /**\n   * 解析解密後的資料。\n   */\n  private parseDecryptedData(decrypted: Record<string, string>): Record<string, unknown> {\n    const result: Record<string, unknown> = {};\n\n    for (const [key, value] of Object.entries(decrypted)) {\n      if (key === 'Result' && typeof value === 'string') {\n        try {\n          result[key] = JSON.parse(value);\n        } catch {\n          result[key] = value;\n        }\n      } else {\n        result[key] = value;\n      }\n    }\n\n    return result;\n  }\n\n  /**\n   * 取得解密後的資料。\n   */\n  getData(): Record<string, unknown> {\n    return this.data;\n  }\n\n  /**\n   * 取得原始通知資料。\n   */\n  getRawData(): NotifyRawData {\n    return this.rawData;\n  }\n\n  /**\n   * 是否成功。\n   */\n  isSuccess(): boolean {\n    return this.getStatus() === 'SUCCESS';\n  }\n\n  /**\n   * 取得狀態。\n   */\n  getStatus(): string {\n    return String(this.data.Status ?? '');\n  }\n\n  /**\n   * 取得訊息。\n   */\n  getMessage(): string {\n    return String(this.data.Message ?? '');\n  }\n\n  /**\n   * 取得特店訂單編號。\n   */\n  getMerchantOrderNo(): string {\n    const result = this.getResult();\n    return String(result.MerchantOrderNo ?? '');\n  }\n\n  /**\n   * 取得藍新金流交易序號。\n   */\n  getTradeNo(): string {\n    const result = this.getResult();\n    return String(result.TradeNo ?? '');\n  }\n\n  /**\n   * 取得交易金額。\n   */\n  getAmt(): number {\n    const result = this.getResult();\n    return Number(result.Amt ?? 0);\n  }\n\n  /**\n   * 取得銀行代碼。\n   */\n  getBankCode(): string {\n    const result = this.getResult();\n    return String(result.BankCode ?? '');\n  }\n\n  /**\n   * 取得虛擬帳號。\n   */\n  getCodeNo(): string {\n    const result = this.getResult();\n    return String(result.CodeNo ?? '');\n  }\n\n  /**\n   * 取得繳費截止日。\n   */\n  getExpireDate(): string {\n    const result = this.getResult();\n    return String(result.ExpireDate ?? '');\n  }\n\n  /**\n   * 取得繳費截止時間。\n   */\n  getExpireTime(): string {\n    const result = this.getResult();\n    return String(result.ExpireTime ?? '');\n  }\n\n  /**\n   * 取得交易結果物件。\n   */\n  getResult(): AtmResultData {\n    return (this.data.Result as AtmResultData) ?? {};\n  }\n\n  /**\n   * 是否已驗證。\n   */\n  isVerified(): boolean {\n    return this.verified;\n  }\n}\n","import { NewebPayError } from '../errors/newebpay-error.js';\nimport { Aes256Encoder } from '../infrastructure/aes256-encoder.js';\nimport { CheckValueEncoder } from '../infrastructure/check-value-encoder.js';\nimport type {\n  CvsResultData,\n  NotifyHandlerInterface,\n  NotifyRawData,\n} from '../types/notification.js';\n\n/**\n * 超商取號通知處理器。\n *\n * 處理超商代碼/條碼繳費取號完成的通知。\n */\nexport class CvsNotify implements NotifyHandlerInterface {\n  private readonly aesEncoder: Aes256Encoder;\n  private readonly checkValueEncoder: CheckValueEncoder;\n\n  /**\n   * 原始通知資料。\n   */\n  private rawData: NotifyRawData = {};\n\n  /**\n   * 解密後的交易資料。\n   */\n  private data: Record<string, unknown> = {};\n\n  /**\n   * 是否已驗證。\n   */\n  private verified = false;\n\n  /**\n   * 建立通知處理器。\n   */\n  constructor(hashKey: string, hashIV: string) {\n    this.aesEncoder = new Aes256Encoder(hashKey, hashIV);\n    this.checkValueEncoder = new CheckValueEncoder(hashKey, hashIV);\n  }\n\n  /**\n   * 從設定建立通知處理器。\n   */\n  static create(hashKey: string, hashIV: string): CvsNotify {\n    return new CvsNotify(hashKey, hashIV);\n  }\n\n  /**\n   * 驗證通知資料。\n   */\n  verify(data: NotifyRawData): boolean {\n    this.rawData = data;\n\n    if (!data.TradeInfo || !data.TradeSha) {\n      return false;\n    }\n\n    if (!this.checkValueEncoder.verify(String(data.TradeInfo), String(data.TradeSha))) {\n      return false;\n    }\n\n    try {\n      const decrypted = this.aesEncoder.decrypt(String(data.TradeInfo));\n      this.data = this.parseDecryptedData(decrypted);\n      this.verified = true;\n      return true;\n    } catch {\n      return false;\n    }\n  }\n\n  /**\n   * 驗證並拋出例外。\n   */\n  verifyOrFail(data: NotifyRawData): this {\n    if (!this.verify(data)) {\n      throw NewebPayError.checkValueFailed();\n    }\n    return this;\n  }\n\n  /**\n   * 解析解密後的資料。\n   */\n  private parseDecryptedData(decrypted: Record<string, string>): Record<string, unknown> {\n    const result: Record<string, unknown> = {};\n\n    for (const [key, value] of Object.entries(decrypted)) {\n      if (key === 'Result' && typeof value === 'string') {\n        try {\n          result[key] = JSON.parse(value);\n        } catch {\n          result[key] = value;\n        }\n      } else {\n        result[key] = value;\n      }\n    }\n\n    return result;\n  }\n\n  /**\n   * 取得解密後的資料。\n   */\n  getData(): Record<string, unknown> {\n    return this.data;\n  }\n\n  /**\n   * 取得原始通知資料。\n   */\n  getRawData(): NotifyRawData {\n    return this.rawData;\n  }\n\n  /**\n   * 是否成功。\n   */\n  isSuccess(): boolean {\n    return this.getStatus() === 'SUCCESS';\n  }\n\n  /**\n   * 取得狀態。\n   */\n  getStatus(): string {\n    return String(this.data.Status ?? '');\n  }\n\n  /**\n   * 取得訊息。\n   */\n  getMessage(): string {\n    return String(this.data.Message ?? '');\n  }\n\n  /**\n   * 取得特店訂單編號。\n   */\n  getMerchantOrderNo(): string {\n    const result = this.getResult();\n    return String(result.MerchantOrderNo ?? '');\n  }\n\n  /**\n   * 取得藍新金流交易序號。\n   */\n  getTradeNo(): string {\n    const result = this.getResult();\n    return String(result.TradeNo ?? '');\n  }\n\n  /**\n   * 取得交易金額。\n   */\n  getAmt(): number {\n    const result = this.getResult();\n    return Number(result.Amt ?? 0);\n  }\n\n  /**\n   * 取得支付方式。\n   */\n  getPaymentType(): string {\n    const result = this.getResult();\n    return String(result.PaymentType ?? '');\n  }\n\n  /**\n   * 取得繳費代碼。\n   */\n  getCodeNo(): string {\n    const result = this.getResult();\n    return String(result.CodeNo ?? '');\n  }\n\n  /**\n   * 取得超商類型。\n   */\n  getStoreType(): string {\n    const result = this.getResult();\n    return String(result.StoreType ?? '');\n  }\n\n  /**\n   * 取得繳費截止日。\n   */\n  getExpireDate(): string {\n    const result = this.getResult();\n    return String(result.ExpireDate ?? '');\n  }\n\n  /**\n   * 取得繳費截止時間。\n   */\n  getExpireTime(): string {\n    const result = this.getResult();\n    return String(result.ExpireTime ?? '');\n  }\n\n  /**\n   * 取得條碼第一段。\n   */\n  getBarcode1(): string {\n    const result = this.getResult();\n    return String(result.Barcode_1 ?? '');\n  }\n\n  /**\n   * 取得條碼第二段。\n   */\n  getBarcode2(): string {\n    const result = this.getResult();\n    return String(result.Barcode_2 ?? '');\n  }\n\n  /**\n   * 取得條碼第三段。\n   */\n  getBarcode3(): string {\n    const result = this.getResult();\n    return String(result.Barcode_3 ?? '');\n  }\n\n  /**\n   * 取得交易結果物件。\n   */\n  getResult(): CvsResultData {\n    return (this.data.Result as CvsResultData) ?? {};\n  }\n\n  /**\n   * 是否已驗證。\n   */\n  isVerified(): boolean {\n    return this.verified;\n  }\n}\n","import { NewebPayError } from '../errors/newebpay-error.js';\nimport { Aes256Encoder } from '../infrastructure/aes256-encoder.js';\nimport { CheckValueEncoder } from '../infrastructure/check-value-encoder.js';\nimport type {\n  CvscomResultData,\n  NotifyHandlerInterface,\n  NotifyRawData,\n} from '../types/notification.js';\n\n/**\n * 超商取貨付款通知處理器。\n *\n * 處理超商取貨付款的通知。\n */\nexport class CvscomNotify implements NotifyHandlerInterface {\n  private readonly aesEncoder: Aes256Encoder;\n  private readonly checkValueEncoder: CheckValueEncoder;\n\n  /**\n   * 原始通知資料。\n   */\n  private rawData: NotifyRawData = {};\n\n  /**\n   * 解密後的交易資料。\n   */\n  private data: Record<string, unknown> = {};\n\n  /**\n   * 是否已驗證。\n   */\n  private verified = false;\n\n  /**\n   * 建立通知處理器。\n   */\n  constructor(hashKey: string, hashIV: string) {\n    this.aesEncoder = new Aes256Encoder(hashKey, hashIV);\n    this.checkValueEncoder = new CheckValueEncoder(hashKey, hashIV);\n  }\n\n  /**\n   * 從設定建立通知處理器。\n   */\n  static create(hashKey: string, hashIV: string): CvscomNotify {\n    return new CvscomNotify(hashKey, hashIV);\n  }\n\n  /**\n   * 驗證通知資料。\n   */\n  verify(data: NotifyRawData): boolean {\n    this.rawData = data;\n\n    if (!data.TradeInfo || !data.TradeSha) {\n      return false;\n    }\n\n    if (!this.checkValueEncoder.verify(String(data.TradeInfo), String(data.TradeSha))) {\n      return false;\n    }\n\n    try {\n      const decrypted = this.aesEncoder.decrypt(String(data.TradeInfo));\n      this.data = this.parseDecryptedData(decrypted);\n      this.verified = true;\n      return true;\n    } catch {\n      return false;\n    }\n  }\n\n  /**\n   * 驗證並拋出例外。\n   */\n  verifyOrFail(data: NotifyRawData): this {\n    if (!this.verify(data)) {\n      throw NewebPayError.checkValueFailed();\n    }\n    return this;\n  }\n\n  /**\n   * 解析解密後的資料。\n   */\n  private parseDecryptedData(decrypted: Record<string, string>): Record<string, unknown> {\n    const result: Record<string, unknown> = {};\n\n    for (const [key, value] of Object.entries(decrypted)) {\n      if (key === 'Result' && typeof value === 'string') {\n        try {\n          result[key] = JSON.parse(value);\n        } catch {\n          result[key] = value;\n        }\n      } else {\n        result[key] = value;\n      }\n    }\n\n    return result;\n  }\n\n  /**\n   * 取得解密後的資料。\n   */\n  getData(): Record<string, unknown> {\n    return this.data;\n  }\n\n  /**\n   * 取得原始通知資料。\n   */\n  getRawData(): NotifyRawData {\n    return this.rawData;\n  }\n\n  /**\n   * 是否成功。\n   */\n  isSuccess(): boolean {\n    return this.getStatus() === 'SUCCESS';\n  }\n\n  /**\n   * 取得狀態。\n   */\n  getStatus(): string {\n    return String(this.data.Status ?? '');\n  }\n\n  /**\n   * 取得訊息。\n   */\n  getMessage(): string {\n    return String(this.data.Message ?? '');\n  }\n\n  /**\n   * 取得特店訂單編號。\n   */\n  getMerchantOrderNo(): string {\n    const result = this.getResult();\n    return String(result.MerchantOrderNo ?? '');\n  }\n\n  /**\n   * 取得藍新金流交易序號。\n   */\n  getTradeNo(): string {\n    const result = this.getResult();\n    return String(result.TradeNo ?? '');\n  }\n\n  /**\n   * 取得交易金額。\n   */\n  getAmt(): number {\n    const result = this.getResult();\n    return Number(result.Amt ?? 0);\n  }\n\n  /**\n   * 取得支付方式。\n   */\n  getPaymentType(): string {\n    const result = this.getResult();\n    return String(result.PaymentType ?? '');\n  }\n\n  /**\n   * 取得超商類型。\n   */\n  getStoreType(): string {\n    const result = this.getResult();\n    return String(result.StoreType ?? '');\n  }\n\n  /**\n   * 取得門市代碼。\n   */\n  getStoreCode(): string {\n    const result = this.getResult();\n    return String(result.StoreCode ?? '');\n  }\n\n  /**\n   * 取得門市名稱。\n   */\n  getStoreName(): string {\n    const result = this.getResult();\n    return String(result.StoreName ?? '');\n  }\n\n  /**\n   * 取得門市地址。\n   */\n  getStoreAddr(): string {\n    const result = this.getResult();\n    return String(result.StoreAddr ?? '');\n  }\n\n  /**\n   * 取得取貨人姓名。\n   */\n  getCVSCOMName(): string {\n    const result = this.getResult();\n    return String(result.CVSCOMName ?? '');\n  }\n\n  /**\n   * 取得取貨人電話。\n   */\n  getCVSCOMPhone(): string {\n    const result = this.getResult();\n    return String(result.CVSCOMPhone ?? '');\n  }\n\n  /**\n   * 取得物流編號。\n   */\n  getLgsNo(): string {\n    const result = this.getResult();\n    return String(result.LgsNo ?? '');\n  }\n\n  /**\n   * 取得物流類型。\n   */\n  getLgsType(): string {\n    const result = this.getResult();\n    return String(result.LgsType ?? '');\n  }\n\n  /**\n   * 取得交易結果物件。\n   */\n  getResult(): CvscomResultData {\n    return (this.data.Result as CvscomResultData) ?? {};\n  }\n\n  /**\n   * 是否已驗證。\n   */\n  isVerified(): boolean {\n    return this.verified;\n  }\n}\n","import { createHash } from 'node:crypto';\nimport { NewebPayError } from '../errors/newebpay-error.js';\nimport { FetchHttpClient } from '../infrastructure/http/fetch-http-client.js';\nimport type { HttpClientInterface } from '../infrastructure/http/http-client.interface.js';\nimport { getTimestamp } from '../utils/timestamp.js';\n\n/**\n * 查詢結果。\n */\nexport interface QueryOrderResult {\n  MerchantID?: string;\n  MerchantOrderNo?: string;\n  TradeNo?: string;\n  Amt?: number;\n  TradeStatus?: string;\n  PaymentType?: string;\n  CreateTime?: string;\n  PayTime?: string;\n  CheckCode?: string;\n  FundTime?: string;\n  ShopMerchantID?: string;\n  [key: string]: unknown;\n}\n\n/**\n * 交易查詢。\n *\n * 查詢藍新金流交易訂單狀態。\n */\nexport class QueryOrder {\n  /**\n   * API 版本。\n   */\n  protected version = '1.3';\n\n  /**\n   * API 請求路徑。\n   */\n  protected requestPath = '/API/QueryTradeInfo';\n\n  /**\n   * 是否為測試環境。\n   */\n  protected isTest = false;\n\n  protected httpClient: HttpClientInterface;\n\n  /**\n   * 建立查詢物件。\n   */\n  constructor(\n    protected merchantId: string,\n    protected hashKey: string,\n    protected hashIV: string,\n    httpClient?: HttpClientInterface\n  ) {\n    this.httpClient = httpClient ?? new FetchHttpClient();\n  }\n\n  /**\n   * 從設定建立查詢物件。\n   */\n  static create(\n    merchantId: string,\n    hashKey: string,\n    hashIV: string,\n    httpClient?: HttpClientInterface\n  ): QueryOrder {\n    return new QueryOrder(merchantId, hashKey, hashIV, httpClient);\n  }\n\n  /**\n   * 設定是否為測試環境。\n   */\n  setTestMode(isTest: boolean): this {\n    this.isTest = isTest;\n    return this;\n  }\n\n  /**\n   * 取得 API 基礎網址。\n   */\n  getBaseUrl(): string {\n    return this.isTest ? 'https://ccore.newebpay.com' : 'https://core.newebpay.com';\n  }\n\n  /**\n   * 取得完整 API 網址。\n   */\n  getApiUrl(): string {\n    return this.getBaseUrl() + this.requestPath;\n  }\n\n  /**\n   * 執行查詢。\n   */\n  async query(merchantOrderNo: string, amt: number): Promise<QueryOrderResult> {\n    const payload = this.buildPayload(merchantOrderNo, amt);\n\n    // Use HttpClient\n    const result = await this.httpClient.post<{\n      Status?: string;\n      Message?: string;\n      Result?: QueryOrderResult;\n    }>(this.getApiUrl(), payload);\n\n    return this.parseResponse(result);\n  }\n\n  /**\n   * 建立請求 Payload。\n   */\n  protected buildPayload(merchantOrderNo: string, amt: number): Record<string, string> {\n    const checkValue = this.generateCheckValue(merchantOrderNo, amt);\n\n    return {\n      MerchantID: this.merchantId,\n      Version: this.version,\n      RespondType: 'JSON',\n      CheckValue: checkValue,\n      TimeStamp: getTimestamp(),\n      MerchantOrderNo: merchantOrderNo,\n      Amt: String(amt),\n    };\n  }\n\n  /**\n   * 產生查詢用 CheckValue。\n   *\n   * 查詢 API 的 CheckValue 計算方式與 MPG 不同：\n   * SHA256(HashIV={HashIV}&Amt={Amt}&MerchantID={MerchantID}&MerchantOrderNo={MerchantOrderNo}&HashKey={HashKey})\n   */\n  protected generateCheckValue(merchantOrderNo: string, amt: number): string {\n    const raw = `HashIV=${this.hashIV}&Amt=${amt}&MerchantID=${this.merchantId}&MerchantOrderNo=${merchantOrderNo}&HashKey=${this.hashKey}`;\n    return createHash('sha256').update(raw).digest('hex').toUpperCase();\n  }\n\n  /**\n   * 解析回應。\n   */\n  protected parseResponse(response: {\n    Status?: string;\n    Message?: string;\n    Result?: QueryOrderResult;\n  }): QueryOrderResult {\n    const status = response.Status ?? '';\n    const message = response.Message ?? '';\n\n    if (status !== 'SUCCESS') {\n      throw NewebPayError.apiError(message, status);\n    }\n\n    return response.Result ?? {};\n  }\n}\n","import { NewebPayError } from '../../errors/newebpay-error.js';\nimport type { HttpClientInterface, HttpClientOptions } from './http-client.interface.js';\n\n/**\n * 基於 Fetch API 的 HTTP 客戶端實作。\n */\nexport class FetchHttpClient implements HttpClientInterface {\n  /**\n   * 預設超時時間（30 秒）。\n   */\n  private static readonly DEFAULT_TIMEOUT = 30000;\n\n  /**\n   * 預設重試次數。\n   */\n  private static readonly DEFAULT_RETRIES = 0;\n\n  /**\n   * 客戶端選項。\n   */\n  private readonly timeout: number;\n  private readonly retries: number;\n\n  constructor(options: HttpClientOptions = {}) {\n    this.timeout = options.timeout ?? FetchHttpClient.DEFAULT_TIMEOUT;\n    this.retries = options.retries ?? FetchHttpClient.DEFAULT_RETRIES;\n  }\n\n  /**\n   * 發送 POST 請求。\n   */\n  async post<T = unknown>(url: string, data: Record<string, unknown>): Promise<T> {\n    let lastError: NewebPayError | undefined;\n\n    for (let attempt = 0; attempt <= this.retries; attempt++) {\n      const controller = new AbortController();\n      const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n      try {\n        const response = await fetch(url, {\n          method: 'POST',\n          headers: {\n            'Content-Type': 'application/x-www-form-urlencoded',\n          },\n          body: new URLSearchParams(data as Record<string, string>).toString(),\n          signal: controller.signal,\n        });\n\n        clearTimeout(timeoutId);\n\n        if (!response.ok) {\n          throw NewebPayError.httpError(response.status, response.statusText, url);\n        }\n\n        try {\n          return (await response.json()) as T;\n        } catch (parseError) {\n          throw NewebPayError.networkError(\n            `Failed to parse JSON response: ${\n              parseError instanceof Error ? parseError.message : 'Unknown error'\n            }`,\n            url\n          );\n        }\n      } catch (error) {\n        clearTimeout(timeoutId);\n\n        // 已經是 NewebPayError 直接使用\n        if (error instanceof NewebPayError) {\n          lastError = error;\n        }\n        // AbortError 表示超時\n        else if (error instanceof Error && error.name === 'AbortError') {\n          lastError = NewebPayError.timeout(this.timeout, url);\n        }\n        // 其他網路錯誤\n        else {\n          lastError = NewebPayError.networkError(\n            error instanceof Error ? error.message : 'Unknown error',\n            url\n          );\n        }\n\n        // 如果還有重試機會，使用指數退避\n        if (attempt < this.retries) {\n          const delay = 2 ** attempt * 1000;\n          await new Promise((resolve) => setTimeout(resolve, delay));\n        }\n      }\n    }\n\n    throw lastError ?? NewebPayError.networkError('Request failed', url);\n  }\n}\n","import { NewebPayError } from '../errors/newebpay-error.js';\nimport { Aes256Encoder } from '../infrastructure/aes256-encoder.js';\nimport { FetchHttpClient } from '../infrastructure/http/fetch-http-client.js';\nimport type { HttpClientInterface } from '../infrastructure/http/http-client.interface.js';\nimport { getTimestamp } from '../utils/timestamp.js';\n\n/**\n * 信用卡交易明細查詢結果。\n */\nexport interface QueryCreditDetailResult {\n  MerchantID?: string;\n  MerchantOrderNo?: string;\n  TradeNo?: string;\n  Amt?: number;\n  CloseAmt?: number;\n  CloseStatus?: string;\n  BackBalance?: number;\n  BackStatus?: string;\n  RespondCode?: string;\n  Auth?: string;\n  ECI?: string;\n  CloseAmt0?: number;\n  CloseStatus0?: string;\n  [key: string]: unknown;\n}\n\n/**\n * 信用卡交易明細查詢。\n *\n * 查詢信用卡請退款狀態。\n */\nexport class QueryCreditDetail {\n  /**\n   * API 版本。\n   */\n  protected version = '1.1';\n\n  /**\n   * API 請求路徑。\n   */\n  protected requestPath = '/API/CreditCard/QueryTradeInfo';\n\n  /**\n   * 是否為測試環境。\n   */\n  protected isTest = false;\n\n  /**\n   * AES256 編碼器。\n   */\n  private aesEncoder?: Aes256Encoder;\n\n  /**\n   * HTTP 客戶端。\n   */\n  protected httpClient: HttpClientInterface;\n\n  /**\n   * 建立查詢物件。\n   */\n  constructor(\n    protected merchantId: string,\n    protected hashKey: string,\n    protected hashIV: string,\n    httpClient?: HttpClientInterface\n  ) {\n    this.httpClient = httpClient ?? new FetchHttpClient();\n  }\n\n  /**\n   * 從設定建立查詢物件。\n   */\n  static create(\n    merchantId: string,\n    hashKey: string,\n    hashIV: string,\n    httpClient?: HttpClientInterface\n  ): QueryCreditDetail {\n    return new QueryCreditDetail(merchantId, hashKey, hashIV, httpClient);\n  }\n\n  /**\n   * 設定是否為測試環境。\n   */\n  setTestMode(isTest: boolean): this {\n    this.isTest = isTest;\n    return this;\n  }\n\n  /**\n   * 取得 API 基礎網址。\n   */\n  getBaseUrl(): string {\n    return this.isTest ? 'https://ccore.newebpay.com' : 'https://core.newebpay.com';\n  }\n\n  /**\n   * 取得完整 API 網址。\n   */\n  getApiUrl(): string {\n    return this.getBaseUrl() + this.requestPath;\n  }\n\n  /**\n   * 執行查詢。\n   */\n  async query(merchantOrderNo: string, amt: number): Promise<QueryCreditDetailResult> {\n    const payload = this.buildPayload(merchantOrderNo, amt);\n\n    const result = await this.httpClient.post<{\n      Status?: string;\n      Message?: string;\n      Result?: QueryCreditDetailResult;\n    }>(this.getApiUrl(), payload);\n\n    return this.parseResponse(result);\n  }\n\n  /**\n   * 建立請求 Payload。\n   */\n  protected buildPayload(merchantOrderNo: string, amt: number): Record<string, string> {\n    const postData = {\n      MerchantID: this.merchantId,\n      Version: this.version,\n      RespondType: 'JSON',\n      TimeStamp: getTimestamp(),\n      MerchantOrderNo: merchantOrderNo,\n      Amt: amt,\n    };\n\n    const encoder = this.getAesEncoder();\n    const postDataStr = encoder.encrypt(postData);\n\n    return {\n      MerchantID_: this.merchantId,\n      PostData_: postDataStr,\n    };\n  }\n\n  /**\n   * 解析回應。\n   */\n  protected parseResponse(response: {\n    Status?: string;\n    Message?: string;\n    Result?: QueryCreditDetailResult;\n  }): QueryCreditDetailResult {\n    const status = response.Status ?? '';\n    const message = response.Message ?? '';\n\n    if (status !== 'SUCCESS') {\n      throw NewebPayError.apiError(message, status);\n    }\n\n    return response.Result ?? {};\n  }\n\n  /**\n   * 取得 AES256 編碼器。\n   */\n  private getAesEncoder(): Aes256Encoder {\n    if (!this.aesEncoder) {\n      this.aesEncoder = new Aes256Encoder(this.hashKey, this.hashIV);\n    }\n    return this.aesEncoder;\n  }\n}\n","import { NewebPayError } from '../errors/newebpay-error.js';\nimport { Aes256Encoder } from '../infrastructure/aes256-encoder.js';\nimport { FetchHttpClient } from '../infrastructure/http/fetch-http-client.js';\nimport type { HttpClientInterface } from '../infrastructure/http/http-client.interface.js';\nimport { CloseType, IndexType } from '../types/parameters.js';\nimport { getTimestamp } from '../utils/timestamp.js';\n\n/**\n * 請退款結果。\n */\nexport interface CreditCloseResult {\n  MerchantID?: string;\n  MerchantOrderNo?: string;\n  TradeNo?: string;\n  Amt?: number;\n  CloseType?: number;\n  [key: string]: unknown;\n}\n\n/**\n * 信用卡請退款。\n *\n * 對已授權的信用卡交易進行請款或退款操作。\n */\nexport class CreditClose {\n  /**\n   * 請款類型：請款。\n   */\n  static readonly CLOSE_TYPE_PAY = CloseType.PAY;\n\n  /**\n   * 請款類型：退款。\n   */\n  static readonly CLOSE_TYPE_REFUND = CloseType.REFUND;\n\n  /**\n   * API 版本。\n   */\n  protected version = '1.1';\n\n  /**\n   * API 請求路徑。\n   */\n  protected requestPath = '/API/CreditCard/Close';\n\n  /**\n   * 是否為測試環境。\n   */\n  protected isTest = false;\n\n  /**\n   * AES256 編碼器。\n   */\n  private aesEncoder?: Aes256Encoder;\n\n  /**\n   * HTTP 客戶端。\n   */\n  protected httpClient: HttpClientInterface;\n\n  /**\n   * 建立請退款物件。\n   */\n  constructor(\n    protected merchantId: string,\n    protected hashKey: string,\n    protected hashIV: string,\n    httpClient?: HttpClientInterface\n  ) {\n    this.httpClient = httpClient ?? new FetchHttpClient();\n  }\n\n  /**\n   * 從設定建立請退款物件。\n   */\n  static create(\n    merchantId: string,\n    hashKey: string,\n    hashIV: string,\n    httpClient?: HttpClientInterface\n  ): CreditClose {\n    return new CreditClose(merchantId, hashKey, hashIV, httpClient);\n  }\n\n  /**\n   * 設定是否為測試環境。\n   */\n  setTestMode(isTest: boolean): this {\n    this.isTest = isTest;\n    return this;\n  }\n\n  /**\n   * 取得 API 基礎網址。\n   */\n  getBaseUrl(): string {\n    return this.isTest ? 'https://ccore.newebpay.com' : 'https://core.newebpay.com';\n  }\n\n  /**\n   * 取得完整 API 網址。\n   */\n  getApiUrl(): string {\n    return this.getBaseUrl() + this.requestPath;\n  }\n\n  /**\n   * 執行請款。\n   */\n  async pay(\n    merchantOrderNo: string,\n    amt: number,\n    indexType: IndexType | string = IndexType.MERCHANT_ORDER_NO,\n    tradeNo?: string\n  ): Promise<CreditCloseResult> {\n    return this.execute(merchantOrderNo, amt, CloseType.PAY, indexType, tradeNo);\n  }\n\n  /**\n   * 執行退款。\n   */\n  async refund(\n    merchantOrderNo: string,\n    amt: number,\n    indexType: IndexType | string = IndexType.MERCHANT_ORDER_NO,\n    tradeNo?: string\n  ): Promise<CreditCloseResult> {\n    return this.execute(merchantOrderNo, amt, CloseType.REFUND, indexType, tradeNo);\n  }\n\n  /**\n   * 取消請退款。\n   */\n  async cancelClose(\n    merchantOrderNo: string,\n    amt: number,\n    closeType: CloseType | number,\n    indexType: IndexType | string = IndexType.MERCHANT_ORDER_NO,\n    tradeNo?: string\n  ): Promise<CreditCloseResult> {\n    return this.execute(merchantOrderNo, amt, closeType, indexType, tradeNo, true);\n  }\n\n  /**\n   * 執行請退款操作。\n   */\n  protected async execute(\n    merchantOrderNo: string,\n    amt: number,\n    closeType: CloseType | number,\n    indexType: IndexType | string = IndexType.MERCHANT_ORDER_NO,\n    tradeNo?: string,\n    cancel = false\n  ): Promise<CreditCloseResult> {\n    const postData: Record<string, unknown> = {\n      RespondType: 'JSON',\n      Version: this.version,\n      Amt: amt,\n      MerchantOrderNo: merchantOrderNo,\n      IndexType: indexType,\n      TimeStamp: getTimestamp(),\n      CloseType: closeType,\n    };\n\n    if (indexType === IndexType.TRADE_NO && tradeNo) {\n      postData.TradeNo = tradeNo;\n    }\n\n    if (cancel) {\n      postData.Cancel = 1;\n    }\n\n    const payload = this.buildPayload(postData);\n\n    const result = await this.httpClient.post<{\n      Status?: string;\n      Message?: string;\n      Result?: CreditCloseResult;\n    }>(this.getApiUrl(), payload);\n\n    return this.parseResponse(result);\n  }\n\n  /**\n   * 建立請求 Payload。\n   */\n  protected buildPayload(postData: Record<string, unknown>): Record<string, string> {\n    const encoder = this.getAesEncoder();\n    const tradeInfo = encoder.encrypt(postData);\n\n    return {\n      MerchantID_: this.merchantId,\n      PostData_: tradeInfo,\n    };\n  }\n\n  /**\n   * 解析回應。\n   */\n  protected parseResponse(response: {\n    Status?: string;\n    Message?: string;\n    Result?: CreditCloseResult;\n  }): CreditCloseResult {\n    const status = response.Status ?? '';\n    const message = response.Message ?? '';\n\n    if (status !== 'SUCCESS') {\n      throw NewebPayError.apiError(message, status);\n    }\n\n    return response.Result ?? {};\n  }\n\n  /**\n   * 取得 AES256 編碼器。\n   */\n  private getAesEncoder(): Aes256Encoder {\n    if (!this.aesEncoder) {\n      this.aesEncoder = new Aes256Encoder(this.hashKey, this.hashIV);\n    }\n    return this.aesEncoder;\n  }\n}\n","import { NewebPayError } from '../errors/newebpay-error.js';\nimport { Aes256Encoder } from '../infrastructure/aes256-encoder.js';\nimport { FetchHttpClient } from '../infrastructure/http/fetch-http-client.js';\nimport type { HttpClientInterface } from '../infrastructure/http/http-client.interface.js';\nimport { IndexType } from '../types/parameters.js';\nimport { getTimestamp } from '../utils/timestamp.js';\n\n/**\n * 取消授權結果。\n */\nexport interface CreditCancelResult {\n  MerchantID?: string;\n  MerchantOrderNo?: string;\n  TradeNo?: string;\n  Amt?: number;\n  [key: string]: unknown;\n}\n\n/**\n * 信用卡取消授權。\n *\n * 取消尚未請款的信用卡授權交易。\n */\nexport class CreditCancel {\n  /**\n   * API 版本。\n   */\n  protected version = '1.0';\n\n  /**\n   * API 請求路徑。\n   */\n  protected requestPath = '/API/CreditCard/Cancel';\n\n  /**\n   * 是否為測試環境。\n   */\n  protected isTest = false;\n\n  /**\n   * AES256 編碼器。\n   */\n  private aesEncoder?: Aes256Encoder;\n\n  /**\n   * HTTP 客戶端。\n   */\n  protected httpClient: HttpClientInterface;\n\n  /**\n   * 建立取消授權物件。\n   */\n  constructor(\n    protected merchantId: string,\n    protected hashKey: string,\n    protected hashIV: string,\n    httpClient?: HttpClientInterface\n  ) {\n    this.httpClient = httpClient ?? new FetchHttpClient();\n  }\n\n  /**\n   * 從設定建立取消授權物件。\n   */\n  static create(\n    merchantId: string,\n    hashKey: string,\n    hashIV: string,\n    httpClient?: HttpClientInterface\n  ): CreditCancel {\n    return new CreditCancel(merchantId, hashKey, hashIV, httpClient);\n  }\n\n  /**\n   * 設定是否為測試環境。\n   */\n  setTestMode(isTest: boolean): this {\n    this.isTest = isTest;\n    return this;\n  }\n\n  /**\n   * 取得 API 基礎網址。\n   */\n  getBaseUrl(): string {\n    return this.isTest ? 'https://ccore.newebpay.com' : 'https://core.newebpay.com';\n  }\n\n  /**\n   * 取得完整 API 網址。\n   */\n  getApiUrl(): string {\n    return this.getBaseUrl() + this.requestPath;\n  }\n\n  /**\n   * 執行取消授權。\n   */\n  async cancel(\n    merchantOrderNo: string,\n    amt: number,\n    indexType: IndexType | string = IndexType.MERCHANT_ORDER_NO,\n    tradeNo?: string\n  ): Promise<CreditCancelResult> {\n    const postData: Record<string, unknown> = {\n      RespondType: 'JSON',\n      Version: this.version,\n      Amt: amt,\n      MerchantOrderNo: merchantOrderNo,\n      IndexType: indexType,\n      TimeStamp: getTimestamp(),\n    };\n\n    if (indexType === IndexType.TRADE_NO && tradeNo) {\n      postData.TradeNo = tradeNo;\n    }\n\n    const payload = this.buildPayload(postData);\n\n    const result = await this.httpClient.post<{\n      Status?: string;\n      Message?: string;\n      Result?: CreditCancelResult;\n    }>(this.getApiUrl(), payload);\n\n    return this.parseResponse(result);\n  }\n\n  /**\n   * 建立請求 Payload。\n   */\n  protected buildPayload(postData: Record<string, unknown>): Record<string, string> {\n    const encoder = this.getAesEncoder();\n    const tradeInfo = encoder.encrypt(postData);\n\n    return {\n      MerchantID_: this.merchantId,\n      PostData_: tradeInfo,\n    };\n  }\n\n  /**\n   * 解析回應。\n   */\n  protected parseResponse(response: {\n    Status?: string;\n    Message?: string;\n    Result?: CreditCancelResult;\n  }): CreditCancelResult {\n    const status = response.Status ?? '';\n    const message = response.Message ?? '';\n\n    if (status !== 'SUCCESS') {\n      throw NewebPayError.apiError(message, status);\n    }\n\n    return response.Result ?? {};\n  }\n\n  /**\n   * 取得 AES256 編碼器。\n   */\n  private getAesEncoder(): Aes256Encoder {\n    if (!this.aesEncoder) {\n      this.aesEncoder = new Aes256Encoder(this.hashKey, this.hashIV);\n    }\n    return this.aesEncoder;\n  }\n}\n","import { NewebPayError } from '../errors/newebpay-error.js';\nimport { Aes256Encoder } from '../infrastructure/aes256-encoder.js';\nimport { FetchHttpClient } from '../infrastructure/http/fetch-http-client.js';\nimport type { HttpClientInterface } from '../infrastructure/http/http-client.interface.js';\nimport { getTimestamp } from '../utils/timestamp.js';\n\n/**\n * 電子錢包退款結果。\n */\nexport interface EWalletRefundResult {\n  MerchantID?: string;\n  MerchantOrderNo?: string;\n  TradeNo?: string;\n  Amt?: number;\n  RefundAmt?: number;\n  [key: string]: unknown;\n}\n\n/**\n * 支援的電子錢包類型。\n */\nexport type EWalletType = 'LINEPAY' | 'ESUNWALLET' | 'TAIWANPAY';\n\n/**\n * 電子錢包退款。\n *\n * 對 LINE Pay、玉山 Wallet、台灣 Pay 等電子錢包交易進行退款。\n */\nexport class EWalletRefund {\n  /**\n   * API 版本。\n   */\n  protected version = '1.0';\n\n  /**\n   * API 請求路徑。\n   */\n  protected requestPath = '/API/EWallet/Refund';\n\n  /**\n   * 是否為測試環境。\n   */\n  protected isTest = false;\n\n  /**\n   * AES256 編碼器。\n   */\n  private aesEncoder?: Aes256Encoder;\n\n  /**\n   * HTTP 客戶端。\n   */\n  protected httpClient: HttpClientInterface;\n\n  /**\n   * 建立退款物件。\n   */\n  constructor(\n    protected merchantId: string,\n    protected hashKey: string,\n    protected hashIV: string,\n    httpClient?: HttpClientInterface\n  ) {\n    this.httpClient = httpClient ?? new FetchHttpClient();\n  }\n\n  /**\n   * 從設定建立退款物件。\n   */\n  static create(\n    merchantId: string,\n    hashKey: string,\n    hashIV: string,\n    httpClient?: HttpClientInterface\n  ): EWalletRefund {\n    return new EWalletRefund(merchantId, hashKey, hashIV, httpClient);\n  }\n\n  /**\n   * 設定是否為測試環境。\n   */\n  setTestMode(isTest: boolean): this {\n    this.isTest = isTest;\n    return this;\n  }\n\n  /**\n   * 取得 API 基礎網址。\n   */\n  getBaseUrl(): string {\n    return this.isTest ? 'https://ccore.newebpay.com' : 'https://core.newebpay.com';\n  }\n\n  /**\n   * 取得完整 API 網址。\n   */\n  getApiUrl(): string {\n    return this.getBaseUrl() + this.requestPath;\n  }\n\n  /**\n   * 執行退款。\n   *\n   * @param merchantOrderNo 特店訂單編號\n   * @param amt 退款金額\n   * @param paymentType 電子錢包類型\n   */\n  async refund(\n    merchantOrderNo: string,\n    amt: number,\n    paymentType: EWalletType\n  ): Promise<EWalletRefundResult> {\n    const postData: Record<string, unknown> = {\n      RespondType: 'JSON',\n      Version: this.version,\n      TimeStamp: getTimestamp(),\n      MerchantOrderNo: merchantOrderNo,\n      Amt: amt,\n      PaymentType: paymentType,\n    };\n\n    const payload = this.buildPayload(postData);\n\n    const result = await this.httpClient.post<{\n      Status?: string;\n      Message?: string;\n      Result?: EWalletRefundResult;\n    }>(this.getApiUrl(), payload);\n\n    return this.parseResponse(result);\n  }\n\n  /**\n   * 建立請求 Payload。\n   */\n  protected buildPayload(postData: Record<string, unknown>): Record<string, string> {\n    const encoder = this.getAesEncoder();\n    const tradeInfo = encoder.encrypt(postData);\n\n    return {\n      MerchantID_: this.merchantId,\n      PostData_: tradeInfo,\n    };\n  }\n\n  /**\n   * 解析回應。\n   */\n  protected parseResponse(response: {\n    Status?: string;\n    Message?: string;\n    Result?: EWalletRefundResult;\n  }): EWalletRefundResult {\n    const status = response.Status ?? '';\n    const message = response.Message ?? '';\n\n    if (status !== 'SUCCESS') {\n      throw NewebPayError.apiError(message, status);\n    }\n\n    return response.Result ?? {};\n  }\n\n  /**\n   * 取得 AES256 編碼器。\n   */\n  private getAesEncoder(): Aes256Encoder {\n    if (!this.aesEncoder) {\n      this.aesEncoder = new Aes256Encoder(this.hashKey, this.hashIV);\n    }\n    return this.aesEncoder;\n  }\n}\n","import {\n  AllInOnePayment,\n  AtmPayment,\n  BarcodePayment,\n  CreditInstallment,\n  CreditPayment,\n  CvsPayment,\n  LinePayPayment,\n  TaiwanPayPayment,\n  WebAtmPayment,\n} from '../../index.js';\nimport type { PaymentInterface } from '../../types/payment.js';\nimport type { NewebPayConfig } from './config.js';\n\n/**\n * 支付建構器（類似 PHP 的 PaymentBuilder）\n *\n * 提供簡化的鏈式 API\n */\nexport class PaymentBuilder {\n  private orderNo = '';\n  private amount = 0;\n  private itemDesc = '';\n  private email = '';\n  private returnUrl?: string;\n  private notifyUrl?: string;\n  private customerUrl?: string;\n  private clientBackUrl?: string;\n  private paymentClass: new (\n    merchantId: string,\n    hashKey: string,\n    hashIV: string\n  ) => PaymentInterface = CreditPayment;\n  private installments?: number[];\n  private expireDate?: string;\n  private customizer?: (payment: PaymentInterface) => void;\n\n  constructor(private readonly config: NewebPayConfig) {}\n\n  /**\n   * 設定基本交易資訊\n   */\n  setOrder(orderNo: string, amount: number, itemDesc: string, email = ''): this {\n    this.orderNo = orderNo;\n    this.amount = amount;\n    this.itemDesc = itemDesc;\n    this.email = email;\n    return this;\n  }\n\n  /**\n   * 使用信用卡一次付清\n   */\n  creditCard(): this {\n    this.paymentClass = CreditPayment;\n    return this;\n  }\n\n  /**\n   * 使用信用卡分期\n   */\n  creditInstallment(periods: number[] = [3, 6, 12]): this {\n    this.paymentClass = CreditInstallment;\n    this.installments = periods;\n    return this;\n  }\n\n  /**\n   * 使用 WebATM\n   */\n  webAtm(): this {\n    this.paymentClass = WebAtmPayment;\n    return this;\n  }\n\n  /**\n   * 使用 ATM 虛擬帳號\n   */\n  atm(expireDate?: string): this {\n    this.paymentClass = AtmPayment;\n    if (expireDate) {\n      this.expireDate = expireDate;\n    }\n    return this;\n  }\n\n  /**\n   * 使用超商代碼繳費\n   */\n  cvs(expireDate?: string): this {\n    this.paymentClass = CvsPayment;\n    if (expireDate) {\n      this.expireDate = expireDate;\n    }\n    return this;\n  }\n\n  /**\n   * 使用超商條碼繳費\n   */\n  barcode(expireDate?: string): this {\n    this.paymentClass = BarcodePayment;\n    if (expireDate) {\n      this.expireDate = expireDate;\n    }\n    return this;\n  }\n\n  /**\n   * 使用 LINE Pay\n   */\n  linePay(): this {\n    this.paymentClass = LinePayPayment;\n    return this;\n  }\n\n  /**\n   * 使用台灣 Pay\n   */\n  taiwanPay(): this {\n    this.paymentClass = TaiwanPayPayment;\n    return this;\n  }\n\n  /**\n   * 使用全支付方式\n   */\n  allInOne(): this {\n    this.paymentClass = AllInOnePayment;\n    return this;\n  }\n\n  /**\n   * 設定付款完成返回網址\n   */\n  setReturnUrl(url: string): this {\n    this.returnUrl = url;\n    return this;\n  }\n\n  /**\n   * 設定付款結果通知網址\n   */\n  setNotifyUrl(url: string): this {\n    this.notifyUrl = url;\n    return this;\n  }\n\n  /**\n   * 設定取號完成返回網址\n   */\n  setCustomerUrl(url: string): this {\n    this.customerUrl = url;\n    return this;\n  }\n\n  /**\n   * 設定返回商店網址\n   */\n  setClientBackUrl(url: string): this {\n    this.clientBackUrl = url;\n    return this;\n  }\n\n  /**\n   * 自訂支付物件設定\n   */\n  customize(callback: (payment: PaymentInterface) => void): this {\n    this.customizer = callback;\n    return this;\n  }\n\n  /**\n   * 建立支付物件\n   */\n  build(): PaymentInterface {\n    const payment = new this.paymentClass(\n      this.config.merchantId,\n      this.config.hashKey,\n      this.config.hashIV\n    ) as PaymentInterface & {\n      setTestMode: (test: boolean) => PaymentInterface;\n      setEmail: (email: string) => PaymentInterface;\n      setCustomerURL: (url: string) => PaymentInterface;\n      setClientBackURL: (url: string) => PaymentInterface;\n      getApiUrl: () => string;\n    };\n\n    if (this.config.testMode !== undefined) {\n      payment.setTestMode(this.config.testMode);\n    }\n\n    payment.setMerchantOrderNo(this.orderNo);\n    payment.setAmt(this.amount);\n    payment.setItemDesc(this.itemDesc);\n\n    if (this.email) {\n      payment.setEmail(this.email);\n    }\n\n    if (this.returnUrl) {\n      payment.setReturnURL(this.returnUrl);\n    } else if (this.config.returnUrl) {\n      payment.setReturnURL(this.config.returnUrl);\n    }\n\n    if (this.notifyUrl) {\n      payment.setNotifyURL(this.notifyUrl);\n    } else if (this.config.notifyUrl) {\n      payment.setNotifyURL(this.config.notifyUrl);\n    }\n\n    if (this.customerUrl) {\n      payment.setCustomerURL(this.customerUrl);\n    } else if (this.config.customerUrl) {\n      payment.setCustomerURL(this.config.customerUrl);\n    }\n\n    if (this.clientBackUrl) {\n      payment.setClientBackURL(this.clientBackUrl);\n    } else if (this.config.clientBackUrl) {\n      payment.setClientBackURL(this.config.clientBackUrl);\n    }\n\n    // 設定分期\n    if (payment instanceof CreditInstallment && this.installments) {\n      payment.setInstallment(this.installments);\n    }\n\n    // 設定繳費期限\n    if (this.expireDate && 'setExpireDate' in payment) {\n      (payment as { setExpireDate: (date: string) => void }).setExpireDate(this.expireDate);\n    }\n\n    // 執行自訂設定\n    if (this.customizer) {\n      this.customizer(payment);\n    }\n\n    return payment;\n  }\n\n  /**\n   * 取得支付參數（供前端使用）\n   */\n  getParams(): {\n    action: string;\n    method: string;\n    fields: Record<string, string>;\n  } {\n    const payment = this.build();\n    const content = payment.getContent();\n\n    // 統一取得 API URL 的邏輯\n    let apiUrl = '';\n    if ('getApiUrl' in payment && typeof payment.getApiUrl === 'function') {\n      apiUrl = (payment as { getApiUrl: () => string }).getApiUrl();\n    } else if ('getBaseUrl' in payment && typeof payment.getBaseUrl === 'function') {\n      const baseUrl = (payment as { getBaseUrl: () => string }).getBaseUrl();\n      apiUrl = baseUrl + payment.getRequestPath();\n    } else {\n      // 檢查是否為測試模式\n      const isTest =\n        'isTestMode' in payment && typeof payment.isTestMode === 'function'\n          ? (payment as { isTestMode: () => boolean }).isTestMode()\n          : (this.config.testMode ?? false);\n\n      const baseUrl = isTest ? 'https://ccore.newebpay.com' : 'https://core.newebpay.com';\n      apiUrl = baseUrl + payment.getRequestPath();\n    }\n\n    return {\n      action: apiUrl,\n      method: 'POST',\n      fields: {\n        MerchantID: content.MerchantID,\n        TradeInfo: content.TradeInfo,\n        TradeSha: content.TradeSha,\n        Version: content.Version,\n      },\n    };\n  }\n}\n","import {\n  AllInOnePayment,\n  AtmPayment,\n  BarcodePayment,\n  BitoPayPayment,\n  CreditCancel,\n  CreditClose,\n  CreditInstallment,\n  CreditPayment,\n  CvsPayment,\n  CvscomPayment,\n  EWalletRefund,\n  EsunWalletPayment,\n  FormBuilder,\n  FulaPayment,\n  LinePayPayment,\n  QueryCreditDetail,\n  QueryOrder,\n  TaiwanPayPayment,\n  TwqrPayment,\n  WebAtmPayment,\n} from '../../index.js';\nimport type { PaymentInterface } from '../../types/payment.js';\nimport type { NewebPayConfig } from './config.js';\nimport { PaymentBuilder } from './payment-builder.js';\n\nimport { FetchHttpClient } from '../../infrastructure/http/fetch-http-client.js';\n/**\n * 藍新金流服務類別（類似 PHP 的 PaymentCoordinator）\n *\n * 提供統一的服務介面，簡化框架整合\n */\nimport type { HttpClientInterface } from '../../infrastructure/http/http-client.interface.js';\n\nexport class NewebPayService {\n  private readonly httpClient: HttpClientInterface;\n\n  constructor(\n    private readonly config: NewebPayConfig,\n    httpClient?: HttpClientInterface\n  ) {\n    this.httpClient = httpClient ?? new FetchHttpClient();\n  }\n  // ... (rest is same, but pass this.httpClient to operations if they support it)\n  // Currently operation classes (QueryOrder, etc.) are only Builders. They have \"submit()\" which returns form URL? No, Query API is Direct POST.\n  // Let's check QueryOrder source first.\n\n  /**\n   * 建立快速支付（簡化 API）\n   */\n  payment(orderNo: string, amount: number, itemDesc: string, email = ''): PaymentBuilder {\n    return new PaymentBuilder(this.config).setOrder(orderNo, amount, itemDesc, email);\n  }\n\n  /**\n   * 建立信用卡一次付清支付\n   */\n  credit(): CreditPayment {\n    return this.createPayment(CreditPayment);\n  }\n\n  /**\n   * 建立信用卡分期支付\n   */\n  creditInstallment(): CreditInstallment {\n    return this.createPayment(CreditInstallment);\n  }\n\n  /**\n   * 建立 WebATM 支付\n   */\n  webAtm(): WebAtmPayment {\n    return this.createPayment(WebAtmPayment);\n  }\n\n  /**\n   * 建立 ATM 轉帳支付\n   */\n  atm(): AtmPayment {\n    return this.createPayment(AtmPayment);\n  }\n\n  /**\n   * 建立超商代碼繳費支付\n   */\n  cvs(): CvsPayment {\n    return this.createPayment(CvsPayment);\n  }\n\n  /**\n   * 建立超商條碼繳費支付\n   */\n  barcode(): BarcodePayment {\n    return this.createPayment(BarcodePayment);\n  }\n\n  /**\n   * 建立 LINE Pay 支付\n   */\n  linePay(): LinePayPayment {\n    return this.createPayment(LinePayPayment);\n  }\n\n  /**\n   * 建立台灣 Pay 支付\n   */\n  taiwanPay(): TaiwanPayPayment {\n    return this.createPayment(TaiwanPayPayment);\n  }\n\n  /**\n   * 建立玉山 Wallet 支付\n   */\n  esunWallet(): EsunWalletPayment {\n    return this.createPayment(EsunWalletPayment);\n  }\n\n  /**\n   * 建立 BitoPay 支付\n   */\n  bitoPay(): BitoPayPayment {\n    return this.createPayment(BitoPayPayment);\n  }\n\n  /**\n   * 建立 TWQR 支付\n   */\n  twqr(): TwqrPayment {\n    return this.createPayment(TwqrPayment);\n  }\n\n  /**\n   * 建立付啦支付\n   */\n  fula(): FulaPayment {\n    return this.createPayment(FulaPayment);\n  }\n\n  /**\n   * 建立超商取貨付款支付\n   */\n  cvscom(): CvscomPayment {\n    return this.createPayment(CvscomPayment);\n  }\n\n  /**\n   * 建立全支付方式\n   */\n  allInOne(): AllInOnePayment {\n    return this.createPayment(AllInOnePayment);\n  }\n\n  /**\n   * 建立表單產生器\n   */\n  form(payment: PaymentInterface): FormBuilder {\n    return FormBuilder.create(payment);\n  }\n\n  /**\n   * 建立交易查詢\n   */\n  queryOrder(): QueryOrder {\n    return QueryOrder.create(\n      this.config.merchantId,\n      this.config.hashKey,\n      this.config.hashIV,\n      this.httpClient\n    ).setTestMode(this.config.testMode ?? false);\n  }\n\n  /**\n   * 建立信用卡明細查詢\n   */\n  queryCreditDetail(): QueryCreditDetail {\n    return QueryCreditDetail.create(\n      this.config.merchantId,\n      this.config.hashKey,\n      this.config.hashIV\n    ).setTestMode(this.config.testMode ?? false);\n  }\n\n  /**\n   * 建立信用卡取消授權\n   */\n  creditCancel(): CreditCancel {\n    return CreditCancel.create(\n      this.config.merchantId,\n      this.config.hashKey,\n      this.config.hashIV\n    ).setTestMode(this.config.testMode ?? false);\n  }\n\n  /**\n   * 建立信用卡請退款\n   */\n  creditClose(): CreditClose {\n    return CreditClose.create(\n      this.config.merchantId,\n      this.config.hashKey,\n      this.config.hashIV\n    ).setTestMode(this.config.testMode ?? false);\n  }\n\n  /**\n   * 建立電子錢包退款\n   */\n  eWalletRefund(): EWalletRefund {\n    return EWalletRefund.create(\n      this.config.merchantId,\n      this.config.hashKey,\n      this.config.hashIV\n    ).setTestMode(this.config.testMode ?? false);\n  }\n\n  /**\n   * 建立支付操作物件（內部方法）\n   */\n  private createPayment<T extends PaymentInterface>(\n    PaymentClass: new (merchantId: string, hashKey: string, hashIV: string) => T\n  ): T {\n    const payment = new PaymentClass(\n      this.config.merchantId,\n      this.config.hashKey,\n      this.config.hashIV\n    ) as T & {\n      setTestMode?: (test: boolean) => T;\n      setCustomerURL?: (url: string) => T;\n      setClientBackURL?: (url: string) => T;\n    };\n\n    if (this.config.testMode !== undefined && payment.setTestMode) {\n      payment.setTestMode(this.config.testMode);\n    }\n\n    if (this.config.returnUrl) {\n      payment.setReturnURL(this.config.returnUrl);\n    }\n\n    if (this.config.notifyUrl) {\n      payment.setNotifyURL(this.config.notifyUrl);\n    }\n\n    if (this.config.customerUrl && payment.setCustomerURL) {\n      payment.setCustomerURL(this.config.customerUrl);\n    }\n\n    if (this.config.clientBackUrl && payment.setClientBackURL) {\n      payment.setClientBackURL(this.config.clientBackUrl);\n    }\n\n    return payment as T;\n  }\n}\n","import type { NextFunction, Request, Response } from 'express';\nimport { AtmNotify, CvsNotify, CvscomNotify, PaymentNotify } from '../../index.js';\nimport type { NewebPayConfig } from '../common/config.js';\n\n/**\n * 擴充 Express Request 型別\n */\ndeclare global {\n  namespace Express {\n    interface Request {\n      newebpayNotify?: PaymentNotify | AtmNotify | CvsNotify | CvscomNotify;\n    }\n  }\n}\n\n/**\n * 支付完成通知 Middleware\n */\nexport function paymentNotifyMiddleware(config: NewebPayConfig) {\n  return (req: Request, res: Response, next: NextFunction): void => {\n    const notify = new PaymentNotify(config.hashKey, config.hashIV);\n\n    if (req.body?.TradeInfo && req.body?.TradeSha) {\n      const isValid = notify.verify(req.body);\n      if (!isValid) {\n        res.status(400).json({\n          error: 'TradeSha verification failed',\n          code: 'CHECK_VALUE_FAILED',\n        });\n        return;\n      }\n    }\n\n    req.newebpayNotify = notify;\n    next();\n  };\n}\n\n/**\n * ATM 取號通知 Middleware\n */\nexport function atmNotifyMiddleware(config: NewebPayConfig) {\n  return (req: Request, res: Response, next: NextFunction): void => {\n    const notify = new AtmNotify(config.hashKey, config.hashIV);\n\n    if (req.body?.TradeInfo && req.body?.TradeSha) {\n      const isValid = notify.verify(req.body);\n      if (!isValid) {\n        res.status(400).json({\n          error: 'TradeSha verification failed',\n          code: 'CHECK_VALUE_FAILED',\n        });\n        return;\n      }\n    }\n\n    req.newebpayNotify = notify;\n    next();\n  };\n}\n\n/**\n * 超商取號通知 Middleware\n */\nexport function cvsNotifyMiddleware(config: NewebPayConfig) {\n  return (req: Request, res: Response, next: NextFunction): void => {\n    const notify = new CvsNotify(config.hashKey, config.hashIV);\n\n    if (req.body?.TradeInfo && req.body?.TradeSha) {\n      const isValid = notify.verify(req.body);\n      if (!isValid) {\n        res.status(400).json({\n          error: 'TradeSha verification failed',\n          code: 'CHECK_VALUE_FAILED',\n        });\n        return;\n      }\n    }\n\n    req.newebpayNotify = notify;\n    next();\n  };\n}\n\n/**\n * 超商取貨付款通知 Middleware\n */\nexport function cvscomNotifyMiddleware(config: NewebPayConfig) {\n  return (req: Request, res: Response, next: NextFunction): void => {\n    const notify = new CvscomNotify(config.hashKey, config.hashIV);\n\n    if (req.body?.TradeInfo && req.body?.TradeSha) {\n      const isValid = notify.verify(req.body);\n      if (!isValid) {\n        res.status(400).json({\n          error: 'TradeSha verification failed',\n          code: 'CHECK_VALUE_FAILED',\n        });\n        return;\n      }\n    }\n\n    req.newebpayNotify = notify;\n    next();\n  };\n}\n","/**\n * 藍新金流設定介面\n */\nexport interface NewebPayConfig {\n  merchantId: string;\n  hashKey: string;\n  hashIV: string;\n  testMode?: boolean;\n  returnUrl?: string;\n  notifyUrl?: string;\n  customerUrl?: string;\n  clientBackUrl?: string;\n}\n\n/**\n * 環境變數設定介面\n */\nexport interface NewebPayEnvConfig {\n  NEWEBPAY_MERCHANT_ID?: string;\n  NEWEBPAY_HASH_KEY?: string;\n  NEWEBPAY_HASH_IV?: string;\n  NEWEBPAY_TEST_MODE?: string;\n  NEWEBPAY_RETURN_URL?: string;\n  NEWEBPAY_NOTIFY_URL?: string;\n  NEWEBPAY_CUSTOMER_URL?: string;\n  NEWEBPAY_CLIENT_BACK_URL?: string;\n}\n\n/**\n * 從環境變數載入設定\n */\nexport function loadConfigFromEnv(env?: NewebPayEnvConfig): NewebPayConfig {\n  const processEnv = env ?? (process.env as NewebPayEnvConfig);\n\n  const config: NewebPayConfig = {\n    merchantId: processEnv.NEWEBPAY_MERCHANT_ID ?? '',\n    hashKey: processEnv.NEWEBPAY_HASH_KEY ?? '',\n    hashIV: processEnv.NEWEBPAY_HASH_IV ?? '',\n    testMode: processEnv.NEWEBPAY_TEST_MODE === 'true' || processEnv.NEWEBPAY_TEST_MODE === '1',\n  };\n\n  if (processEnv.NEWEBPAY_RETURN_URL) {\n    config.returnUrl = processEnv.NEWEBPAY_RETURN_URL;\n  }\n\n  if (processEnv.NEWEBPAY_NOTIFY_URL) {\n    config.notifyUrl = processEnv.NEWEBPAY_NOTIFY_URL;\n  }\n\n  if (processEnv.NEWEBPAY_CUSTOMER_URL) {\n    config.customerUrl = processEnv.NEWEBPAY_CUSTOMER_URL;\n  }\n\n  if (processEnv.NEWEBPAY_CLIENT_BACK_URL) {\n    config.clientBackUrl = processEnv.NEWEBPAY_CLIENT_BACK_URL;\n  }\n\n  return config;\n}\n"],"mappings":"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","names":["import_node_crypto","baseUrl","import_node_crypto","express"]}