qpay
Version:
QPay API integration
209 lines (208 loc) • 9.48 kB
JavaScript
"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);