ecocash
Version:
Ecocash Javascript SDK
130 lines • 4.78 kB
JavaScript
;
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