UNPKG

vnpay

Version:

An open-source nodejs library support to payment with VNPay

1 lines 15.9 kB
{"version":3,"sources":["../src/utils/common.ts","../src/utils/logger.ts","../src/utils/payment.util.ts"],"names":["dayjs","utc","timezone","__name","RESPONSE_MAP","crypto","fs"],"mappings":"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","file":"chunk-WTHM33JV.cjs","sourcesContent":["import crypto, { type BinaryLike } from 'crypto';\nimport dayjs from 'dayjs';\nimport timezone from 'dayjs/plugin/timezone';\nimport utc from 'dayjs/plugin/utc';\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(\n dateNumber: number | string,\n tz: 'utc' | 'local' | 'gmt7' = 'local',\n): 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 =\n /^\\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 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\nexport function hash(\n secret: string,\n data: BinaryLike | string | Buffer,\n algorithm: HashAlgorithm,\n): string {\n return crypto.createHmac(algorithm, secret).update(data.toString()).digest('hex');\n}\n","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 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 crypto from 'crypto';\nimport type { HashAlgorithm } from '../enums';\nimport type { GlobalConfig } from '../types';\nimport { resolveUrlString } from './common';\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({\n config,\n data,\n}: {\n config: GlobalConfig;\n data: Record<string, unknown>;\n}): 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\n .createHmac(hashAlgorithm, secureSecret)\n .update(Buffer.from(data, bufferEncode))\n .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"]}