UNPKG

qpay

Version:
209 lines (208 loc) 9.48 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __exportStar = (this && this.__exportStar) || function(m, exports) { for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); }; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.QPay = void 0; const axios_1 = __importDefault(require("axios")); /** * QPay class нь QPay API-тай харилцан. * Энэ нь нэвтрэх токен үүсгэх, шинэчлэх болон API хандалтын үйлдлүүдийг гүйцэтгэнэ. */ class QPay { /** * QPay класыг шинэ instance үүсгэнэ. * @param setup - Хэрэглэгчийн нэр, нууц үг, нэхэмжлэхийн кодыг агуулна. */ constructor({ username, password, invoice_code }) { this.username = ""; this.password = ""; this.invoiceCode = ""; this.tokenRefreshPromise = null; // Token refresh давхцахаас сэргийлэх this.accessToken = ""; this.refreshToken = ""; this.expiresIn = null; this.refreshExpiresIn = null; this.username = username; this.password = password; this.invoiceCode = invoice_code; this.generateAuthToken(); } /** * Access token дуусах дөхсөн эсэхийг шалгана. * Token дуусахаас 2 цагийн өмнө дуусна гэж үзнэ. */ isAccessTokenExpired() { if (!this.expiresIn) return true; return Date.now() > this.expiresIn.getTime() - QPay.TWO_HOURS_IN_MS; } /** * Refresh token дуусах дөхсөн эсэхийг шалгана. * Token дуусахаас 2 цагийн өмнө дуусна гэж үзнэ. */ isRefreshTokenExpired() { if (!this.refreshExpiresIn) return true; return Date.now() > this.refreshExpiresIn.getTime() - QPay.TWO_HOURS_IN_MS; } /** * Token response өгөгдлийг боловсруулж, class instance-д хадгална. */ handleTokenResponse(response) { this.accessToken = response.access_token; this.refreshToken = response.refresh_token; // QPay API нь expires_in болон refresh_expires_in-г Unix timestamp-аар өгдөг // Timestamp нь секундээр байгаа тул миллисекунд руу хөрвүүлнэ this.expiresIn = new Date(response.expires_in * 1000); this.refreshExpiresIn = new Date(response.refresh_expires_in * 1000); } /** * QPay API-аас шинэ нэвтрэх токен авна. */ generateAuthToken() { return __awaiter(this, void 0, void 0, function* () { const authHeader = `Basic ${Buffer.from(`${this.username}:${this.password}`).toString("base64")}`; const response = yield axios_1.default.post(`${QPay.host}/v2/auth/token`, undefined, { headers: { "Content-Type": "application/json", Authorization: authHeader, }, }); this.handleTokenResponse(response.data); }); } /** * Refresh token ашиглан шинэ access token авна. */ refreshAuthToken() { return __awaiter(this, void 0, void 0, function* () { const response = yield axios_1.default.post(`${QPay.host}/v2/auth/refresh`, undefined, { headers: { "Content-Type": "application/json", Authorization: `Bearer ${this.refreshToken}`, }, }); this.handleTokenResponse(response.data); }); } /** * Token-ий хүчинтэй эсэхийг шалгаж, шаардлагатай бол шинэчилнэ. * Олон дуудлага зэрэг орох үед давхцахаас сэргийлнэ. */ checkAuth() { return __awaiter(this, void 0, void 0, function* () { // Хэрэв access token хүчинтэй бол шалгах шаардлагагүй if (!this.isAccessTokenExpired()) { return; } // Хэрэв өөр process token refresh хийж байвал түүнийг хүлээх if (this.tokenRefreshPromise) { yield this.tokenRefreshPromise; return; } // Token refresh эхлүүлэх this.tokenRefreshPromise = (() => __awaiter(this, void 0, void 0, function* () { try { // Хэрэв refresh token хүчинтэй бол түүгээр шинэчилнэ if (!this.isRefreshTokenExpired()) { try { yield this.refreshAuthToken(); } catch (error) { // Refresh амжилтгүй бол шинээр нэвтрэх yield this.generateAuthToken(); } } else { // Refresh token дууссан бол шинээр нэвтрэх yield this.generateAuthToken(); } } finally { // Дууссаны дараа promise-ийг цэвэрлэх this.tokenRefreshPromise = null; } }))(); yield this.tokenRefreshPromise; }); } /** * QPay API руу эрх бүхий HTTP хүсэлт илгээнэ. * @param endpointUrl - API-ийн endpoint (жишээ: "/v2/invoice") * @param method - HTTP method (get, post, put, delete) * @param data - Хүсэлтийн body (POST/PUT-д шаардлагатай) */ sendRequestWithAuth(endpointUrl, method, data) { return __awaiter(this, void 0, void 0, function* () { yield this.checkAuth(); const config = { headers: { "Content-Type": "application/json", Authorization: `Bearer ${this.accessToken}`, }, }; const fullUrl = `${QPay.host}${endpointUrl}`; switch (method) { case "get": return axios_1.default.get(fullUrl, config); case "post": return axios_1.default.post(fullUrl, data, config); case "put": return axios_1.default.put(fullUrl, data, config); case "delete": return axios_1.default.delete(fullUrl, config); } }); } /** * QPay системд шинэ нэхэмжлэх үүсгэнэ. * @param qpayInvoice - Үүсгэх нэхэмжлэхийн мэдээлэл * @returns Үүсгэсэн нэхэмжлэхийн мэдээлэл */ createInvoice(qpayInvoice) { return __awaiter(this, void 0, void 0, function* () { // Өгөгдлийг мутацлахгүйн тулд хуулбар үүсгэх const invoiceData = Object.assign(Object.assign({}, qpayInvoice), { invoice_code: this.invoiceCode }); return this.sendRequestWithAuth("/v2/invoice", "post", invoiceData); }); } /** * Нэхэмжлэхийн ID-аар нэхэмжлэхийн мэдээлэл авна. * @param id - Нэхэмжлэхийн ID * @returns Нэхэмжлэхийн дэлгэрэнгүй мэдээлэл */ getInvoice(id) { return __awaiter(this, void 0, void 0, function* () { return this.sendRequestWithAuth(`/v2/invoice/${id}`, "get"); }); } } exports.QPay = QPay; // API-ийн тохиргоо болон нэвтрэх мэдээлэл QPay.host = "https://merchant.qpay.mn"; QPay.TWO_HOURS_IN_MS = 2 * 60 * 60 * 1000; // Константыг class түвшинд зарлах __exportStar(require("./types"), exports);