UNPKG

ecocash

Version:
130 lines 4.78 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; const node_crypto_1 = require("node:crypto"); const axios_1 = __importDefault(require("axios")); var PollStrategies; (function (PollStrategies) { PollStrategies["SIMPLE"] = "simple"; PollStrategies["INTERVAL"] = "interval"; PollStrategies["BACKOFF"] = "backoff"; })(PollStrategies || (PollStrategies = {})); class Ecocash { apiKey; merchant; baseUrl = "https://developers.ecocash.co.zw/api/ecocash_pay/"; mode; constructor(apiKey, merchant, mode = "sandbox") { this.apiKey = apiKey; this.merchant = merchant; this.mode = mode; } setLiveMode() { this.mode = "live"; } getHeaders() { return { "Content-Type": "application/json", "X-API-KEY": this.apiKey, "Merchant": this.merchant, }; } async initPayment(phone, amount, reason) { let reference = (0, node_crypto_1.randomUUID)(); let url = `${this.baseUrl}api/v2/payment/instant/c2b/${this.mode}`; let body = { "customerMsisdn": phone, "phone": phone, "amount": amount, "reason": reason, "currency": "USD", "sourceReference": reference }; let response = await this.makeRequest(url, "POST", body); return { ...response, ...body }; } async refundPayment(details) { let url = `${this.baseUrl}/api/v2/refund/instant/c2b/${this.mode}`; let body = { "origionalEcocashTransactionReference": details.reference, "refundCorelator": "012345l61975", "sourceMobileNumber": details.phone, "amount": details.amount, "clientName": details.clientName, "currency": details.currency || "USD", "reasonForRefund": details.reason }; let response = await this.makeRequest(url, "POST", body); return response; } async lookupTransaction(reference, phone) { let url = `${this.baseUrl}/api/v1/transaction/c2b/status/${this.mode}`; let body = { "sourceMobileNumber": phone, "sourceReference": reference }; let response = await this.makeRequest(url, "POST", body); response.paymentSuccess = response.status === "SUCCESS"; return response; } async pollTransaction(response, strategy = PollStrategies.INTERVAL, options = {}) { let multiplier = options?.multiplier || 2; let sleep = options?.sleep || 1000; let interval = options?.interval || 10; console.log("Polling for transaction status...", { strategy, multiplier, sleep, interval }); let lookupResponse = await this.lookupTransaction(response.sourceReference, response.phone); lookupResponse.paymentSuccess = lookupResponse.status === "SUCCESS"; if (strategy === PollStrategies.INTERVAL) { for (let i = 0; i < interval; i++) { lookupResponse = await this.lookupTransaction(response.sourceReference, response.phone); if (lookupResponse.paymentSuccess) return lookupResponse; await new Promise(resolve => setTimeout(resolve, sleep)); } } else if (strategy === PollStrategies.BACKOFF) { for (let i = 0; i < interval; i++) { lookupResponse = await this.lookupTransaction(response.sourceReference, response.phone); if (lookupResponse.paymentSuccess) return lookupResponse; await new Promise(resolve => setTimeout(resolve, sleep)); sleep *= multiplier; } } else { for (let i = 0; i < interval; i++) { lookupResponse = await this.lookupTransaction(response.sourceReference, response.phone); if (lookupResponse.paymentSuccess) return lookupResponse; } } console.log("Strategy not specified or timeout reached!"); return lookupResponse; } async makeRequest(url, method, body) { try { let headers = this.getHeaders(); let response = await (0, axios_1.default)({ method: method, url: url, headers: headers, data: body }); return response.data; } catch (error) { throw error; } } } module.exports = Ecocash; //# sourceMappingURL=ecocash.js.map