UNPKG

vnpay

Version:

An open-source nodejs library support to payment with VNPay

163 lines (161 loc) 6.18 kB
import { RESPONSE_MAP } from './chunk-3RXL4RP4.js'; import { __name } from './chunk-DHKAIZT6.js'; import crypto2 from 'crypto'; import dayjs from 'dayjs'; import timezone from 'dayjs/plugin/timezone.js'; import utc from 'dayjs/plugin/utc.js'; import * as fs from 'fs'; dayjs.extend(utc); dayjs.extend(timezone); function getDateInGMT7(date) { const inputDate = date ?? /* @__PURE__ */ new Date(); const utcDate = dayjs.utc(inputDate); return new Date(utcDate.add(7, "hour").valueOf()); } __name(getDateInGMT7, "getDateInGMT7"); function dateFormat(date, format = "yyyyMMddHHmmss") { const pad = /* @__PURE__ */ __name((n) => (n < 10 ? `0${n}` : n).toString(), "pad"); const year = date.getFullYear(); const month = pad(date.getMonth() + 1); const day = pad(date.getDate()); const hour = pad(date.getHours()); const minute = pad(date.getMinutes()); const second = pad(date.getSeconds()); return Number( format.replace("yyyy", year.toString()).replace("MM", month).replace("dd", day).replace("HH", hour).replace("mm", minute).replace("ss", second) ); } __name(dateFormat, "dateFormat"); function parseDate(dateNumber, tz = "local") { const dateString = dateNumber.toString(); const _parseInt = Number.parseInt; const year = _parseInt(dateString.slice(0, 4)); const month = _parseInt(dateString.slice(4, 6)) - 1; const day = _parseInt(dateString.slice(6, 8)); const hour = _parseInt(dateString.slice(8, 10)); const minute = _parseInt(dateString.slice(10, 12)); const second = _parseInt(dateString.slice(12, 14)); 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")}`; switch (tz) { case "utc": { return dayjs.utc(formattedDate).toDate(); } case "gmt7": { const localDate = new Date(year, month, day, hour, minute, second); const utcTime = dayjs.utc(localDate); return utcTime.add(7, "hour").toDate(); } // biome-ignore lint/complexity/noUselessSwitchCase: still good to readable case "local": default: return new Date(year, month, day, hour, minute, second); } } __name(parseDate, "parseDate"); function isValidVnpayDateFormat(date) { const dateString = date.toString(); 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]$/; return regex.test(dateString); } __name(isValidVnpayDateFormat, "isValidVnpayDateFormat"); function generateRandomString(length, options) { let result = ""; let characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; if (options?.onlyNumber) { characters = "0123456789"; } const charactersLength = characters.length; for (let i = 0; i < length; i++) { result += `${characters[Math.random() * charactersLength | 0]}`; } return result; } __name(generateRandomString, "generateRandomString"); function getResponseByStatusCode(responseCode = "", locale = "vn" /* VN */, responseMap = RESPONSE_MAP) { const respondText = responseMap.get(responseCode) ?? responseMap.get("default"); return respondText[locale]; } __name(getResponseByStatusCode, "getResponseByStatusCode"); function resolveUrlString(host, path) { let trimmedHost = host.trim(); let trimmedPath = path.trim(); while (trimmedHost.endsWith("/") || trimmedHost.endsWith("\\")) { trimmedHost = trimmedHost.slice(0, -1); } while (trimmedPath.startsWith("/") || trimmedPath.startsWith("\\")) { trimmedPath = trimmedPath.slice(1); } return `${trimmedHost}/${trimmedPath}`; } __name(resolveUrlString, "resolveUrlString"); function hash(secret, data, algorithm) { return crypto2.createHmac(algorithm, secret).update(data.toString()).digest("hex"); } __name(hash, "hash"); function ignoreLogger() { } __name(ignoreLogger, "ignoreLogger"); function consoleLogger(data, symbol = "log") { if (typeof console[symbol] === "function") { console[symbol](data); } } __name(consoleLogger, "consoleLogger"); function fileLogger(data, filePath, errorCallback) { const dataString = typeof data === "object" ? JSON.stringify(data) : String(data); fs.appendFile(filePath, `${dataString} `, (err) => { if (err && typeof errorCallback === "function") { return errorCallback(err); } if (err) { console.error("Failed to write to file:", err); throw err; } }); } __name(fileLogger, "fileLogger"); function buildPaymentUrlSearchParams(data) { const params = new URLSearchParams(); const sortedKeys = Object.keys(data).sort(); for (const key of sortedKeys) { if (data[key] !== void 0 && data[key] !== null && data[key] !== "") { params.append(key, String(data[key])); } } return params; } __name(buildPaymentUrlSearchParams, "buildPaymentUrlSearchParams"); function createPaymentUrl({ config, data }) { const paymentEndpoint = config.endpoints?.paymentEndpoint || config.paymentEndpoint; const redirectUrl = new URL(resolveUrlString(config.vnpayHost, paymentEndpoint)); const searchParams = buildPaymentUrlSearchParams(data); redirectUrl.search = searchParams.toString(); return redirectUrl; } __name(createPaymentUrl, "createPaymentUrl"); function calculateSecureHash({ secureSecret, data, hashAlgorithm, bufferEncode }) { return crypto2.createHmac(hashAlgorithm, secureSecret).update(Buffer.from(data, bufferEncode)).digest("hex"); } __name(calculateSecureHash, "calculateSecureHash"); function verifySecureHash({ secureSecret, data, hashAlgorithm, receivedHash }) { const calculatedHash = crypto2.createHmac(hashAlgorithm, secureSecret).update(Buffer.from(data, "utf-8")).digest("hex"); return calculatedHash === receivedHash; } __name(verifySecureHash, "verifySecureHash"); export { buildPaymentUrlSearchParams, calculateSecureHash, consoleLogger, createPaymentUrl, dateFormat, fileLogger, generateRandomString, getDateInGMT7, getResponseByStatusCode, hash, ignoreLogger, isValidVnpayDateFormat, parseDate, resolveUrlString, verifySecureHash }; //# sourceMappingURL=chunk-5IZHYZ2T.js.map //# sourceMappingURL=chunk-5IZHYZ2T.js.map