UNPKG

central-gateway

Version:

Simplify payments in Bangladesh with one unified library for AamarPay, SSLCommerz, and bKash. Skip the hassle of multiple gateway documentations—our consistent API does it all for you!

254 lines (253 loc) • 13.2 kB
"use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); 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 __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype); return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (g && (g = 0, op[0] && (_ = 0)), _) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; Object.defineProperty(exports, "__esModule", { value: true }); exports.BkashGateway = void 0; var PaymentError_1 = require("../errors/PaymentError"); var base_gateway_1 = require("./base.gateway"); var BkashGateway = /** @class */ (function (_super) { __extends(BkashGateway, _super); function BkashGateway(config) { var _this = _super.call(this) || this; _this.authToken = null; _this.username = config.username; _this.password = config.password; _this.appKey = config.appKey; _this.appSecret = config.appSecret; _this.baseUrl = config.isSandbox ? 'https://tokenized.sandbox.bka.sh/v1.2.0-beta' : 'https://tokenized.pay.bka.sh/v1.2.0-beta'; return _this; } //01823074817 BkashGateway.prototype.getAuthToken = function () { return __awaiter(this, void 0, void 0, function () { var response, data, error_1; return __generator(this, function (_a) { switch (_a.label) { case 0: if (this.authToken) return [2 /*return*/, this.authToken]; _a.label = 1; case 1: _a.trys.push([1, 4, , 5]); return [4 /*yield*/, fetch("".concat(this.baseUrl, "/tokenized/checkout/token/grant"), { method: 'POST', headers: { 'Content-Type': 'application/json', Accept: 'application/json', username: this.username, password: this.password, }, body: JSON.stringify({ app_key: this.appKey, app_secret: this.appSecret, }), })]; case 2: response = _a.sent(); if (!response.ok) { throw new Error("HTTP error! status: ".concat(response.status)); } return [4 /*yield*/, response.json()]; case 3: data = _a.sent(); if (!data.id_token) { throw new Error('No token received from bKash'); } this.authToken = data.id_token; return [2 /*return*/, this.authToken]; case 4: error_1 = _a.sent(); throw new PaymentError_1.PaymentError(500, "Failed to get bKash auth token: ".concat(error_1.message), error_1); case 5: return [2 /*return*/]; } }); }); }; BkashGateway.prototype.processPayment = function (data) { return __awaiter(this, void 0, void 0, function () { var token, bkashData, response, responseData, paymentUrl, error_2; return __generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 4, , 5]); return [4 /*yield*/, this.getAuthToken()]; case 1: token = _a.sent(); bkashData = this.mapToBkash(data); return [4 /*yield*/, fetch("".concat(this.baseUrl, "/tokenized/checkout/create"), { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: token, 'X-APP-Key': this.appKey, }, body: JSON.stringify(bkashData), })]; case 2: response = _a.sent(); if (!response.ok) { throw new Error("HTTP error! status: ".concat(response.status)); } return [4 /*yield*/, response.json()]; case 3: responseData = _a.sent(); paymentUrl = responseData === null || responseData === void 0 ? void 0 : responseData.bkashURL; if (!paymentUrl) { throw new PaymentError_1.PaymentError(500, 'bKash session was not successful. No payment URL returned.'); } return [2 /*return*/, paymentUrl]; case 4: error_2 = _a.sent(); if (error_2 instanceof PaymentError_1.PaymentError) { throw error_2; } throw new PaymentError_1.PaymentError(500, "Failed to process bKash payment: ".concat(error_2.message), error_2); case 5: return [2 /*return*/]; } }); }); }; BkashGateway.prototype.mapToBkash = function (data) { return { mode: '0011', payerReference: data.customer.phone, callbackURL: data.urls.callback, amount: data.amount.toString(), currency: data.currency, intent: 'sale', merchantInvoiceNumber: data.transactionId, }; }; BkashGateway.prototype.executePayment = function (paymentId) { return __awaiter(this, void 0, void 0, function () { var token, response, responseData, error_3; return __generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 4, , 5]); return [4 /*yield*/, this.getAuthToken()]; case 1: token = _a.sent(); return [4 /*yield*/, fetch("".concat(this.baseUrl, "/tokenized/checkout/execute"), { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: token, 'X-APP-Key': this.appKey, }, body: JSON.stringify({ paymentID: paymentId }), })]; case 2: response = _a.sent(); if (!response.ok) { throw new Error("HTTP error! status: ".concat(response.status)); } return [4 /*yield*/, response.json()]; case 3: responseData = _a.sent(); if (responseData.statusCode && responseData.statusCode !== '0000') { throw new PaymentError_1.PaymentError(400, "bKash payment execution failed: ".concat(responseData.statusMessage || 'Unknown error')); } return [2 /*return*/, responseData]; case 4: error_3 = _a.sent(); if (error_3 instanceof PaymentError_1.PaymentError) { throw error_3; } throw new PaymentError_1.PaymentError(500, "Failed to execute bKash payment: ".concat(error_3.message), error_3); case 5: return [2 /*return*/]; } }); }); }; BkashGateway.prototype.queryPayment = function (paymentId) { return __awaiter(this, void 0, void 0, function () { var token, response, error_4; return __generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 4, , 5]); return [4 /*yield*/, this.getAuthToken()]; case 1: token = _a.sent(); return [4 /*yield*/, fetch("".concat(this.baseUrl, "/tokenized/checkout/payment/status"), { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: token, 'X-APP-Key': this.appKey, }, body: JSON.stringify({ paymentID: paymentId }), })]; case 2: response = _a.sent(); if (!response.ok) { throw new Error("HTTP error! status: ".concat(response.status)); } return [4 /*yield*/, response.json()]; case 3: return [2 /*return*/, _a.sent()]; case 4: error_4 = _a.sent(); if (error_4 instanceof PaymentError_1.PaymentError) { throw error_4; } throw new PaymentError_1.PaymentError(500, "Failed to query bKash payment: ".concat(error_4.message), error_4); case 5: return [2 /*return*/]; } }); }); }; return BkashGateway; }(base_gateway_1.BaseGateway)); exports.BkashGateway = BkashGateway;