vnpay
Version:
An open-source nodejs library support to payment with VNPay
163 lines (161 loc) • 6.18 kB
JavaScript
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';
import utc from 'dayjs/plugin/utc';
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-EPCCPJI6.js.map
//# sourceMappingURL=chunk-EPCCPJI6.js.map