tranxs
Version:
Tranxs is a powerful and easy-to-use Node.js library for integrating M-Pesa payment services into your application. It provides seamless support for all major M-Pesa transactions, including STK Push, B2C, B2B, C2B, Reversal, Account Balance, and Transacti
109 lines • 4.46 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Mpesa = void 0;
const axios_1 = __importDefault(require("axios"));
const generateTimeStamp_1 = require("../utils/generateTimeStamp");
const cleanPhone_1 = require("../utils/cleanPhone");
const uuid_1 = require("uuid");
const segGen_1 = require("./segGen");
class Mpesa {
credentials;
environment;
baseUrl;
constructor(credentials, environment = "sandbox") {
this.credentials = credentials;
this.environment = environment;
this.baseUrl =
this.environment === "production"
? "https://api.safaricom.co.ke"
: "https://sandbox.safaricom.co.ke";
}
async generateToken() {
const auth = Buffer.from(`${this.credentials.CONSUMER_KEY}:${this.credentials.CONSUMER_SECRET}`).toString("base64");
try {
const response = await axios_1.default.get(`${this.baseUrl}/oauth/v1/generate`, {
headers: {
Authorization: `Basic ${auth}`,
"Content-Type": "application/x-www-form-urlencoded",
},
params: { grant_type: "client_credentials" },
});
return response.data.access_token;
}
catch (error) {
console.error("Tranx Error:", error.response ? error.response.data : error.message);
}
return null;
}
async requestMpesaAPI(endpoint, payload) {
const token = await this.generateToken();
if (!token)
throw new Error("Unable to authenticate with Mpesa API.");
try {
const { data } = await axios_1.default.post(`${this.baseUrl}${endpoint}`, payload, {
headers: {
Authorization: `Bearer ${token}`,
},
});
return data;
}
catch (error) {
const status = error?.response?.status;
const data = error?.response?.data;
const message = typeof data === "object"
? JSON.stringify(data, null, 2)
: data || error.message;
throw new Error(`[Tranxs Error] ${status ? `Status: ${status}, ` : ""}Message: ${message}`);
}
}
async stkPush(options) {
const timestamp = (0, generateTimeStamp_1.generateTimestamp)();
const password = Buffer.from(this.credentials.BUSINESS_SHORT_CODE +
(this.credentials.PASS_KEY || "") +
timestamp).toString("base64");
const phone = (0, cleanPhone_1.cleanPhoneNumber)(options.phone);
const payload = {
BusinessShortCode: this.credentials.BUSINESS_SHORT_CODE,
Password: password,
Timestamp: timestamp,
TransactionType: "CustomerPayBillOnline",
Amount: options.amount,
PartyA: phone,
PartyB: this.credentials.BUSINESS_SHORT_CODE,
PhoneNumber: phone,
CallBackURL: options.callbackUrl,
AccountReference: options.account,
TransactionDesc: options.TransactionDesc,
};
return {
action: "Tranxs - Mpesa STK Push",
response: await this.requestMpesaAPI("/mpesa/stkpush/v1/processrequest", payload),
};
}
async b2c(options) {
const securityCredentials = (0, segGen_1.generateSecurityCredentials)(this.credentials.INITIATOR_PASSWORD);
const phone = (0, cleanPhone_1.cleanPhoneNumber)(options.phone);
const payload = {
OriginatorConversationID: (0, uuid_1.v4)(),
InitiatorName: this.credentials.INITIATOR_NAME,
SecurityCredential: securityCredentials,
CommandID: options.commandID,
Amount: options.amount,
PartyA: this.credentials.BUSINESS_SHORT_CODE,
PartyB: phone,
Remarks: options.remarks,
QueueTimeOutURL: options.queueTimeOutURL,
ResultURL: options.resultCallbackURL,
Occasion: options.ocattion,
};
return {
action: "Tranxs - Mpesa B2C transaction",
response: await this.requestMpesaAPI("/mpesa/b2c/v3/paymentrequest", payload),
};
}
}
exports.Mpesa = Mpesa;
//# sourceMappingURL=Mpesa.js.map