{"version":3,"sources":["../src/common/utils/logger.util.ts","../src/common/services/logger.service.ts","../src/vnpay/constants/response-map.constant.ts","../src/vnpay/constants/api-endpoint.constant.ts","../src/vnpay/constants/ipn-result-for-vnpay.constant.ts","../src/vnpay/constants/regex.constant.ts","../src/vnpay/constants/index.ts","../src/vnpay/enums/product-code.enum.ts","../src/vnpay/enums/index.ts","../src/common/utils/http.util.ts","../src/vnpay/utils/common.ts","../src/vnpay/utils/payment.util.ts","../src/vnpay/core/vnpay-payment.service.ts","../src/vnpay/core/vnpay-query.service.ts","../src/vnpay/core/vnpay-verification.service.ts","../src/vnpay/core/index.ts"],"names":["ProductCode","UrlService","HashAlgorithm","VnpCurrCode","VnpLocale","VnpCardType","VnpTransactionType","RefundTransactionType","dayjs","utc","timezone","crypto","hash"],"mappings":"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","file":"vnpay.cjs","sourcesContent":["import * as fs from 'fs';\n\n/**\n * Truyền vào `loggerFn` để bỏ qua logger\n *\n * @en Pass to `loggerFn` for ignoring logger\n * @returns {void}\n */\nexport function ignoreLogger(): void {}\n\n/**\n * Ghi dữ liệu ra console\n *\n * @en Log data to console\n * @param data - Data to be logged\n */\nexport function consoleLogger(data: unknown, symbol: keyof typeof console = 'log'): void {\n  if (typeof console[symbol] === 'function') {\n    (console[symbol] as (...data: unknown[]) => void)(data);\n  }\n}\n\n/**\n * Ghi dữ liệu ra file\n *\n * @en Log data to file\n * @param data Data to be logged\n * @param filePath File path to be written\n * @param errorCallback Error callback function\n */\nexport function fileLogger(data: unknown, filePath: string, errorCallback?: unknown): void {\n  const dataString = typeof data === 'object' ? JSON.stringify(data) : String(data);\n  fs.appendFile(filePath, `${dataString}\\n`, (err) => {\n    if (err && typeof errorCallback === 'function') {\n      return errorCallback(err);\n    }\n\n    if (err) {\n      console.error('Failed to write to file:', err);\n      throw err;\n    }\n  });\n}\n","import { LoggerOptions } from '../types/logger.type';\nimport { consoleLogger, ignoreLogger } from '../utils/logger.util';\n\n/**\n * Lớp dịch vụ xử lý log cho VNPay\n * @en Logger service class for VNPay\n */\nexport class LoggerService {\n  private isEnabled = false;\n  private readonly loggerFn: (data: unknown) => void = ignoreLogger;\n\n  /**\n   * Khởi tạo dịch vụ logger\n   * @en Initialize logger service\n   *\n   * @param isEnabled - Cho phép log hay không\n   * @en @param isEnabled - Enable logging or not\n   *\n   * @param customLoggerFn - Hàm logger tùy chỉnh\n   * @en @param customLoggerFn - Custom logger function\n   */\n  constructor(isEnabled = false, customLoggerFn?: (data: unknown) => void) {\n    this.isEnabled = isEnabled;\n    this.loggerFn = customLoggerFn || (isEnabled ? consoleLogger : ignoreLogger);\n  }\n\n  /**\n   * Ghi log dữ liệu\n   * @en Log data\n   *\n   * @param data - Dữ liệu cần log\n   * @en @param data - Data to log\n   *\n   * @param options - Tùy chọn log\n   * @en @param options - Logging options\n   *\n   * @param methodName - Tên phương thức gọi log\n   * @en @param methodName - Method name that calls the log\n   */\n  public log<T extends object, LoggerFields extends keyof T>(\n    data: T,\n    options?: LoggerOptions<T, LoggerFields>,\n    methodName?: string,\n  ): void {\n    if (!this.isEnabled) return;\n\n    const logData = { ...data };\n\n    if (methodName) {\n      Object.assign(logData, { method: methodName, createdAt: new Date() });\n    }\n\n    if (options?.logger && 'fields' in options.logger) {\n      const { type, fields } = options.logger;\n\n      for (const key of Object.keys(logData)) {\n        const keyAssert = key as unknown as LoggerFields;\n        if ((type === 'omit' && fields.includes(keyAssert)) || (type === 'pick' && !fields.includes(keyAssert))) {\n          delete logData[keyAssert];\n        }\n      }\n    }\n\n    // Execute logger function\n    (options?.logger?.loggerFn || this.loggerFn)(logData);\n  }\n}\n","import type { VnpLocale } from '../enums';\n\nexport const WRONG_CHECKSUM_KEY = 'WRONG_CHECKSUM_KEY';\n\nexport const RESPONSE_MAP = new Map<string, Record<VnpLocale, string>>([\n  ['00', { vn: 'Giao dịch thành công', en: 'Approved' }],\n  ['01', { vn: 'Giao dịch đã tồn tại', en: 'Transaction is already exist' }],\n  [\n    '02',\n    {\n      vn: 'Merchant không hợp lệ (kiểm tra lại vnp_TmnCode)',\n      en: 'Invalid merchant (check vnp_TmnCode value)',\n    },\n  ],\n  [\n    '03',\n    {\n      vn: 'Dữ liệu gửi sang không đúng định dạng',\n      en: 'Sent data is not in the right format',\n    },\n  ],\n  [\n    '04',\n    {\n      vn: 'Khởi tạo GD không thành công do Website đang bị tạm khoá',\n      en: 'Payment website is not available',\n    },\n  ],\n  [\n    '05',\n    {\n      vn: 'Giao dịch không thành công do: Quý khách nhập sai mật khẩu thanh toán quá số lần quy định. Xin quý khách vui lòng thực hiện lại giao dịch',\n      en: 'Transaction failed: Too many wrong password input',\n    },\n  ],\n  [\n    '06',\n    {\n      vn: 'Giao dịch không thành công do Quý khách nhập sai mật khẩu xác thực giao dịch (OTP). Xin quý khách vui lòng thực hiện lại giao dịch.',\n      en: 'Transaction failed: Wrong OTP input',\n    },\n  ],\n  [\n    '07',\n    {\n      vn: 'Trừ tiền thành công. Giao dịch bị nghi ngờ (liên quan tới lừa đảo, giao dịch bất thường). Đối với giao dịch này cần merchant xác nhận thông qua merchant admin: Từ chối/Đồng ý giao dịch',\n      en: 'This transaction is suspicious',\n    },\n  ],\n  [\n    '08',\n    {\n      vn: 'Giao dịch không thành công do: Hệ thống Ngân hàng đang bảo trì. Xin quý khách tạm thời không thực hiện giao dịch bằng thẻ/tài khoản của Ngân hàng này.',\n      en: 'Transaction failed: The banking system is under maintenance. Please do not temporarily make transactions by card / account of this Bank.',\n    },\n  ],\n  [\n    '09',\n    {\n      vn: 'Giao dịch không thành công do: Thẻ/Tài khoản của khách hàng chưa đăng ký dịch vụ InternetBanking tại ngân hàng.',\n      en: 'Transaction failed: Cards / accounts of customer who has not yet registered for Internet Banking service.',\n    },\n  ],\n  [\n    '10',\n    {\n      vn: 'Giao dịch không thành công do: Khách hàng xác thực thông tin thẻ/tài khoản không đúng quá 3 lần',\n      en: 'Transaction failed: Customer incorrectly validate the card / account information more than 3 times',\n    },\n  ],\n  [\n    '11',\n    {\n      vn: 'Giao dịch không thành công do: Đã hết hạn chờ thanh toán. Xin quý khách vui lòng thực hiện lại giao dịch.',\n      en: 'Transaction failed: Pending payment is expired. Please try again.',\n    },\n  ],\n  [\n    '24',\n    {\n      vn: 'Giao dịch không thành công do: Khách hàng hủy giao dịch',\n      en: 'Transaction canceled',\n    },\n  ],\n  [\n    '51',\n    {\n      vn: 'Giao dịch không thành công do: Tài khoản của quý khách không đủ số dư để thực hiện giao dịch.',\n      en: 'Transaction failed: Your account is not enough balance to make the transaction.',\n    },\n  ],\n  [\n    '65',\n    {\n      vn: 'Giao dịch không thành công do: Tài khoản của Quý khách đã vượt quá hạn mức giao dịch trong ngày.',\n      en: 'Transaction failed: Your account has exceeded the daily limit.',\n    },\n  ],\n  [\n    '75',\n    {\n      vn: 'Ngân hàng thanh toán đang bảo trì',\n      en: 'Banking system is under maintenance',\n    },\n  ],\n  [WRONG_CHECKSUM_KEY, { vn: 'Sai checksum', en: 'Wrong checksum' }],\n  ['default', { vn: 'Giao dịch thất bại', en: 'Failure' }],\n]);\n\nexport const QUERY_DR_RESPONSE_MAP = new Map<string, Record<VnpLocale, string>>([\n  ['00', { vn: 'Yêu cầu thành công', en: 'Success' }],\n  [\n    '02',\n    {\n      vn: 'Mã định danh kết nối không hợp lệ (kiểm tra lại TmnCode)',\n      en: 'Invalid connection identifier (check TmnCode)',\n    },\n  ],\n  [\n    '03',\n    {\n      vn: 'Dữ liệu gửi sang không đúng định dạng',\n      en: 'Sent data is not in the right format',\n    },\n  ],\n  [\n    '91',\n    {\n      vn: 'Không tìm thấy giao dịch yêu cầu',\n      en: 'Transaction not found for request',\n    },\n  ],\n  [\n    '94',\n    {\n      vn: 'Yêu cầu trùng lặp, duplicate request trong thời gian giới hạn của API',\n      en: 'Duplicate request within the time limit of the API',\n    },\n  ],\n  [\n    '97',\n    {\n      vn: 'Checksum không hợp lệ',\n      en: 'Invalid checksum',\n    },\n  ],\n  [\n    '99',\n    {\n      vn: 'Các lỗi khác (lỗi còn lại, không có trong danh sách mã lỗi đã liệt kê)',\n      en: 'Other errors (remaining errors, not in the list of error codes listed)',\n    },\n  ],\n  [WRONG_CHECKSUM_KEY, { vn: 'Sai checksum', en: 'Wrong checksum' }],\n  ['default', { vn: 'Giao dịch thất bại', en: 'Failure' }],\n]);\n\nexport const REFUND_RESPONSE_MAP = new Map<string, Record<VnpLocale, string>>([\n  ['00', { vn: 'Yêu cầu thành công', en: 'Success' }],\n  [\n    '02',\n    {\n      vn: 'Mã định danh kết nối không hợp lệ (kiểm tra lại TmnCode)',\n      en: 'Invalid connection identifier (check TmnCode)',\n    },\n  ],\n  [\n    '03',\n    {\n      vn: 'Dữ liệu gửi sang không đúng định dạng',\n      en: 'Sent data is not in the right format',\n    },\n  ],\n  [\n    '91',\n    {\n      vn: 'Không tìm thấy giao dịch yêu cầu hoàn trả',\n      en: 'Transaction not found for request refund',\n    },\n  ],\n  [\n    '94',\n    {\n      vn: 'Giao dịch đã được gửi yêu cầu hoàn tiền trước đó. Yêu cầu này VNPAY đang xử lý',\n      en: 'The transaction has been sent a refund request before. VNPAY is processing this request',\n    },\n  ],\n  [\n    '95',\n    {\n      vn: 'Giao dịch này không thành công bên VNPAY. VNPAY từ chối xử lý yêu cầu',\n      en: 'This transaction is not successful from VNPAY. VNPAY refuses to process the request',\n    },\n  ],\n  [\n    '97',\n    {\n      vn: 'Checksum không hợp lệ',\n      en: 'Invalid checksum',\n    },\n  ],\n  [\n    '99',\n    {\n      vn: 'Các lỗi khác (lỗi còn lại, không có trong danh sách mã lỗi đã liệt kê)',\n      en: 'Other errors (remaining errors, not in the list of error codes listed)',\n    },\n  ],\n  [WRONG_CHECKSUM_KEY, { vn: 'Sai checksum', en: 'Wrong checksum' }],\n  ['default', { vn: 'Giao dịch thất bại', en: 'Failure' }],\n]);\n\nexport const TRANSACTION_STATUS_RESPONSE_MAP = new Map<string, Record<VnpLocale, string>>([\n  ['00', { vn: 'Giao dịch thanh toán thành công', en: 'Payment transaction successful' }],\n  ['01', { vn: 'Giao dịch chưa hoàn tất', en: 'Transaction not completed' }],\n  [\n    '02',\n    {\n      vn: 'Giao dịch bị lỗi',\n      en: 'Transaction error',\n    },\n  ],\n  [\n    '04',\n    {\n      vn: 'Giao dịch đảo (Khách hàng đã bị trừ tiền tại Ngân hàng nhưng GD chưa thành công ở VNPAY)',\n      en: 'Transaction reverse (Customer has been deducted money at the Bank but the transaction is not successful at VNPAY)',\n    },\n  ],\n  [\n    '05',\n    {\n      vn: 'VNPAY đang xử lý giao dịch này (GD hoàn tiền)',\n      en: 'VNPAY is processing this transaction (refund)',\n    },\n  ],\n  [\n    '06',\n    {\n      vn: 'VNPAY đã gửi yêu cầu hoàn tiền sang Ngân hàng (GD hoàn tiền)',\n      en: 'VNPAY has sent a refund request to the Bank (refund)',\n    },\n  ],\n  [\n    '07',\n    {\n      vn: 'Giao dịch bị nghi ngờ gian lận',\n      en: 'Transaction suspected of fraud',\n    },\n  ],\n  [\n    '09',\n    {\n      vn: 'GD Hoàn trả bị từ chối',\n      en: 'Refund transaction is rejected',\n    },\n  ],\n  [WRONG_CHECKSUM_KEY, { vn: 'Sai checksum', en: 'Wrong checksum' }],\n]);\n","export const VNPAY_GATEWAY_SANDBOX_HOST = 'https://sandbox.vnpayment.vn';\n\nexport const PAYMENT_ENDPOINT = 'paymentv2/vpcpay.html';\nexport const QUERY_DR_REFUND_ENDPOINT = 'merchant_webapi/api/transaction';\nexport const GET_BANK_LIST_ENDPOINT = 'qrpayauth/api/merchant/get_bank_list';\n","/**\n * The response must to be sent to VNPAY after receiving the IPN request\n */\nexport type IpnResponse = {\n  RspCode: string;\n  Message: string;\n};\n\nexport const IpnSuccess: IpnResponse = {\n  RspCode: '00',\n  Message: 'Confirm Success',\n};\n\nexport const IpnOrderNotFound: IpnResponse = {\n  RspCode: '01',\n  Message: 'Order not found',\n};\n\nexport const InpOrderAlreadyConfirmed: IpnResponse = {\n  RspCode: '02',\n  Message: 'Order already confirmed',\n};\n\nexport const IpnIpProhibited: IpnResponse = {\n  RspCode: '03',\n  Message: 'IP prohibited',\n};\n\nexport const IpnInvalidAmount: IpnResponse = {\n  RspCode: '04',\n  Message: 'Invalid amount',\n};\n\nexport const IpnFailChecksum: IpnResponse = {\n  RspCode: '97',\n  Message: 'Fail checksum',\n};\n\nexport const IpnUnknownError: IpnResponse = {\n  RspCode: '99',\n  Message: 'Unknown error',\n};\n","export const numberRegex = /^[0-9]+$/;\n","export * from './response-map.constant';\nexport * from './api-endpoint.constant';\nexport * from './ipn-result-for-vnpay.constant';\nexport * from './regex.constant';\n\nexport const VNP_VERSION = '2.1.0';\nexport const VNP_DEFAULT_COMMAND = 'pay';\nexport const CURR_CODE_VND = 'VND';\n","/**\n * @see https://sandbox.vnpayment.vn/apis/docs/loai-hang-hoa/\n */\nexport enum ProductCode {\n  Food_Consumption = '100000',\n  Phone_Tablet = '110000',\n  ElectricAppliance = '120000',\n  Computers_OfficeEquipment = '130000',\n  Electronics_Sound = '140000',\n  Books_Newspapers_Magazines = '150000',\n  Sports_Picnics = '160000',\n  Hotel_Tourism = '170000',\n  Cuisine = '180000',\n  Entertainment_Training = '190000',\n  Fashion = '200000',\n  Health_Beauty = '210000',\n  Mother_Baby = '220000',\n  KitchenUtensils = '230000',\n  Vehicle = '240000',\n  Pay = '250000',\n  AirlineTickets = '250007',\n  CardCode = '260000',\n  Pharmacy_MedicalServices = '270000',\n  Other = 'other',\n}\n","export * from './product-code.enum';\n\nexport enum UrlService {\n  sandbox = 'https://sandbox.vnpayment.vn/paymentv2/vpcpay.html',\n}\n\nexport enum HashAlgorithm {\n  SHA256 = 'SHA256',\n  SHA512 = 'SHA512',\n  MD5 = 'MD5',\n}\n\nexport enum VnpCurrCode {\n  VND = 'VND',\n}\n\nexport enum VnpLocale {\n  VN = 'vn',\n  EN = 'en',\n}\n\nexport enum VnpCardType {\n  ATM = 'ATM',\n  QRCODE = 'QRCODE',\n}\n\nexport enum VnpTransactionType {\n  PAYMENT = '01',\n  FULL_REFUND = '02',\n  PARTIAL_REFUND = '03',\n}\n\nexport enum RefundTransactionType {\n  FULL_REFUND = '02',\n  PARTIAL_REFUND = '03',\n}\n","export function resolveUrlString(host: string, path: string): string {\n  let trimmedHost = host.trim();\n  let trimmedPath = path.trim();\n\n  while (trimmedHost.endsWith('/') || trimmedHost.endsWith('\\\\')) {\n    trimmedHost = trimmedHost.slice(0, -1);\n  }\n  while (trimmedPath.startsWith('/') || trimmedPath.startsWith('\\\\')) {\n    trimmedPath = trimmedPath.slice(1);\n  }\n  return `${trimmedHost}/${trimmedPath}`;\n}\n","import crypto, { type BinaryLike } from 'crypto';\nimport dayjs from 'dayjs';\nimport timezone from 'dayjs/plugin/timezone.js';\nimport utc from 'dayjs/plugin/utc.js';\nimport { RESPONSE_MAP } from '../constants/response-map.constant';\nimport { type HashAlgorithm, VnpLocale } from '../enums';\n\n// Setup plugins\ndayjs.extend(utc);\ndayjs.extend(timezone);\n\nexport function getDateInGMT7(date?: Date): Date {\n  const inputDate = date ?? new Date();\n  const utcDate = dayjs.utc(inputDate);\n  return new Date(utcDate.add(7, 'hour').valueOf());\n}\n\n/**\n * Định dạng lại ngày theo định dạng của VNPay, mặc định là yyyyMMddHHmmss\n * @en Format date to VNPay format, default is yyyyMMddHHmmss\n *\n * @param date date to format\n * @param format format of date\n * @returns formatted date\n */\nexport function dateFormat(date: Date, format = 'yyyyMMddHHmmss'): number {\n  const pad = (n: number) => (n < 10 ? `0${n}` : n).toString();\n  const year = date.getFullYear();\n  const month = pad(date.getMonth() + 1);\n  const day = pad(date.getDate());\n  const hour = pad(date.getHours());\n  const minute = pad(date.getMinutes());\n  const second = pad(date.getSeconds());\n\n  return Number(\n    format\n      .replace('yyyy', year.toString())\n      .replace('MM', month)\n      .replace('dd', day)\n      .replace('HH', hour)\n      .replace('mm', minute)\n      .replace('ss', second),\n  );\n}\n\n/**\n * Parse a vnpay date format number to date\n * @param dateNumber An vnpay date format number\n * @returns Date\n */\nexport function parseDate(dateNumber: number | string, tz: 'utc' | 'local' | 'gmt7' = 'local'): Date {\n  const dateString = dateNumber.toString();\n\n  const _parseInt = Number.parseInt;\n\n  const year = _parseInt(dateString.slice(0, 4));\n  const month = _parseInt(dateString.slice(4, 6)) - 1; // months are 0-indexed in JavaScript\n  const day = _parseInt(dateString.slice(6, 8));\n  const hour = _parseInt(dateString.slice(8, 10));\n  const minute = _parseInt(dateString.slice(10, 12));\n  const second = _parseInt(dateString.slice(12, 14));\n\n  // Create a formatted date string\n  const formattedDate = `${year}-${String(month + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}T${String(hour).padStart(2, '0')}:${String(minute).padStart(2, '0')}:${String(second).padStart(2, '0')}`;\n\n  switch (tz) {\n    case 'utc': {\n      // Create a UTC date\n      return dayjs.utc(formattedDate).toDate();\n    }\n    case 'gmt7': {\n      // For GMT+7, create a date in Asia/Ho_Chi_Minh timezone\n      const localDate = new Date(year, month, day, hour, minute, second);\n      // Clone the date as UTC, then add 7 hours to simulate GMT+7\n      const utcTime = dayjs.utc(localDate);\n      return utcTime.add(7, 'hour').toDate();\n    }\n    // biome-ignore lint/complexity/noUselessSwitchCase: still good to readable\n    case 'local':\n    default:\n      return new Date(year, month, day, hour, minute, second);\n  }\n}\n\n/**\n * Validate if the date is match with format `yyyyMMddHHmmss` or not\n * @param date The date to be validated\n * @returns True if the date is valid, false otherwise\n */\nexport function isValidVnpayDateFormat(date: number): boolean {\n  const dateString = date.toString();\n  const regex = /^\\d{4}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])[0-5][0-9][0-5][0-9]$/;\n  return regex.test(dateString);\n}\n\nexport function generateRandomString(\n  length: number,\n  options?: {\n    onlyNumber?: boolean;\n  },\n) {\n  let result = '';\n  let characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n  if (options?.onlyNumber) {\n    characters = '0123456789';\n  }\n  const charactersLength = characters.length;\n  for (let i = 0; i < length; i++) {\n    result += `${characters[(Math.random() * charactersLength) | 0]}`;\n  }\n  return result;\n}\n\n/**\n * Lấy thông tin response theo mã response\n * @en Get response message by response code\n *\n * @param responseCode response code from VNPay\n * @param locale locale of response text\n * @param responseMap map of response code and response text if you want to custom\n * @returns message of response code\n */\nexport function getResponseByStatusCode(\n  responseCode = '',\n  locale: VnpLocale = VnpLocale.VN,\n  responseMap = RESPONSE_MAP,\n): string {\n  const respondText: Record<VnpLocale, string> =\n    responseMap.get(responseCode) ?? (responseMap.get('default') as Record<VnpLocale, string>);\n\n  return respondText[locale];\n}\n\nexport function hash(secret: string, data: BinaryLike | string | Buffer, algorithm: HashAlgorithm): string {\n  return crypto.createHmac(algorithm, secret).update(data.toString()).digest('hex');\n}\n","import crypto from 'crypto';\nimport { resolveUrlString } from '../../common/utils/http.util';\nimport type { HashAlgorithm } from '../enums';\nimport type { GlobalConfig } from '../types';\n\n/**\n * Hàm tạo các parameter cho query string\n * @en Function to build payment URL search parameters\n */\nexport function buildPaymentUrlSearchParams(data: Record<string, unknown>): URLSearchParams {\n  const params = new URLSearchParams();\n\n  // Sort keys\n  const sortedKeys = Object.keys(data).sort();\n\n  // Add sorted parameters\n  for (const key of sortedKeys) {\n    if (data[key] !== undefined && data[key] !== null && data[key] !== '') {\n      // Encode the key and value to ensure they are URL-safe\n      params.append(key, String(data[key]));\n    }\n  }\n\n  return params;\n}\n\n/**\n * Hàm tạo URL thanh toán dựa trên config và data\n * @en Function to create payment URL based on config and data\n */\nexport function createPaymentUrl({ config, data }: { config: GlobalConfig; data: Record<string, unknown> }): URL {\n  // Use the endpoints.paymentEndpoint if available, or fall back to config.paymentEndpoint for backward compatibility\n  const paymentEndpoint = config.endpoints?.paymentEndpoint || config.paymentEndpoint;\n\n  const redirectUrl = new URL(resolveUrlString(config.vnpayHost, paymentEndpoint as string));\n\n  const searchParams = buildPaymentUrlSearchParams(data);\n  redirectUrl.search = searchParams.toString();\n\n  return redirectUrl;\n}\n\n/**\n * Hàm tính toán mã bảo mật\n * @en Function to calculate secure hash\n */\nexport function calculateSecureHash({\n  secureSecret,\n  data,\n  hashAlgorithm,\n  bufferEncode,\n}: {\n  secureSecret: string;\n  data: string;\n  hashAlgorithm: HashAlgorithm;\n  bufferEncode: BufferEncoding;\n}): string {\n  return crypto.createHmac(hashAlgorithm, secureSecret).update(Buffer.from(data, bufferEncode)).digest('hex');\n}\n\n/**\n * Hàm xác minh mã bảo mật\n * @en Function to verify secure hash\n */\nexport function verifySecureHash({\n  secureSecret,\n  data,\n  hashAlgorithm,\n  receivedHash,\n}: {\n  secureSecret: string;\n  data: string;\n  hashAlgorithm: HashAlgorithm;\n  receivedHash: string;\n}): boolean {\n  const calculatedHash = crypto\n    .createHmac(hashAlgorithm, secureSecret)\n    .update(Buffer.from(data, 'utf-8'))\n    .digest('hex');\n\n  return calculatedHash === receivedHash;\n}\n","import { type HashAlgorithm } from '../enums';\nimport type {\n  BuildPaymentUrl,\n  BuildPaymentUrlLogger,\n  BuildPaymentUrlOptions,\n  DefaultConfig,\n  GlobalConfig,\n} from '../types';\nimport { calculateSecureHash, createPaymentUrl, dateFormat, getDateInGMT7, isValidVnpayDateFormat } from '../utils';\nimport { LoggerService } from '../../common/services/logger.service';\n\nexport class PaymentService {\n  private readonly config: GlobalConfig;\n  private readonly defaultConfig: DefaultConfig;\n  private readonly logger: LoggerService;\n  private readonly hashAlgorithm: HashAlgorithm;\n  private readonly bufferEncode: BufferEncoding = 'utf-8';\n\n  constructor(config: GlobalConfig, logger: LoggerService, hashAlgorithm: HashAlgorithm) {\n    this.config = config;\n    this.hashAlgorithm = hashAlgorithm;\n    this.logger = logger;\n\n    this.defaultConfig = {\n      vnp_TmnCode: config.tmnCode,\n      vnp_Version: config.vnp_Version,\n      vnp_CurrCode: config.vnp_CurrCode,\n      vnp_Locale: config.vnp_Locale,\n      vnp_Command: config.vnp_Command,\n      vnp_OrderType: config.vnp_OrderType,\n    };\n  }\n\n  /**\n   * Phương thức xây dựng, tạo thành url thanh toán của VNPay\n   * @en Build the payment url\n   *\n   * @param {BuildPaymentUrl} data - Thông tin thanh toán\n   * @en @param {BuildPaymentUrl} data - Payment information\n   *\n   * @param {BuildPaymentUrlOptions<LoggerFields>} options - Tùy chọn\n   * @en @param {BuildPaymentUrlOptions<LoggerFields>} options - Options\n   *\n   * @returns {string} - URL thanh toán\n   * @en @returns {string} - Payment URL\n   */\n  public buildPaymentUrl<LoggerFields extends keyof BuildPaymentUrlLogger>(\n    data: BuildPaymentUrl,\n    options?: BuildPaymentUrlOptions<LoggerFields>,\n  ): string {\n    const dataToBuild = {\n      ...this.defaultConfig,\n      ...data,\n\n      // Multiply by 100 to follow VNPay standard\n      vnp_Amount: data.vnp_Amount * 100,\n    };\n\n    if (dataToBuild?.vnp_ExpireDate && !isValidVnpayDateFormat(dataToBuild.vnp_ExpireDate)) {\n      throw new Error('Invalid vnp_ExpireDate format. Use `dateFormat` utility function to format it');\n    }\n\n    if (!isValidVnpayDateFormat(dataToBuild?.vnp_CreateDate ?? 0)) {\n      const timeGMT7 = getDateInGMT7();\n      dataToBuild.vnp_CreateDate = dateFormat(timeGMT7, 'yyyyMMddHHmmss');\n    }\n\n    const redirectUrl = createPaymentUrl({\n      config: this.config,\n      data: dataToBuild,\n    });\n\n    const signed = calculateSecureHash({\n      secureSecret: this.config.secureSecret,\n      data: redirectUrl.search.slice(1).toString(),\n      hashAlgorithm: this.hashAlgorithm,\n      bufferEncode: this.bufferEncode,\n    });\n    redirectUrl.searchParams.append('vnp_SecureHash', signed);\n\n    // Log if enabled\n    const data2Log: BuildPaymentUrlLogger = {\n      createdAt: new Date(),\n      method: 'buildPaymentUrl',\n      paymentUrl: options?.withHash\n        ? redirectUrl.toString()\n        : (() => {\n            const cloneUrl = new URL(redirectUrl.toString());\n            cloneUrl.searchParams.delete('vnp_SecureHash');\n            return cloneUrl.toString();\n          })(),\n      ...dataToBuild,\n    };\n\n    this.logger.log(data2Log, options, 'buildPaymentUrl');\n\n    return redirectUrl.toString();\n  }\n}\n","import { LoggerService } from '../../common/services/logger.service';\nimport { resolveUrlString } from '../../common/utils/http.util';\nimport {\n  QUERY_DR_REFUND_ENDPOINT,\n  QUERY_DR_RESPONSE_MAP,\n  REFUND_RESPONSE_MAP,\n  VNP_VERSION,\n  WRONG_CHECKSUM_KEY,\n} from '../constants';\nimport type { HashAlgorithm } from '../enums';\nimport type {\n  BodyRequestQueryDr,\n  GlobalConfig,\n  QueryDr,\n  QueryDrResponse,\n  QueryDrResponseFromVNPay,\n  QueryDrResponseLogger,\n  QueryDrResponseOptions,\n  Refund,\n  RefundOptions,\n  RefundResponse,\n  RefundResponseFromVNPay,\n  RefundResponseLogger,\n} from '../types';\nimport { getResponseByStatusCode, hash } from '../utils';\n\n/**\n * Dịch vụ truy vấn kết quả và hoàn tiền VNPay\n * @en Query and refund service for VNPay\n */\nexport class QueryService {\n  private readonly config: GlobalConfig;\n  private readonly logger: LoggerService;\n  private readonly hashAlgorithm: HashAlgorithm;\n  private readonly bufferEncode: BufferEncoding = 'utf-8';\n\n  /**\n   * Khởi tạo dịch vụ truy vấn\n   * @en Initialize query service\n   *\n   * @param config - Cấu hình VNPay\n   * @en @param config - VNPay configuration\n   *\n   * @param logger - Dịch vụ logger\n   * @en @param logger - Logger service\n   *\n   * @param hashAlgorithm - Thuật toán băm\n   * @en @param hashAlgorithm - Hash algorithm\n   */\n  constructor(config: GlobalConfig, logger: LoggerService, hashAlgorithm: HashAlgorithm) {\n    this.config = config;\n    this.logger = logger;\n    this.hashAlgorithm = hashAlgorithm;\n  }\n\n  /**\n   * Đây là API để hệ thống merchant truy vấn kết quả thanh toán của giao dịch tại hệ thống VNPAY.\n   * @en This is the API for the merchant system to query the payment result of the transaction at the VNPAY system.\n   *\n   * @param {QueryDr} query - Dữ liệu truy vấn kết quả thanh toán\n   * @en @param {QueryDr} query - The data to query payment result\n   *\n   * @param {QueryDrResponseOptions<LoggerFields>} options - Tùy chọn\n   * @en @param {QueryDrResponseOptions<LoggerFields>} options - Options\n   *\n   * @returns {Promise<QueryDrResponse>} Kết quả truy vấn\n   * @en @returns {Promise<QueryDrResponse>} The query result\n   */\n  public async queryDr<LoggerFields extends keyof QueryDrResponseLogger>(\n    query: QueryDr,\n    options?: QueryDrResponseOptions<LoggerFields>,\n  ): Promise<QueryDrResponse> {\n    const command = 'querydr';\n    const dataQuery = {\n      vnp_Version: this.config.vnp_Version ?? VNP_VERSION,\n      ...query,\n    };\n\n    const queryEndpoint = this.config.endpoints.queryDrRefundEndpoint || QUERY_DR_REFUND_ENDPOINT;\n    const url = new URL(resolveUrlString(this.config.queryDrAndRefundHost || this.config.vnpayHost, queryEndpoint));\n\n    const stringToCreateHash = [\n      dataQuery.vnp_RequestId,\n      dataQuery.vnp_Version,\n      command,\n      this.config.tmnCode,\n      dataQuery.vnp_TxnRef,\n      dataQuery.vnp_TransactionDate,\n      dataQuery.vnp_CreateDate,\n      dataQuery.vnp_IpAddr,\n      dataQuery.vnp_OrderInfo,\n    ]\n      .map(String)\n      .join('|')\n      .replace(/undefined/g, '');\n\n    const requestHashed = hash(\n      this.config.secureSecret,\n      Buffer.from(stringToCreateHash, this.bufferEncode),\n      this.hashAlgorithm,\n    );\n\n    const body: BodyRequestQueryDr = {\n      ...dataQuery,\n      vnp_Command: command,\n      vnp_TmnCode: this.config.tmnCode,\n      vnp_SecureHash: requestHashed,\n    };\n\n    const response = await fetch(url.toString(), {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n      },\n      body: JSON.stringify(body),\n    });\n\n    if (!response.ok) {\n      throw new Error(`HTTP error! status: ${response.status}`);\n    }\n\n    const responseData = (await response.json()) as QueryDrResponseFromVNPay;\n\n    const message = getResponseByStatusCode(\n      responseData.vnp_ResponseCode?.toString() ?? '',\n      this.config.vnp_Locale,\n      QUERY_DR_RESPONSE_MAP,\n    );\n\n    let outputResults = {\n      isVerified: true,\n      isSuccess: responseData.vnp_ResponseCode === '00' || responseData.vnp_ResponseCode === 0,\n      message,\n      ...responseData,\n      vnp_Message: message,\n    };\n\n    const stringToCreateHashOfResponse = [\n      responseData.vnp_ResponseId,\n      responseData.vnp_Command,\n      responseData.vnp_ResponseCode,\n      responseData.vnp_Message,\n      this.config.tmnCode,\n      responseData.vnp_TxnRef,\n      responseData.vnp_Amount,\n      responseData.vnp_BankCode,\n      responseData.vnp_PayDate,\n      responseData.vnp_TransactionNo,\n      responseData.vnp_TransactionType,\n      responseData.vnp_TransactionStatus,\n      responseData.vnp_OrderInfo,\n      responseData.vnp_PromotionCode,\n      responseData.vnp_PromotionAmount,\n    ]\n      .map(String)\n      .join('|')\n      .replace(/undefined/g, '');\n\n    const responseHashed = hash(\n      this.config.secureSecret,\n      Buffer.from(stringToCreateHashOfResponse, this.bufferEncode),\n      this.hashAlgorithm,\n    );\n\n    if (responseData?.vnp_SecureHash && responseHashed !== responseData.vnp_SecureHash) {\n      outputResults = {\n        ...outputResults,\n        isVerified: false,\n        message: getResponseByStatusCode(WRONG_CHECKSUM_KEY, this.config.vnp_Locale, QUERY_DR_RESPONSE_MAP),\n      };\n    }\n\n    const data2Log: QueryDrResponseLogger = {\n      createdAt: new Date(),\n      method: 'queryDr',\n      ...outputResults,\n    };\n\n    this.logger.log(data2Log, options, 'queryDr');\n\n    return outputResults;\n  }\n\n  /**\n   * Đây là API để hệ thống merchant gửi yêu cầu hoàn tiền cho giao dịch qua hệ thống Cổng thanh toán VNPAY.\n   * @en This is the API for the merchant system to refund the transaction at the VNPAY system.\n   *\n   * @param {Refund} data - Dữ liệu yêu cầu hoàn tiền\n   * @en @param {Refund} data - The data to request refund\n   *\n   * @param {RefundOptions<LoggerFields>} options - Tùy chọn\n   * @en @param {RefundOptions<LoggerFields>} options - Options\n   *\n   * @returns {Promise<RefundResponse>} Kết quả hoàn tiền\n   * @en @returns {Promise<RefundResponse>} The refund result\n   */\n  public async refund<LoggerFields extends keyof RefundResponseLogger>(\n    data: Refund,\n    options?: RefundOptions<LoggerFields>,\n  ): Promise<RefundResponse> {\n    const vnp_Command = 'refund';\n    const DEFAULT_TRANSACTION_NO_IF_NOT_EXIST = '0';\n\n    const dataQuery = {\n      ...data,\n      vnp_Command,\n      vnp_Version: this.config.vnp_Version ?? VNP_VERSION,\n      vnp_TmnCode: this.config.tmnCode,\n      vnp_Amount: data.vnp_Amount * 100,\n    };\n\n    const {\n      vnp_Version,\n      vnp_TmnCode,\n      vnp_RequestId,\n      vnp_TransactionType,\n      vnp_TxnRef,\n      vnp_TransactionNo = DEFAULT_TRANSACTION_NO_IF_NOT_EXIST,\n      vnp_TransactionDate,\n      vnp_CreateBy,\n      vnp_CreateDate,\n      vnp_IpAddr,\n      vnp_OrderInfo,\n    } = dataQuery;\n\n    // Use custom endpoint if configured\n    const refundEndpoint = this.config.endpoints.queryDrRefundEndpoint || QUERY_DR_REFUND_ENDPOINT;\n    const url = new URL(resolveUrlString(this.config.queryDrAndRefundHost || this.config.vnpayHost, refundEndpoint));\n\n    const stringToHashOfRequest = [\n      vnp_RequestId,\n      vnp_Version,\n      vnp_Command,\n      vnp_TmnCode,\n      vnp_TransactionType,\n      vnp_TxnRef,\n      dataQuery.vnp_Amount,\n      vnp_TransactionNo,\n      vnp_TransactionDate,\n      vnp_CreateBy,\n      vnp_CreateDate,\n      vnp_IpAddr,\n      vnp_OrderInfo,\n    ]\n      .map(String)\n      .join('|')\n      .replace(/undefined/g, '');\n\n    const requestHashed = hash(\n      this.config.secureSecret,\n      Buffer.from(stringToHashOfRequest, this.bufferEncode),\n      this.hashAlgorithm,\n    );\n\n    const body = {\n      ...dataQuery,\n      vnp_SecureHash: requestHashed,\n    };\n\n    const response = await fetch(url.toString(), {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n      },\n      body: JSON.stringify(body),\n    });\n\n    if (!response.ok) {\n      throw new Error(`HTTP error! status: ${response.status}`);\n    }\n\n    const responseData = (await response.json()) as RefundResponseFromVNPay;\n\n    if (responseData?.vnp_Amount) {\n      responseData.vnp_Amount = responseData.vnp_Amount / 100;\n    }\n\n    const message = getResponseByStatusCode(\n      responseData.vnp_ResponseCode?.toString() ?? '',\n      data?.vnp_Locale ?? this.config.vnp_Locale,\n      REFUND_RESPONSE_MAP,\n    );\n\n    let outputResults = {\n      isVerified: true,\n      isSuccess: responseData.vnp_ResponseCode === '00' || responseData.vnp_ResponseCode === 0,\n      message,\n      ...responseData,\n      vnp_Message: message,\n    };\n\n    // Always check signed hash for response data\n    const stringToCreateHashOfResponse = [\n      responseData.vnp_ResponseId,\n      responseData.vnp_Command,\n      responseData.vnp_ResponseCode,\n      responseData.vnp_Message,\n      responseData.vnp_TmnCode,\n      responseData.vnp_TxnRef,\n      responseData.vnp_Amount,\n      responseData.vnp_BankCode,\n      responseData.vnp_PayDate,\n      responseData.vnp_TransactionNo,\n      responseData.vnp_TransactionType,\n      responseData.vnp_TransactionStatus,\n      responseData.vnp_OrderInfo,\n    ]\n      .map(String)\n      .join('|')\n      .replace(/undefined/g, '');\n\n    const responseHashed = hash(\n      this.config.secureSecret,\n      Buffer.from(stringToCreateHashOfResponse, this.bufferEncode),\n      this.hashAlgorithm,\n    );\n\n    // Signed hash check for response data\n    if (responseData?.vnp_SecureHash && responseHashed !== responseData.vnp_SecureHash) {\n      outputResults = {\n        ...outputResults,\n        isVerified: false,\n        message: getResponseByStatusCode(WRONG_CHECKSUM_KEY, this.config.vnp_Locale, REFUND_RESPONSE_MAP),\n      };\n    }\n\n    const data2Log: RefundResponseLogger = {\n      createdAt: new Date(),\n      method: 'refund',\n      ...outputResults,\n    };\n\n    this.logger.log(data2Log, options, 'refund');\n\n    return outputResults;\n  }\n}\n","import { LoggerService } from '../../common/services/logger.service';\nimport { ignoreLogger } from '../../common/utils/logger.util';\nimport { numberRegex } from '../constants';\nimport type { HashAlgorithm } from '../enums';\nimport type {\n  GlobalConfig,\n  ReturnQueryFromVNPay,\n  VerifyIpnCall,\n  VerifyIpnCallLogger,\n  VerifyIpnCallOptions,\n  VerifyReturnUrl,\n  VerifyReturnUrlLogger,\n  VerifyReturnUrlOptions,\n} from '../types';\nimport { buildPaymentUrlSearchParams, getResponseByStatusCode, verifySecureHash } from '../utils';\n\nexport class VerificationService {\n  private readonly config: GlobalConfig;\n  private readonly logger: LoggerService;\n  private readonly hashAlgorithm: HashAlgorithm;\n\n  constructor(config: GlobalConfig, logger: LoggerService, hashAlgorithm: HashAlgorithm) {\n    this.config = config;\n    this.logger = logger;\n    this.hashAlgorithm = hashAlgorithm;\n  }\n\n  /**\n   * Phương thức xác thực tính đúng đắn của các tham số trả về từ VNPay\n   * @en Method to verify the return url from VNPay\n   *\n   * @param {ReturnQueryFromVNPay} query - Đối tượng dữ liệu trả về từ VNPay\n   * @en @param {ReturnQueryFromVNPay} query - The object of data return from VNPay\n   *\n   * @param {VerifyReturnUrlOptions<LoggerFields>} options - Tùy chọn\n   * @en @param {VerifyReturnUrlOptions<LoggerFields>} options - Options\n   *\n   * @returns {VerifyReturnUrl} Kết quả xác thực\n   * @en @returns {VerifyReturnUrl} The verification result\n   */\n  public verifyReturnUrl<LoggerFields extends keyof VerifyReturnUrlLogger>(\n    query: ReturnQueryFromVNPay,\n    options?: VerifyReturnUrlOptions<LoggerFields>,\n  ): VerifyReturnUrl {\n    // We disable rule unused to make sure we exclude the `vnp_SecureHashType` from `cloneQuery` to not using it\n    // when buildPaymentUrlSearchParams(cloneQuery) and verify it\n    // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n    const { vnp_SecureHash = '', vnp_SecureHashType, ...cloneQuery } = query;\n\n    if (typeof cloneQuery?.vnp_Amount !== 'number') {\n      const isValidAmount = numberRegex.test(cloneQuery?.vnp_Amount ?? '');\n      if (!isValidAmount) {\n        throw new Error('Invalid amount');\n      }\n      cloneQuery.vnp_Amount = Number(cloneQuery.vnp_Amount);\n    }\n\n    const searchParams = buildPaymentUrlSearchParams(cloneQuery);\n    const isVerified = verifySecureHash({\n      secureSecret: this.config.secureSecret,\n      data: searchParams.toString(),\n      hashAlgorithm: this.hashAlgorithm,\n      receivedHash: vnp_SecureHash,\n    });\n\n    let outputResults = {\n      isVerified,\n      isSuccess: cloneQuery.vnp_ResponseCode === '00' || cloneQuery.vnp_ResponseCode === 0,\n      message: getResponseByStatusCode(cloneQuery.vnp_ResponseCode?.toString() ?? '', this.config.vnp_Locale),\n    };\n\n    if (!isVerified) {\n      outputResults = {\n        ...outputResults,\n        message: 'Wrong checksum',\n      };\n    }\n\n    const result = {\n      ...cloneQuery,\n      ...outputResults,\n      vnp_Amount: cloneQuery.vnp_Amount / 100,\n    };\n\n    const data2Log: VerifyReturnUrlLogger = {\n      createdAt: new Date(),\n      method: 'verifyReturnUrl',\n      ...result,\n      vnp_SecureHash: options?.withHash ? vnp_SecureHash : undefined,\n    };\n\n    this.logger.log(data2Log, options, 'verifyReturnUrl');\n\n    return result;\n  }\n\n  /**\n   * Phương thức xác thực tính đúng đắn của lời gọi ipn từ VNPay\n   *\n   * Sau khi nhận được lời gọi, hệ thống merchant cần xác thực dữ liệu nhận được từ VNPay,\n   * kiểm tra đơn hàng có hợp lệ không, kiểm tra số tiền thanh toán có đúng không.\n   *\n   * @en Method to verify the ipn url from VNPay\n   *\n   * After receiving the call, the merchant system needs to verify the data received from VNPay,\n   * check if the order is valid, check if the payment amount is correct.\n   *\n   * @param {ReturnQueryFromVNPay} query - Đối tượng dữ liệu trả về từ VNPay\n   * @en @param {ReturnQueryFromVNPay} query - The object of data return from VNPay\n   *\n   * @param {VerifyIpnCallOptions<LoggerFields>} options - Tùy chọn\n   * @en @param {VerifyIpnCallOptions<LoggerFields>} options - Options\n   *\n   * @returns {VerifyIpnCall} Kết quả xác thực\n   * @en @returns {VerifyIpnCall} The verification result\n   */\n  public verifyIpnCall<LoggerFields extends keyof VerifyIpnCallLogger>(\n    query: ReturnQueryFromVNPay,\n    options?: VerifyIpnCallOptions<LoggerFields>,\n  ): VerifyIpnCall {\n    const hash = query.vnp_SecureHash;\n\n    // Use silent logger to avoid double logging\n    const silentOptions = { logger: { loggerFn: ignoreLogger } };\n    // Fix the 'any' type issue by using a more specific type\n    const result = this.verifyReturnUrl(query, silentOptions as VerifyReturnUrlOptions<keyof VerifyReturnUrlLogger>);\n\n    const data2Log: VerifyIpnCallLogger = {\n      createdAt: new Date(),\n      method: 'verifyIpnCall',\n      ...result,\n      ...(options?.withHash ? { vnp_SecureHash: hash } : {}),\n    };\n\n    this.logger.log(data2Log, options, 'verifyIpnCall');\n\n    return result;\n  }\n}\n","import { LoggerService } from '../../common/services/logger.service';\nimport {\n  GET_BANK_LIST_ENDPOINT,\n  PAYMENT_ENDPOINT,\n  QUERY_DR_REFUND_ENDPOINT,\n  VNPAY_GATEWAY_SANDBOX_HOST,\n  VNP_DEFAULT_COMMAND,\n  VNP_VERSION,\n} from '../constants';\nimport { HashAlgorithm, ProductCode, VnpCurrCode, VnpLocale } from '../enums';\nimport type {\n  Bank,\n  BuildPaymentUrl,\n  BuildPaymentUrlLogger,\n  BuildPaymentUrlOptions,\n  DefaultConfig,\n  EndpointConfig,\n  GlobalConfig,\n  QueryDr,\n  QueryDrResponse,\n  QueryDrResponseLogger,\n  QueryDrResponseOptions,\n  Refund,\n  RefundOptions,\n  RefundResponse,\n  RefundResponseLogger,\n  ReturnQueryFromVNPay,\n  VNPayConfig,\n  VerifyIpnCall,\n  VerifyIpnCallLogger,\n  VerifyIpnCallOptions,\n  VerifyReturnUrl,\n  VerifyReturnUrlLogger,\n  VerifyReturnUrlOptions,\n} from '../types';\nimport { resolveUrlString } from '../../common/utils/http.util';\nimport { PaymentService } from './vnpay-payment.service';\nimport { QueryService } from './vnpay-query.service';\nimport { VerificationService } from './vnpay-verification.service';\n\n/**\n * Lớp hỗ trợ thanh toán qua VNPay\n * @en VNPay class to support VNPay payment\n * @see https://sandbox.vnpayment.vn/apis/docs/thanh-toan-pay/pay.html\n *\n * @example\n * import { VNPay } from 'vnpay';\n *\n * const vnpay = new VNPay({\n *     vnpayHost: 'https://sandbox.vnpayment.vn',\n *     tmnCode: 'TMNCODE',\n *     secureSecret: 'SERCRET',\n *     testMode: true, // optional\n *     hashAlgorithm: 'SHA512', // optional\n *     // Using new endpoints configuration\n *     endpoints: {\n *       paymentEndpoint: 'paymentv2/vpcpay.html',\n *       queryDrRefundEndpoint: 'merchant_webapi/api/transaction',\n *       getBankListEndpoint: 'qrpayauth/api/merchant/get_bank_list',\n *     }\n * });\n *\n * const tnx = '12345678'; // Generate your own transaction code\n * const urlString = vnpay.buildPaymentUrl({\n *     vnp_Amount: 100000,\n *     vnp_IpAddr: '192.168.0.1',\n *     vnp_ReturnUrl: 'http://localhost:8888/order/vnpay_return',\n *     vnp_TxnRef: tnx,\n *     vnp_OrderInfo: `Thanh toan cho ma GD: ${tnx}`,\n * }),\n *\n */\nexport class VNPay {\n  private readonly globalConfig: GlobalConfig;\n  private readonly hashAlgorithm: HashAlgorithm;\n\n  // Service instances\n  private readonly loggerService: LoggerService;\n  private readonly paymentService: PaymentService;\n  private readonly verificationService: VerificationService;\n  private readonly queryService: QueryService;\n\n  /**\n   * Khởi tạo đối tượng VNPay\n   * @en Initialize VNPay instance\n   *\n   * @param {VNPayConfig} config - VNPay configuration\n   */\n  constructor({\n    vnpayHost = VNPAY_GATEWAY_SANDBOX_HOST,\n    queryDrAndRefundHost = VNPAY_GATEWAY_SANDBOX_HOST,\n    vnp_Version = VNP_VERSION,\n    vnp_CurrCode = VnpCurrCode.VND,\n    vnp_Locale = VnpLocale.VN,\n    testMode = false,\n    paymentEndpoint = PAYMENT_ENDPOINT,\n    endpoints = {},\n    ...config\n  }: VNPayConfig) {\n    if (testMode) {\n      vnpayHost = VNPAY_GATEWAY_SANDBOX_HOST;\n      queryDrAndRefundHost = VNPAY_GATEWAY_SANDBOX_HOST;\n    }\n\n    this.hashAlgorithm = config?.hashAlgorithm ?? HashAlgorithm.SHA512;\n\n    // Initialize endpoints with defaults and overrides\n    const initializedEndpoints: EndpointConfig = {\n      paymentEndpoint: endpoints.paymentEndpoint || paymentEndpoint,\n      queryDrRefundEndpoint: endpoints.queryDrRefundEndpoint || QUERY_DR_REFUND_ENDPOINT,\n      getBankListEndpoint: endpoints.getBankListEndpoint || GET_BANK_LIST_ENDPOINT,\n    };\n\n    this.globalConfig = {\n      vnpayHost,\n      vnp_Version,\n      vnp_CurrCode,\n      vnp_Locale,\n      vnp_OrderType: ProductCode.Other,\n      vnp_Command: VNP_DEFAULT_COMMAND,\n      paymentEndpoint: initializedEndpoints.paymentEndpoint as string,\n      endpoints: initializedEndpoints,\n      queryDrAndRefundHost,\n      ...config,\n    };\n\n    this.loggerService = new LoggerService(config?.enableLog ?? false, config?.loggerFn);\n\n    this.paymentService = new PaymentService(this.globalConfig, this.loggerService, this.hashAlgorithm);\n\n    this.verificationService = new VerificationService(this.globalConfig, this.loggerService, this.hashAlgorithm);\n\n    this.queryService = new QueryService(this.globalConfig, this.loggerService, this.hashAlgorithm);\n  }\n\n  /**\n   * Lấy cấu hình mặc định của VNPay\n   * @en Get default config of VNPay\n   *\n   * @returns {DefaultConfig} Cấu hình mặc định\n   * @en @returns {DefaultConfig} Default configuration\n   */\n  public get defaultConfig(): DefaultConfig {\n    return {\n      vnp_TmnCode: this.globalConfig.tmnCode,\n      vnp_Version: this.globalConfig.vnp_Version,\n      vnp_CurrCode: this.globalConfig.vnp_CurrCode,\n      vnp_Locale: this.globalConfig.vnp_Locale,\n      vnp_Command: this.globalConfig.vnp_Command,\n      vnp_OrderType: this.globalConfig.vnp_OrderType,\n    };\n  }\n\n  /**\n   * Lấy danh sách ngân hàng được hỗ trợ bởi VNPay\n   * @en Get list of banks supported by VNPay\n   *\n   * @returns {Promise<Bank[]>} Danh sách ngân hàng\n   * @en @returns {Promise<Bank[]>} List of banks\n   */\n  public async getBankList(): Promise<Bank[]> {\n    const response = await fetch(\n      resolveUrlString(\n        this.globalConfig.vnpayHost ?? VNPAY_GATEWAY_SANDBOX_HOST,\n        this.globalConfig.endpoints.getBankListEndpoint as string,\n      ),\n      {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/x-www-form-urlencoded',\n        },\n        body: `tmn_code=${this.globalConfig.tmnCode}`,\n      },\n    );\n\n    if (!response.ok) {\n      throw new Error(`Failed to fetch bank list: HTTP ${response.status}`);\n    }\n\n    const bankList = (await response.json()) as Bank[];\n\n    for (const bank of bankList) {\n      // Handle logo_link safely - only slice if it starts with a slash\n      const logoPath = bank.logo_link && bank.logo_link.startsWith('/') ? bank.logo_link.slice(1) : bank.logo_link;\n      bank.logo_link = resolveUrlString(this.globalConfig.vnpayHost ?? VNPAY_GATEWAY_SANDBOX_HOST, logoPath);\n    }\n\n    return bankList;\n  }\n\n  /**\n   * Phương thức xây dựng, tạo thành url thanh toán của VNPay\n   * @en Build the payment url\n   *\n   * @param {BuildPaymentUrl} data - Dữ liệu thanh toán cần thiết để tạo URL\n   * @en @param {BuildPaymentUrl} data - Payment data required to create URL\n   *\n   * @param {BuildPaymentUrlOptions<LoggerFields>} options - Tùy chọn bổ sung\n   * @en @param {BuildPaymentUrlOptions<LoggerFields>} options - Additional options\n   *\n   * @returns {string} URL thanh toán\n   * @en @returns {string} Payment URL\n   * @see https://sandbox.vnpayment.vn/apis/docs/thanh-toan-pay/pay.html#tao-url-thanh-toan\n   */\n  public buildPaymentUrl<LoggerFields extends keyof BuildPaymentUrlLogger>(\n    data: BuildPaymentUrl,\n    options?: BuildPaymentUrlOptions<LoggerFields>,\n  ): Promise<string> {\n    return Promise.resolve(this.paymentService.buildPaymentUrl(data, options));\n  }\n\n  /**\n   * Phương thức xác thực tính đúng đắn của các tham số trả về từ VNPay\n   * @en Method to verify the return url from VNPay\n   *\n   * @param {ReturnQueryFromVNPay} query - Đối tượng dữ liệu trả về từ VNPay\n   * @en @param {ReturnQueryFromVNPay} query - The object of data returned from VNPay\n   *\n   * @param {VerifyReturnUrlOptions<LoggerFields>} options - Tùy chọn để xác thực\n   * @en @param {VerifyReturnUrlOptions<LoggerFields>} options - Options for verification\n   *\n   * @returns {VerifyReturnUrl} Kết quả xác thực\n   * @en @returns {VerifyReturnUrl} Verification result\n   * @see https://sandbox.vnpayment.vn/apis/docs/thanh-toan-pay/pay.html#code-returnurl\n   */\n  public verifyReturnUrl<LoggerFields extends keyof VerifyReturnUrlLogger>(\n    query: ReturnQueryFromVNPay,\n    options?: VerifyReturnUrlOptions<LoggerFields>,\n  ): VerifyReturnUrl {\n    return this.verificationService.verifyReturnUrl(query, options);\n  }\n\n  /**\n   * Phương thức xác thực tính đúng đắn của lời gọi ipn từ VNPay\n   *\n   * Sau khi nhận được lời gọi, hệ thống merchant cần xác thực dữ liệu nhận được từ VNPay,\n   * kiểm tra đơn hàng có hợp lệ không, kiểm tra số tiền thanh toán có đúng không.\n   *\n   * Sau đó phản hồi lại VNPay kết quả xác thực thông qua các `IpnResponse`\n   *\n   * @en Method to verify the ipn call from VNPay\n   *\n   * After receiving the call, the merchant system needs to verify the data received from VNPay,\n   * check if the order is valid, check if the payment amount is correct.\n   *\n   * Then respond to VNPay the verification result through `IpnResponse`\n   *\n   * @param {ReturnQueryFromVNPay} query - Đối tượng dữ liệu từ VNPay qua IPN\n   * @en @param {ReturnQueryFromVNPay} query - The object of data from VNPay via IPN\n   *\n   * @param {VerifyIpnCallOptions<LoggerFields>} options - Tùy chọn để xác thực\n   * @en @param {VerifyIpnCallOptions<LoggerFields>} options - Options for verification\n   *\n   * @returns {VerifyIpnCall} Kết quả xác thực\n   * @en @returns {VerifyIpnCall} Verification result\n   * @see https://sandbox.vnpayment.vn/apis/docs/thanh-toan-pay/pay.html#code-ipn-url\n   */\n  public verifyIpnCall<LoggerFields extends keyof VerifyIpnCallLogger>(\n    query: ReturnQueryFromVNPay,\n    options?: VerifyIpnCallOptions<LoggerFields>,\n  ): VerifyIpnCall {\n    return this.verificationService.verifyIpnCall(query, options);\n  }\n\n  /**\n   * Đây là API để hệ thống merchant truy vấn kết quả thanh toán của giao dịch tại hệ thống VNPAY.\n   * @en This is the API for the merchant system to query the payment result of the transaction at the VNPAY system.\n   *\n   * @param {QueryDr} query - Dữ liệu truy vấn kết quả thanh toán\n   * @en @param {QueryDr} query - The data to query payment result\n   *\n   * @param {QueryDrResponseOptions<LoggerFields>} options - Tùy chọn truy vấn\n   * @en @param {QueryDrResponseOptions<LoggerFields>} options - Query options\n   *\n   * @returns {Promise<QueryDrResponse>} Kết quả truy vấn từ VNPay sau khi đã xác thực\n   * @en @returns {Promise<QueryDrResponse>} Query result from VNPay after verification\n   * @see https://sandbox.vnpayment.vn/apis/docs/truy-van-hoan-tien/querydr&refund.html#truy-van-ket-qua-thanh-toan-PAY\n   */\n  public async queryDr<LoggerFields extends keyof QueryDrResponseLogger>(\n    query: QueryDr,\n    options?: QueryDrResponseOptions<LoggerFields>,\n  ): Promise<QueryDrResponse> {\n    return this.queryService.queryDr(query, options);\n  }\n\n  /**\n   * Đây là API để hệ thống merchant gửi yêu cầu hoàn tiền cho giao dịch qua hệ thống Cổng thanh toán VNPAY.\n   * @en This is the API for the merchant system to refund the transaction at the VNPAY system.\n   *\n   * @param {Refund} data - Dữ liệu yêu cầu hoàn tiền\n   * @en @param {Refund} data - The data to request refund\n   *\n   * @param {RefundOptions<LoggerFields>} options - Tùy chọn hoàn tiền\n   * @en @param {RefundOptions<LoggerFields>} options - Refund options\n   *\n   * @returns {Promise<RefundResponse>} Kết quả hoàn tiền từ VNPay sau khi đã xác thực\n   * @en @returns {Promise<RefundResponse>} Refund result from VNPay after verification\n   * @see https://sandbox.vnpayment.vn/apis/docs/truy-van-hoan-tien/querydr&refund.html#hoan-tien-thanh-toan-PAY\n   */\n  public async refund<LoggerFields extends keyof RefundResponseLogger>(\n    data: Refund,\n    options?: RefundOptions<LoggerFields>,\n  ): Promise<RefundResponse> {\n    return this.queryService.refund(data, options);\n  }\n}\n"]}