{"version":3,"sources":["../src/common/utils/logger.util.ts","../src/common/services/logger.service.ts","../src/common/utils/http.util.ts","../src/momo/constants/api-endpoint.constant.ts","../src/momo/constants/request-type.constant.ts","../src/momo/enums/index.ts","../src/momo/constants/response-code.constant.ts","../src/momo/utils/common.util.ts","../src/momo/core/momo-payment.service.ts","../src/momo/core/momo-query.service.ts","../src/momo/core/momo-verification.service.ts","../src/momo/core/index.ts"],"names":["RequestType","MomoLocale","crypto","data"],"mappings":"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","file":"momo.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","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","// Momo API endpoints\nexport const MOMO_GATEWAY_SANDBOX_HOST = \"https://test-payment.momo.vn\";\nexport const MOMO_GATEWAY_PRODUCTION_HOST = \"https://payment.momo.vn\";\n\n// API endpoints\nexport const CREATE_PAYMENT_ENDPOINT = \"/v2/gateway/api/create\";\nexport const QUERY_TRANSACTION_ENDPOINT = \"/v2/gateway/api/query\";\nexport const REFUND_TRANSACTION_ENDPOINT = \"/v2/gateway/api/refund\";\nexport const CONFIRM_TRANSACTION_ENDPOINT = \"/v2/gateway/api/confirm\";\nexport const GET_BANK_LIST_ENDPOINT = \"/v2/gateway/api/bankcodes\";","// Momo partner code\nexport const MOMO_PARTNER_CODE = 'MOMO';\n","// Momo request types\nexport enum RequestType {\n  CAPTURE_WALLET = 'captureWallet', // Thanh toán ví Momo\n  PAY_WITH_ATM = 'payWithATM', // Thanh toán qua thẻ ATM\n  PAY_WITH_CREDIT = 'payWithCredit', // Thanh toán qua thẻ tín dụng\n  PAY_WITH_METHOD = 'payWithMethod', // Thanh toán với nhiều phương thức\n}\n\n// Momo language\nexport enum MomoLocale {\n  VI = 'vi',\n  EN = 'en',\n}\n","import { MomoLocale } from '../enums';\n\n// Momo response codes mapping\nexport const MomoResponseCode = {\n  SUCCESS: 0, // Thành công\n\n  SYSTEM_MAINTENANCE: 10, // Hệ thống đang được bảo trì\n  ACCESS_DENIED: 11, // Truy cập bị từ chối\n  UNSUPPORTED_API_VERSION: 12, // Phiên bản API không được hỗ trợ cho yêu cầu này\n  BUSINESS_AUTHENTICATION_FAILED: 13, // Xác thực doanh nghiệp thất bại\n\n  INVALID_REQUEST: 20, // Yêu cầu sai định dạng\n  INVALID_AMOUNT_CHECK: 21, // Yêu cầu kiểm tra số tiền giao dịch không hợp lệ\n  INVALID_PAYMENT_DATA: 22, // Dữ liệu/ thông tin thanh toán không hợp lệ\n\n  INVALID_PARAMETER: 40, // Request bị từ chối vì tham số không hợp lệ\n  DUPLICATE_ORDER_ID: 41, // orderId bị trùng\n  ORDER_ID_NOT_FOUND_OR_INVALID: 42, // orderId không hợp lệ hoặc không được tìm thấy\n  CONFLICT_REQUEST: 43, // Yêu cầu bị từ chối vì xung đột trong quá trình xử lý giao dịch\n  DUPLICATE_ITEM_ID: 45, // Trùng itemId\n  INVALID_DATA_IN_LIST: 47, // Yêu cầu bị từ chối vì thông tin không hợp lệ trong danh sách dữ liệu\n\n  QR_CREATE_FAILED: 98, // QR Code tạo không thành công\n  UNKNOWN_ERROR: 99, // Lỗi không xác định\n\n  TRANSACTION_CREATED_WAITING_USER: 1000, // Giao dịch đã được khởi tạo, chờ người dùng thanh toán\n  INSUFFICIENT_BALANCE: 1001, // Giao dịch thất bại do tài khoản người dùng không đủ tiền\n  DECLINED_BY_ISSUER: 1002, // Giao dịch bị từ chối do nhà phát hành tài khoản thanh toán\n  CANCELLED_BY_MERCHANT_OR_TIMEOUT: 1003, // Giao dịch bị hủy bởi doanh nghiệp hoặc do timeout\n  EXCEED_USER_AMOUNT_LIMIT: 1004, // Giao dịch thất bại do số tiền thanh toán vượt quá hạn mức\n  QR_EXPIRED: 1005, // Giao dịch thất bại do QR code đã hết hạn\n  USER_REJECTED_PAYMENT: 1006, // Giao dịch thất bại do người dùng từ chối xác nhận thanh toán\n  ACCOUNT_NOT_EXIST_OR_SUSPENDED: 1007, // Tài khoản không tồn tại hoặc đang tạm ngưng\n\n  CANCELLED_BY_PARTNER: 1017, // Giao dịch bị hủy bởi đối tác\n\n  INVALID_PROMOTION_RULE: 1026, // Giao dịch không hợp lệ theo thể lệ chương trình khuyến mãi\n\n  REFUND_FAILED: 1080, // Giao dịch hoàn tiền thất bại\n  REFUND_DECLINED_OR_EXCEED_ORIGINAL: 1081, // Giao dịch hoàn tiền bị từ chối / vượt quá số tiền cho phép\n  REFUND_NOT_SUPPORTED: 1088, // Giao dịch hoàn tiền bị từ chối vì không được hỗ trợ\n\n  INVALID_ORDER_GROUP_ID: 2019, // Yêu cầu bị từ chối vì orderGroupId không hợp lệ\n\n  ACCOUNT_LOCKED: 4001, // Giao dịch bị từ chối do tài khoản người dùng đang bị khóa\n  ACCOUNT_NOT_VERIFIED: 4002, // Giao dịch bị từ chối do tài khoản người dùng chưa được xác thực\n\n  USER_LOGIN_FAILED: 4100, // Giao dịch thất bại do người dùng không đăng nhập thành công\n\n  TRANSACTION_PROCESSING: 7000, // Giao dịch đang được xử lý\n  TRANSACTION_PROCESSING_BY_PROVIDER: 7002, // Giao dịch đang được xử lý bởi nhà cung cấp thanh toán\n\n  FINAL_SUCCESS: 9000, // Giao dịch đã được xác nhận thành công\n} as const;\n\nexport const RESPONSE_MAP = new Map<number, Record<MomoLocale, string>>([\n  [\n    MomoResponseCode.SUCCESS,\n    {\n      [MomoLocale.VI]: 'Giao dịch thành công',\n      [MomoLocale.EN]: 'Transaction successful',\n    },\n  ],\n  [\n    MomoResponseCode.SYSTEM_MAINTENANCE,\n    {\n      [MomoLocale.VI]: 'Hệ thống đang được bảo trì',\n      [MomoLocale.EN]: 'System under maintenance',\n    },\n  ],\n  [\n    MomoResponseCode.ACCESS_DENIED,\n    {\n      [MomoLocale.VI]: 'Truy cập bị từ chối',\n      [MomoLocale.EN]: 'Access denied',\n    },\n  ],\n  [\n    MomoResponseCode.UNSUPPORTED_API_VERSION,\n    {\n      [MomoLocale.VI]: 'Phiên bản API không được hỗ trợ cho yêu cầu này',\n      [MomoLocale.EN]: 'API version is not supported for this request',\n    },\n  ],\n  [\n    MomoResponseCode.BUSINESS_AUTHENTICATION_FAILED,\n    {\n      [MomoLocale.VI]: 'Xác thực doanh nghiệp thất bại',\n      [MomoLocale.EN]: 'Business authentication failed',\n    },\n  ],\n\n  [\n    MomoResponseCode.INVALID_REQUEST,\n    {\n      [MomoLocale.VI]: 'Yêu cầu sai định dạng',\n      [MomoLocale.EN]: 'Invalid request format',\n    },\n  ],\n  [\n    MomoResponseCode.INVALID_AMOUNT_CHECK,\n    {\n      [MomoLocale.VI]: 'Yêu cầu kiểm tra số tiền giao dịch không hợp lệ',\n      [MomoLocale.EN]: 'Invalid transaction amount check request',\n    },\n  ],\n  [\n    MomoResponseCode.INVALID_PAYMENT_DATA,\n    {\n      [MomoLocale.VI]: 'Dữ liệu/thông tin thanh toán không hợp lệ',\n      [MomoLocale.EN]: 'Invalid payment data',\n    },\n  ],\n\n  [\n    MomoResponseCode.INVALID_PARAMETER,\n    {\n      [MomoLocale.VI]: 'Request bị từ chối vì tham số không hợp lệ',\n      [MomoLocale.EN]: 'Request rejected due to invalid parameter',\n    },\n  ],\n  [\n    MomoResponseCode.DUPLICATE_ORDER_ID,\n    {\n      [MomoLocale.VI]: 'Mã đơn hàng (orderId) bị trùng',\n      [MomoLocale.EN]: 'Duplicate orderId',\n    },\n  ],\n  [\n    MomoResponseCode.ORDER_ID_NOT_FOUND_OR_INVALID,\n    {\n      [MomoLocale.VI]: 'orderId không hợp lệ hoặc không được tìm thấy',\n      [MomoLocale.EN]: 'orderId is invalid or not found',\n    },\n  ],\n  [\n    MomoResponseCode.CONFLICT_REQUEST,\n    {\n      [MomoLocale.VI]: 'Yêu cầu bị từ chối vì xung đột trong quá trình xử lý giao dịch',\n      [MomoLocale.EN]: 'Request rejected due to processing conflict',\n    },\n  ],\n  [\n    MomoResponseCode.DUPLICATE_ITEM_ID,\n    {\n      [MomoLocale.VI]: 'Trùng itemId',\n      [MomoLocale.EN]: 'Duplicate itemId',\n    },\n  ],\n  [\n    MomoResponseCode.INVALID_DATA_IN_LIST,\n    {\n      [MomoLocale.VI]: 'Thông tin không hợp lệ trong danh sách dữ liệu',\n      [MomoLocale.EN]: 'Invalid data in list',\n    },\n  ],\n\n  [\n    MomoResponseCode.QR_CREATE_FAILED,\n    {\n      [MomoLocale.VI]: 'QR Code tạo không thành công',\n      [MomoLocale.EN]: 'QR Code creation failed',\n    },\n  ],\n  [\n    MomoResponseCode.UNKNOWN_ERROR,\n    {\n      [MomoLocale.VI]: 'Lỗi không xác định',\n      [MomoLocale.EN]: 'Unknown error',\n    },\n  ],\n\n  [\n    MomoResponseCode.TRANSACTION_CREATED_WAITING_USER,\n    {\n      [MomoLocale.VI]: 'Giao dịch đã được khởi tạo, chờ người dùng thanh toán',\n      [MomoLocale.EN]: 'Transaction created, waiting for user payment',\n    },\n  ],\n  [\n    MomoResponseCode.INSUFFICIENT_BALANCE,\n    {\n      [MomoLocale.VI]: 'Tài khoản người dùng không đủ số dư',\n      [MomoLocale.EN]: 'Insufficient balance',\n    },\n  ],\n  [\n    MomoResponseCode.DECLINED_BY_ISSUER,\n    {\n      [MomoLocale.VI]: 'Giao dịch bị từ chối do nhà phát hành tài khoản thanh toán',\n      [MomoLocale.EN]: 'Transaction declined by issuer',\n    },\n  ],\n  [\n    MomoResponseCode.CANCELLED_BY_MERCHANT_OR_TIMEOUT,\n    {\n      [MomoLocale.VI]: 'Giao dịch bị hủy bởi doanh nghiệp hoặc do hết thời gian (timeout)',\n      [MomoLocale.EN]: 'Transaction cancelled by merchant or timed out',\n    },\n  ],\n  [\n    MomoResponseCode.EXCEED_USER_AMOUNT_LIMIT,\n    {\n      [MomoLocale.VI]: 'Số tiền thanh toán vượt quá hạn mức của người dùng',\n      [MomoLocale.EN]: 'Payment amount exceeds user limit',\n    },\n  ],\n  [\n    MomoResponseCode.QR_EXPIRED,\n    {\n      [MomoLocale.VI]: 'QR code đã hết hạn',\n      [MomoLocale.EN]: 'QR code expired',\n    },\n  ],\n  [\n    MomoResponseCode.USER_REJECTED_PAYMENT,\n    {\n      [MomoLocale.VI]: 'Người dùng từ chối xác nhận thanh toán',\n      [MomoLocale.EN]: 'User rejected payment',\n    },\n  ],\n  [\n    MomoResponseCode.ACCOUNT_NOT_EXIST_OR_SUSPENDED,\n    {\n      [MomoLocale.VI]: 'Tài khoản không tồn tại hoặc đang tạm ngưng',\n      [MomoLocale.EN]: 'Account does not exist or is suspended',\n    },\n  ],\n\n  [\n    MomoResponseCode.CANCELLED_BY_PARTNER,\n    {\n      [MomoLocale.VI]: 'Giao dịch bị hủy bởi đối tác',\n      [MomoLocale.EN]: 'Transaction cancelled by partner',\n    },\n  ],\n\n  [\n    MomoResponseCode.INVALID_PROMOTION_RULE,\n    {\n      [MomoLocale.VI]: 'Giao dịch không hợp lệ theo thể lệ chương trình khuyến mãi',\n      [MomoLocale.EN]: 'Transaction invalid under promotion rules',\n    },\n  ],\n\n  [\n    MomoResponseCode.REFUND_FAILED,\n    {\n      [MomoLocale.VI]: 'Giao dịch hoàn tiền thất bại',\n      [MomoLocale.EN]: 'Refund failed',\n    },\n  ],\n  [\n    MomoResponseCode.REFUND_DECLINED_OR_EXCEED_ORIGINAL,\n    {\n      [MomoLocale.VI]: 'Giao dịch hoàn tiền bị từ chối hoặc vượt quá số tiền cho phép',\n      [MomoLocale.EN]: 'Refund declined or exceeds allowed/original amount',\n    },\n  ],\n  [\n    MomoResponseCode.REFUND_NOT_SUPPORTED,\n    {\n      [MomoLocale.VI]: 'Giao dịch hoàn tiền không được hỗ trợ',\n      [MomoLocale.EN]: 'Refund not supported',\n    },\n  ],\n\n  [\n    MomoResponseCode.INVALID_ORDER_GROUP_ID,\n    {\n      [MomoLocale.VI]: 'orderGroupId không hợp lệ',\n      [MomoLocale.EN]: 'Invalid orderGroupId',\n    },\n  ],\n\n  [\n    MomoResponseCode.ACCOUNT_LOCKED,\n    {\n      [MomoLocale.VI]: 'Tài khoản người dùng đang bị khóa',\n      [MomoLocale.EN]: 'User account is locked',\n    },\n  ],\n  [\n    MomoResponseCode.ACCOUNT_NOT_VERIFIED,\n    {\n      [MomoLocale.VI]: 'Tài khoản người dùng chưa được xác thực',\n      [MomoLocale.EN]: 'User account not verified',\n    },\n  ],\n\n  [\n    MomoResponseCode.USER_LOGIN_FAILED,\n    {\n      [MomoLocale.VI]: 'Người dùng không đăng nhập thành công',\n      [MomoLocale.EN]: 'User login failed',\n    },\n  ],\n\n  [\n    MomoResponseCode.TRANSACTION_PROCESSING,\n    {\n      [MomoLocale.VI]: 'Giao dịch đang được xử lý',\n      [MomoLocale.EN]: 'Transaction is processing',\n    },\n  ],\n  [\n    MomoResponseCode.TRANSACTION_PROCESSING_BY_PROVIDER,\n    {\n      [MomoLocale.VI]: 'Giao dịch đang được xử lý bởi nhà cung cấp thanh toán',\n      [MomoLocale.EN]: 'Transaction is processing by payment provider',\n    },\n  ],\n\n  [\n    MomoResponseCode.FINAL_SUCCESS,\n    {\n      [MomoLocale.VI]: 'Giao dịch đã được xác nhận thành công',\n      [MomoLocale.EN]: 'Transaction has been finally confirmed as successful',\n    },\n  ],\n]);\n","import crypto from 'crypto';\nimport { BuildPaymentUrl, GlobalConfig, QueryDr, Refund, ReturnQueryFromMomo } from '../types';\nimport { MomoLocale } from '../enums';\nimport { RESPONSE_MAP } from '../constants';\n\n/**\n * Tạo chữ ký HMAC-SHA256 cho Momo\n * @en Generate HMAC-SHA256 signature for Momo\n *\n * @param {string} secretKey - Secret key từ Momo\n * @param {string} rawSignature - Chuỗi raw signature cần mã hóa\n * @returns {string} - Chữ ký đã được mã hóa\n */\nexport function generateSignature(secretKey: string, rawSignature: string): string {\n  return crypto.createHmac('sha256', secretKey).update(rawSignature).digest('hex');\n}\n\n/**\n * Xây dựng raw signature cho payment request\n * @en Build raw signature for payment request\n *\n * @param {Object} data - Dữ liệu để tạo signature\n * @returns {string} - Raw signature string\n */\nexport function buildPaymentRawSignature(\n  data: Omit<BuildPaymentUrl, 'lang' | 'autoCapture' | 'orderGroupId'> &\n    Pick<GlobalConfig, 'partnerCode' | 'accessKey'>,\n): string {\n  const { accessKey, amount, extraData, ipnUrl, orderId, orderInfo, partnerCode, redirectUrl, requestId, requestType } =\n    data;\n\n  return (\n    'accessKey=' +\n    accessKey +\n    '&amount=' +\n    amount +\n    '&extraData=' +\n    extraData +\n    '&ipnUrl=' +\n    ipnUrl +\n    '&orderId=' +\n    orderId +\n    '&orderInfo=' +\n    orderInfo +\n    '&partnerCode=' +\n    partnerCode +\n    '&redirectUrl=' +\n    redirectUrl +\n    '&requestId=' +\n    requestId +\n    '&requestType=' +\n    requestType\n  );\n}\n\n/**\n * Xây dựng raw signature cho query transaction\n * @en Build raw signature for query transaction\n *\n * @param {Object} data - Dữ liệu để tạo signature\n * @returns {string} - Raw signature string\n */\nexport function buildQueryRawSignature(\n  data: Pick<GlobalConfig, 'accessKey' | 'partnerCode'> & Pick<QueryDr, 'orderId' | 'requestId'>,\n): string {\n  const { accessKey, orderId, partnerCode, requestId } = data;\n\n  return 'accessKey=' + accessKey + '&orderId=' + orderId + '&partnerCode=' + partnerCode + '&requestId=' + requestId;\n}\n\n/**\n * Xây dựng raw signature cho refund transaction\n * @en Build raw signature for refund transaction\n *\n * @param {Object} data - Dữ liệu để tạo signature\n * @returns {string} - Raw signature string\n */\nexport function buildRefundRawSignature(\n  data: Pick<GlobalConfig, 'accessKey' | 'partnerCode'> &\n    Pick<Refund, 'orderId' | 'requestId' | 'transId' | 'amount' | 'description'>,\n): string {\n  const { accessKey, amount, description = '', orderId, partnerCode, requestId, transId } = data;\n\n  return (\n    'accessKey=' +\n    accessKey +\n    '&amount=' +\n    amount +\n    '&description=' +\n    description +\n    '&orderId=' +\n    orderId +\n    '&partnerCode=' +\n    partnerCode +\n    '&requestId=' +\n    requestId +\n    '&transId=' +\n    transId\n  );\n}\n\n/**\n * Xác thực signature từ Momo callback/IPN\n * @en Verify signature from Momo callback/IPN\n *\n * @param {Object} data - Dữ liệu từ Momo callback\n * @param {string} secretKey - Secret key từ Momo\n * @returns {boolean} - True nếu signature hợp lệ\n */\nexport function verifySignature(data: ReturnQueryFromMomo & Pick<GlobalConfig, 'accessKey'>, secretKey: string) {\n  const {\n    partnerCode,\n    orderId,\n    requestId,\n    amount,\n    orderInfo,\n    orderType,\n    transId,\n    resultCode,\n    message,\n    payType,\n    responseTime,\n    extraData,\n    signature,\n  } = data;\n\n  const rawSignature =\n    'accessKey=' +\n    (data.accessKey || '') +\n    '&amount=' +\n    amount +\n    '&extraData=' +\n    extraData +\n    '&message=' +\n    message +\n    '&orderId=' +\n    orderId +\n    '&orderInfo=' +\n    orderInfo +\n    '&orderType=' +\n    orderType +\n    '&partnerCode=' +\n    partnerCode +\n    '&payType=' +\n    payType +\n    '&requestId=' +\n    requestId +\n    '&responseTime=' +\n    responseTime +\n    '&resultCode=' +\n    resultCode +\n    '&transId=' +\n    transId;\n\n  const calculatedSignature = generateSignature(secretKey, rawSignature);\n  return calculatedSignature === signature;\n}\n\n/**\n * Sắp xếp object theo key (dùng cho việc build query string)\n * @en Sort object by keys (used for building query strings)\n *\n * @param {Object} obj - Object cần sắp xếp\n * @returns {Object} - Object đã được sắp xếp\n */\nexport function sortObject(obj) {\n  const sorted = {};\n  const keys = Object.keys(obj).sort();\n  keys.forEach((key) => {\n    sorted[key] = obj[key];\n  });\n  return sorted;\n}\n\n/**\n * Generate unique orderId for Momo\n * @en Generate unique orderId for Momo\n *\n * @param {string} partnerCode - Partner code\n * @returns {string} - Unique order ID\n */\nexport function generateOrderId(partnerCode: string = 'MOMO'): string {\n  return partnerCode + new Date().getTime();\n}\n\nexport function getResponseByStatusCode(\n  responseCode = 0,\n  locale: MomoLocale = MomoLocale.VI,\n  responseMap = RESPONSE_MAP,\n): string {\n  const respondText: Record<MomoLocale, string> = responseMap.get(responseCode) as Record<MomoLocale, string>; // ?? (responseMap.get('default') as Record<MomoLocale, string>);\n\n  return respondText[locale];\n}\n","import { LoggerService } from '../../common/services/logger.service';\nimport {\n  BuildPaymentUrl,\n  BuildPaymentUrlLogger,\n  BuildPaymentUrlOptions,\n  BuildPaymentUrlResponse,\n  DefaultConfig,\n  GlobalConfig,\n} from '../types';\nimport { buildPaymentRawSignature, generateOrderId, generateSignature } from '../utils';\n\nexport class PaymentService {\n  private readonly config: GlobalConfig;\n  private readonly defaultConfig: DefaultConfig;\n  private readonly logger: LoggerService;\n\n  constructor(config: GlobalConfig, logger: LoggerService) {\n    this.config = config;\n    this.logger = logger;\n\n    this.defaultConfig = {\n      partnerCode: config.partnerCode,\n      storeName: config.storeName || 'Test',\n      storeId: config.storeId || 'MomoTestStore',\n      requestType: config.requestType,\n      lang: config.lang,\n    };\n  }\n\n  async buildPaymentUrl<LoggerFields extends keyof BuildPaymentUrlLogger>(\n    data: BuildPaymentUrl,\n    options?: BuildPaymentUrlOptions<LoggerFields>,\n  ): Promise<string> {\n    const {\n      amount,\n      orderInfo,\n      redirectUrl,\n      ipnUrl,\n      extraData = '',\n      requestType = this.defaultConfig.requestType,\n      orderId = generateOrderId(this.config.partnerCode),\n      requestId = orderId,\n    } = data;\n\n    const dataToBuild = {\n      ...this.defaultConfig,\n      ...data,\n    };\n\n    // Build raw signature\n    const rawSignature = buildPaymentRawSignature({\n      accessKey: this.config.accessKey,\n      amount,\n      extraData,\n      ipnUrl,\n      orderId,\n      orderInfo,\n      partnerCode: this.config.partnerCode,\n      redirectUrl,\n      requestId,\n      requestType,\n    });\n\n    // Generate signature\n    const signature = generateSignature(this.config.secretKey, rawSignature);\n\n    // Build request body\n    const requestBody = JSON.stringify({ ...dataToBuild, signature });\n\n    // Build full URL\n    const url = `https://${this.config.hostname}${this.config.createPaymentEndpoint}`;\n\n    // Return promise to handle async fetch request\n    try {\n      const response = await fetch(url, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n        },\n        body: requestBody,\n      });\n\n      const data = (await response.json()) as BuildPaymentUrlResponse;\n\n      const data2Log: BuildPaymentUrlLogger = {\n        createdAt: new Date(),\n        method: 'buildPaymentUrl',\n        paymentUrl:\n          options?.withHash && redirectUrl\n            ? redirectUrl.toString()\n            : (() => {\n                if (!redirectUrl) return '';\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 data.payUrl;\n    } catch (error) {\n      throw error;\n    }\n  }\n}\n","import { LoggerService } from '../../common/services/logger.service';\nimport { MomoResponseCode } from '../constants';\nimport { MomoLocale } from '../enums';\nimport {\n  BodyRequestQueryDr,\n  BodyRequestRefund,\n  GlobalConfig,\n  QueryDr,\n  QueryDrResponse,\n  QueryDrResponseFromMomo,\n  QueryDrResponseLogger,\n  QueryDrResponseOptions,\n  Refund,\n  RefundOptions,\n  RefundResponse,\n  RefundResponseFromMomo,\n  RefundResponseLogger,\n} from '../types';\nimport {\n  buildQueryRawSignature,\n  buildRefundRawSignature,\n  generateOrderId,\n  generateSignature,\n  getResponseByStatusCode,\n} from '../utils';\n\nexport class QueryService {\n  private readonly config: GlobalConfig;\n  private readonly logger: LoggerService;\n\n  constructor(config: GlobalConfig, logger: LoggerService) {\n    this.config = config;\n    this.logger = logger;\n  }\n\n  public async queryDr<LoggerFields extends keyof QueryDrResponseLogger>(\n    query: QueryDr,\n    options?: QueryDrResponseOptions<LoggerFields>,\n  ): Promise<QueryDrResponse> {\n    const { orderId, requestId = generateOrderId(this.config.partnerCode) } = query;\n\n    // Build raw signature\n    const rawSignature = buildQueryRawSignature({\n      accessKey: this.config.accessKey,\n      orderId,\n      partnerCode: this.config.partnerCode,\n      requestId,\n    });\n\n    // Generate signature\n    const signature = generateSignature(this.config.secretKey, rawSignature);\n\n    // Build request body\n    const requestBody = JSON.stringify({\n      partnerCode: this.config.partnerCode,\n      requestId,\n      orderId,\n      lang: this.config.lang || MomoLocale.VI,\n      signature,\n    } as BodyRequestQueryDr);\n\n    // Build full URL\n    const url = `https://${this.config.hostname}${this.config.queryTransactionEndpoint}`;\n\n    // Return promise to handle async fetch request\n    try {\n      const response = await fetch(url, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n        },\n        body: requestBody,\n      });\n\n      const data = (await response.json()) as QueryDrResponseFromMomo;\n\n      let outputResults = {\n        isVerified: true,\n        isSuccess: data.resultCode === MomoResponseCode.SUCCESS,\n        ...data,\n        // message: getResponseByStatusCode(data.resultCode, this.config.locale),\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    } catch (error) {\n      throw error;\n    }\n  }\n\n  public async refund<LoggerFields extends keyof RefundResponseLogger>(\n    data: Refund,\n    options?: RefundOptions<LoggerFields>,\n  ): Promise<RefundResponse> {\n    const { orderId, amount, transId, description = '', requestId = generateOrderId(this.config.partnerCode) } = data;\n\n    // Build raw signature\n    const rawSignature = buildRefundRawSignature({\n      accessKey: this.config.accessKey,\n      amount,\n      description,\n      orderId,\n      partnerCode: this.config.partnerCode,\n      requestId,\n      transId,\n    });\n\n    // Generate signature\n    const signature = generateSignature(this.config.secretKey, rawSignature);\n\n    // Build request body\n    const requestBody = JSON.stringify({\n      partnerCode: this.config.partnerCode,\n      requestId,\n      orderId,\n      amount,\n      transId,\n      lang: this.config.lang || MomoLocale.VI,\n      description,\n      signature,\n    } as BodyRequestRefund);\n\n    // Build full URL\n    const url = `https://${this.config.hostname}${this.config.refundTransactionEndpoint}`;\n\n    // Return promise to handle async fetch request\n    try {\n      const response = await fetch(url, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n        },\n        body: requestBody,\n      });\n\n      const data = (await response.json()) as RefundResponseFromMomo;\n\n      let outputResults = {\n        isVerified: true,\n        isSuccess: data.resultCode === MomoResponseCode.SUCCESS,\n        ...data,\n        message: getResponseByStatusCode(data.resultCode, this.config.lang),\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    } catch (error) {\n      throw error;\n    }\n  }\n}\n","import { getResponseByStatusCode, verifySignature } from '../utils';\nimport { MomoResponseCode } from '../constants';\nimport {\n  GlobalConfig,\n  ReturnQueryFromMomo,\n  VerifyIpnCall,\n  VerifyIpnCallLogger,\n  VerifyIpnCallOptions,\n  VerifyReturnUrl,\n  VerifyReturnUrlLogger,\n  VerifyReturnUrlOptions,\n} from '../types';\nimport { LoggerService } from '../../common/services/logger.service';\nimport { ignoreLogger } from '../../common/utils/logger.util';\n\nexport class VerificationService {\n  private readonly config: GlobalConfig;\n  private readonly logger: LoggerService;\n\n  constructor(config: GlobalConfig, logger: LoggerService) {\n    this.config = config;\n    this.logger = logger;\n  }\n\n  public verifyReturnUrl<LoggerFields extends keyof VerifyReturnUrlLogger>(\n    query: ReturnQueryFromMomo,\n    options?: VerifyReturnUrlOptions<LoggerFields>,\n  ): VerifyReturnUrl {\n    const { ...cloneQuery } = query;\n    // Verify signature\n    const isVerified = verifySignature({ ...query, accessKey: this.config.accessKey }, this.config.secretKey);\n\n    let outputResults = {\n      isVerified,\n      isSuccess: cloneQuery.resultCode === MomoResponseCode.SUCCESS,\n      message: getResponseByStatusCode(cloneQuery.resultCode, this.config.lang) || cloneQuery.message,\n    };\n\n    if (!isVerified) {\n      outputResults = {\n        ...outputResults,\n        message: 'Wrong checksum',\n      };\n    }\n\n    const result = {\n      ...cloneQuery,\n      ...outputResults,\n    };\n\n    const data2Log: VerifyReturnUrlLogger = {\n      createdAt: new Date(),\n      method: 'verifyReturnUrl',\n      ...result,\n    };\n\n    this.logger.log(data2Log, options, 'verifyReturnUrl');\n\n    return result;\n  }\n\n  public verifyIpnCall<LoggerFields extends keyof VerifyIpnCallLogger>(\n    query: ReturnQueryFromMomo,\n    options?: VerifyIpnCallOptions<LoggerFields>,\n  ): VerifyIpnCall {\n    const silentOptions = { logger: { loggerFn: ignoreLogger } };\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 ? { signature: query.signature } : {}),\n    };\n\n    this.logger.log(data2Log, options, 'verifyIpnCall');\n\n    return result;\n  }\n}\n","import { LoggerService } from '../../common/services/logger.service';\nimport { resolveUrlString } from '../../common/utils/http.util';\nimport {\n  CREATE_PAYMENT_ENDPOINT,\n  GET_BANK_LIST_ENDPOINT,\n  MOMO_GATEWAY_PRODUCTION_HOST,\n  MOMO_GATEWAY_SANDBOX_HOST,\n  MOMO_PARTNER_CODE,\n  QUERY_TRANSACTION_ENDPOINT,\n  REFUND_TRANSACTION_ENDPOINT,\n} from '../constants';\nimport { RequestType } from '../enums';\nimport {\n  BankList,\n  BuildPaymentUrl,\n  BuildPaymentUrlLogger,\n  BuildPaymentUrlOptions,\n  GlobalConfig,\n  MomoConfig,\n  QueryDr,\n  QueryDrResponse,\n  QueryDrResponseLogger,\n  QueryDrResponseOptions,\n  Refund,\n  RefundOptions,\n  RefundResponse,\n  RefundResponseLogger,\n  ReturnQueryFromMomo,\n  VerifyIpnCall,\n  VerifyIpnCallLogger,\n  VerifyIpnCallOptions,\n  VerifyReturnUrl,\n  VerifyReturnUrlLogger,\n  VerifyReturnUrlOptions,\n} from '../types';\nimport { PaymentService } from './momo-payment.service';\nimport { QueryService } from './momo-query.service';\nimport { VerificationService } from './momo-verification.service';\n\nexport class Momo {\n  private readonly globalConfig: GlobalConfig;\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  constructor({\n    partnerCode = MOMO_PARTNER_CODE,\n    accessKey,\n    secretKey,\n    testMode = false,\n    storeName = 'Test',\n    storeId = 'MomoTestStore',\n    requestType = RequestType.PAY_WITH_METHOD,\n    enableLog = false,\n    loggerFn,\n    ...config\n  }: MomoConfig) {\n    // Determine hostname based on test mode\n    const hostname = testMode\n      ? MOMO_GATEWAY_SANDBOX_HOST.replace('https://', '')\n      : MOMO_GATEWAY_PRODUCTION_HOST.replace('https://', '');\n\n    this.globalConfig = {\n      partnerCode,\n      accessKey,\n      secretKey,\n      hostname,\n      storeName,\n      storeId,\n      requestType,\n      createPaymentEndpoint: CREATE_PAYMENT_ENDPOINT,\n      queryTransactionEndpoint: QUERY_TRANSACTION_ENDPOINT,\n      refundTransactionEndpoint: REFUND_TRANSACTION_ENDPOINT,\n      ...config,\n    };\n\n    // Initialize services\n    this.loggerService = new LoggerService(enableLog, loggerFn);\n\n    this.paymentService = new PaymentService(this.globalConfig, this.loggerService);\n\n    this.verificationService = new VerificationService(this.globalConfig, this.loggerService);\n\n    this.queryService = new QueryService(this.globalConfig, this.loggerService);\n  }\n\n  public async getBankList(): Promise<BankList> {\n    const url = resolveUrlString(\n      this.globalConfig.testMode ? MOMO_GATEWAY_SANDBOX_HOST : MOMO_GATEWAY_PRODUCTION_HOST,\n      GET_BANK_LIST_ENDPOINT,\n    );\n\n    const response = await fetch(url, {\n      method: 'GET',\n      headers: {\n        'Content-Type': 'application/json',\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 BankList;\n\n    return bankList;\n  }\n\n  public buildPaymentUrl<LoggerFields extends keyof BuildPaymentUrlLogger>(\n    data: BuildPaymentUrl,\n    options?: BuildPaymentUrlOptions<LoggerFields>,\n  ): Promise<string> {\n    return this.paymentService.buildPaymentUrl(data, options);\n  }\n\n  public verifyReturnUrl<LoggerFields extends keyof VerifyReturnUrlLogger>(\n    query: ReturnQueryFromMomo,\n    options?: VerifyReturnUrlOptions<LoggerFields>,\n  ): VerifyReturnUrl {\n    return this.verificationService.verifyReturnUrl(query, options);\n  }\n\n  public verifyIpnCall<LoggerFields extends keyof VerifyIpnCallLogger>(\n    query: ReturnQueryFromMomo,\n    options?: VerifyIpnCallOptions<LoggerFields>,\n  ): VerifyIpnCall {\n    return this.verificationService.verifyIpnCall(query, options);\n  }\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  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"]}