UNPKG

vnpay

Version:

An open-source nodejs library support to payment with VNPay

1 lines 59.2 kB
{"version":3,"sources":["../src/services/logger.service.ts","../src/services/payment.service.ts","../src/services/query.service.ts","../src/services/verification.service.ts","../src/vnpay.ts"],"names":["ignoreLogger","consoleLogger","__name","getResponseByStatusCode","RESPONSE_MAP","isValidVnpayDateFormat","getDateInGMT7","dateFormat","createPaymentUrl","calculateSecureHash","VNP_VERSION","QUERY_DR_REFUND_ENDPOINT","resolveUrlString","hash","QUERY_DR_RESPONSE_MAP","WRONG_CHECKSUM_KEY","REFUND_RESPONSE_MAP","numberRegex","buildPaymentUrlSearchParams","verifySecureHash","VNPAY_GATEWAY_SANDBOX_HOST","PAYMENT_ENDPOINT","GET_BANK_LIST_ENDPOINT","VNP_DEFAULT_COMMAND"],"mappings":"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","file":"chunk-L7CUEWUR.cjs","sourcesContent":["import type { LoggerOptions } from '../types/logger.type';\nimport { consoleLogger, ignoreLogger } from '../utils';\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 (\n (type === 'omit' && fields.includes(keyAssert)) ||\n (type === 'pick' && !fields.includes(keyAssert))\n ) {\n delete logData[keyAssert];\n }\n }\n }\n\n // Execute logger function\n (options?.logger?.loggerFn || this.loggerFn)(logData);\n }\n}\n","import { RESPONSE_MAP } from '../constants/response-map.constant';\nimport { type HashAlgorithm } from '../enums';\nimport type {\n BuildPaymentUrl,\n BuildPaymentUrlLogger,\n BuildPaymentUrlOptions,\n DefaultConfig,\n GenerateQrResponse,\n GenerateQrResponseLogger,\n GenerateQrResponseOptions,\n GlobalConfig,\n} from '../types';\nimport {\n dateFormat,\n getDateInGMT7,\n getResponseByStatusCode,\n isValidVnpayDateFormat,\n} from '../utils/common';\nimport { calculateSecureHash, createPaymentUrl } from '../utils/payment.util';\nimport type { LoggerService } from './logger.service';\n\n/**\n * Dịch vụ xử lý thanh toán của VNPay\n * @en Payment service for VNPay\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 /**\n * Khởi tạo dịch vụ thanh toán\n * @en Initialize payment 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.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 { url, dataToBuild } = this.buildVnpayUrlInternal(data);\n\n // Log if enabled\n const buildPaymentUrlLogPayload: BuildPaymentUrlLogger = {\n createdAt: new Date(),\n method: 'buildPaymentUrl',\n paymentUrl: options?.withHash\n ? url.toString()\n : (() => {\n const cloneUrl = new URL(url.toString());\n cloneUrl.searchParams.delete('vnp_SecureHash');\n return cloneUrl.toString();\n })(),\n ...dataToBuild,\n };\n\n this.logger.log(buildPaymentUrlLogPayload, options, 'buildPaymentUrl');\n\n return url.toString();\n }\n\n /**\n * Phương thức xây dựng, tạo thành qr thanh toán của VNPay\n * @en Build the qr payment\n *\n * @param {BuildPaymentUrl} data - Thông tin thanh toán\n * @en @param {BuildPaymentUrl} data - Payment information\n *\n * @param {GenerateQrResponseOptions<LoggerFields>} options - Tùy chọn\n * @en @param {GenerateQrResponseOptions<LoggerFields>} options - Options\n *\n * @returns {Promise<GenerateQrResponse>} - Kết quả QR Pay\n * @en @returns {Promise<GenerateQrResponse>} - QR Pay result\n */\n public async generateQr<LoggerFields extends keyof GenerateQrResponseLogger>(\n data: BuildPaymentUrl,\n options?: GenerateQrResponseOptions<LoggerFields>,\n ): Promise<GenerateQrResponse> {\n const { url } = this.buildVnpayUrlInternal(data, { vnp_Command: 'genqr' });\n\n const response = await fetch(url.toString());\n if (!response.ok) {\n throw new Error(`Failed to generate QR: HTTP ${response.status}`);\n }\n\n const result = (await response.json()) as GenerateQrResponse;\n\n // Bypassing runtime validation shape check\n if (!result || typeof result !== 'object' || typeof result.code !== 'string') {\n throw new Error('Invalid response from VNPay: Missing or malformed data');\n }\n\n if (result.code !== '00') {\n const locale = data.vnp_Locale || this.defaultConfig.vnp_Locale;\n result.message = getResponseByStatusCode(result.code, locale, RESPONSE_MAP);\n }\n\n const { qrcontent, ...rest } = result;\n const generateQrLogPayload: GenerateQrResponseLogger = {\n createdAt: new Date(),\n method: 'generateQr',\n qrcontentLength: qrcontent?.length ?? 0,\n ...rest,\n };\n\n this.logger.log(generateQrLogPayload, options, 'generateQr');\n\n return result;\n }\n\n private buildVnpayUrlInternal(\n data: BuildPaymentUrl,\n overrides?: Pick<DefaultConfig, 'vnp_Command'>,\n ): { url: URL; dataToBuild: DefaultConfig & BuildPaymentUrl } {\n const dataToBuild = {\n ...this.defaultConfig,\n ...data,\n ...overrides,\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(\n 'Invalid vnp_ExpireDate format. Use `dateFormat` utility function to format it',\n );\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 return {\n url: redirectUrl,\n dataToBuild: dataToBuild,\n };\n }\n}\n","import {\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 GlobalConfig,\n QueryDr,\n QueryDrResponse,\n QueryDrResponseLogger,\n QueryDrResponseOptions,\n Refund,\n RefundOptions,\n RefundResponse,\n RefundResponseLogger,\n} from '../types';\n// Import specific types from their files to fix linter errors\nimport type { BodyRequestQueryDr, QueryDrResponseFromVNPay } from '../types/query-dr.type';\nimport type { RefundResponseFromVNPay } from '../types/refund.type';\nimport { getResponseByStatusCode, hash, resolveUrlString } from '../utils/common';\nimport type { LoggerService } from './logger.service';\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 =\n this.config.endpoints.queryDrRefundEndpoint || QUERY_DR_REFUND_ENDPOINT;\n const url = new URL(\n resolveUrlString(\n this.config.queryDrAndRefundHost || this.config.vnpayHost,\n queryEndpoint,\n ),\n );\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:\n 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(\n WRONG_CHECKSUM_KEY,\n this.config.vnp_Locale,\n QUERY_DR_RESPONSE_MAP,\n ),\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 =\n this.config.endpoints.queryDrRefundEndpoint || QUERY_DR_REFUND_ENDPOINT;\n const url = new URL(\n resolveUrlString(\n this.config.queryDrAndRefundHost || this.config.vnpayHost,\n refundEndpoint,\n ),\n );\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:\n 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(\n WRONG_CHECKSUM_KEY,\n this.config.vnp_Locale,\n REFUND_RESPONSE_MAP,\n ),\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 { 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 { ignoreLogger } from '../utils';\nimport { getResponseByStatusCode } from '../utils/common';\nimport { buildPaymentUrlSearchParams, verifySecureHash } from '../utils/payment.util';\nimport type { LoggerService } from './logger.service';\n\n/**\n * Dịch vụ xác thực dữ liệu từ VNPay\n * @en Verification service for VNPay data\n */\nexport class VerificationService {\n private readonly config: GlobalConfig;\n private readonly logger: LoggerService;\n private readonly hashAlgorithm: HashAlgorithm;\n\n /**\n * Khởi tạo dịch vụ xác thực\n * @en Initialize verification 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 * 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(\n cloneQuery.vnp_ResponseCode?.toString() ?? '',\n this.config.vnp_Locale,\n ),\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(\n query,\n silentOptions as VerifyReturnUrlOptions<keyof VerifyReturnUrlLogger>,\n );\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 {\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 { LoggerService } from './services/logger.service';\nimport { PaymentService } from './services/payment.service';\nimport { QueryService } from './services/query.service';\nimport { VerificationService } from './services/verification.service';\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 GenerateQrResponse,\n GenerateQrResponseLogger,\n GenerateQrResponseOptions,\n} from './types';\nimport { resolveUrlString } from './utils/common';\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(\n this.globalConfig,\n this.loggerService,\n this.hashAlgorithm,\n );\n\n this.verificationService = new VerificationService(\n this.globalConfig,\n this.loggerService,\n this.hashAlgorithm,\n );\n\n this.queryService = new QueryService(\n this.globalConfig,\n this.loggerService,\n this.hashAlgorithm,\n );\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