UNPKG

mpesa-connect

Version:

SDK para M-Pesa API

127 lines (126 loc) 6.2 kB
"use strict"; 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()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.initializeMpesa = initializeMpesa; const crypto = require("crypto"); const axios = require("axios"); const { config } = require("dotenv"); config(); function initializeMpesa({ publicKey, apiKey, serviceProviderCode, env, }) { const baseUri = env === "live" ? "https://api.vm.co.mz" : "https://api.sandbox.vm.co.mz"; const publicKeyEnv = publicKey || process.env.MPESA_PUBLIC_KEY; const apiKeyEnv = apiKey || process.env.MPESA_API_KEY; const serviceProviderCodeEnv = serviceProviderCode || process.env.MPESA_SERVICE_PROVIDER_CODE; if (!publicKeyEnv || !apiKeyEnv || !serviceProviderCodeEnv) { throw new Error("Public Key, API Key, or Service Provider Code is missing."); } function getToken() { if (publicKeyEnv && apiKeyEnv) { let key = "-----BEGIN PUBLIC KEY-----\n"; key += publicKeyEnv.match(/.{1,60}/g).join("\n"); key += "\n-----END PUBLIC KEY-----"; const buffer = Buffer.from(apiKeyEnv, "utf-8"); const encrypted = crypto.publicEncrypt({ key: key, padding: crypto.constants.RSA_PKCS1_PADDING, }, buffer); return encrypted.toString("base64"); } throw new Error("Invalid public key or API key"); } function getHeaders() { return { "Content-Type": "application/json", Authorization: `Bearer ${getToken()}`, origin: "developer.mpesa.vm.co.mz", Connection: "keep-alive", }; } function makeRequest(url_1, port_1, method_1) { return __awaiter(this, arguments, void 0, function* (url, port, method, fields = {}) { try { const response = yield axios({ method: method, url: `${baseUri}:${port}${url}`, headers: getHeaders(), data: method === "POST" ? fields : undefined, params: method !== "POST" ? fields : undefined, timeout: 90000, }); return { response: response.data, status: response.status, }; } catch (error) { return { response: error.response ? error.response.data : error.message, status: error.response ? error.response.status : 500, }; } }); } function c2b(transactionReference_1, customerMSISDN_1, amount_1, thirdPartyReference_1) { return __awaiter(this, arguments, void 0, function* (transactionReference, customerMSISDN, amount, thirdPartyReference, serviceProviderCodeParam = serviceProviderCodeEnv) { const fields = { input_TransactionReference: transactionReference, input_CustomerMSISDN: customerMSISDN, input_Amount: amount, input_ThirdPartyReference: thirdPartyReference, input_ServiceProviderCode: serviceProviderCodeParam, }; return makeRequest("/ipg/v1x/c2bPayment/singleStage/", 18352, "POST", fields); }); } function b2c(transactionReference_1, customerMSISDN_1, amount_1, thirdPartyReference_1) { return __awaiter(this, arguments, void 0, function* (transactionReference, customerMSISDN, amount, thirdPartyReference, serviceProviderCodeParam = serviceProviderCodeEnv) { const fields = { input_TransactionReference: transactionReference, input_CustomerMSISDN: customerMSISDN, input_Amount: amount, input_ThirdPartyReference: thirdPartyReference, input_ServiceProviderCode: serviceProviderCodeParam, }; return makeRequest("/ipg/v1x/b2cPayment/", 18345, "POST", fields); }); } function transactionReversal(transactionID_1, securityCredential_1, initiatorIdentifier_1, thirdPartyReference_1) { return __awaiter(this, arguments, void 0, function* (transactionID, securityCredential, initiatorIdentifier, thirdPartyReference, serviceProviderCodeParam = serviceProviderCodeEnv, reversalAmount) { const fields = { input_TransactionID: transactionID, input_SecurityCredential: securityCredential, input_InitiatorIdentifier: initiatorIdentifier, input_ThirdPartyReference: thirdPartyReference, input_ServiceProviderCode: serviceProviderCodeParam, input_ReversalAmount: reversalAmount, }; return makeRequest("/ipg/v1x/reversal/", 18354, "POST", fields); }); } function status(thirdPartyReference_1, queryReference_1) { return __awaiter(this, arguments, void 0, function* (thirdPartyReference, queryReference, serviceProviderCodeParam = serviceProviderCodeEnv) { const fields = { input_ThirdPartyReference: thirdPartyReference, input_QueryReference: queryReference, input_ServiceProviderCode: serviceProviderCodeParam, }; return makeRequest("/ipg/v1x/queryTransactionStatus/", 18353, "GET", fields); }); } return { c2b, b2c, transactionReversal, status, getToken, }; } module.exports = { initializeMpesa };