mpesalib
Version:
A robust Node.js library for Safaricom's Daraja API with complete TypeScript support and modern async/await patterns
206 lines • 7.53 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.MpesaService = void 0;
const httpClient_1 = require("./httpClient");
const utils_1 = require("../utils");
class MpesaService {
constructor(config) {
utils_1.MpesaUtils.validateConfig(config);
this.config = config;
this.httpClient = new httpClient_1.HttpClient(config);
}
/**
* Register C2B URLs for confirmation and validation
*/
async registerC2BUrls(request) {
const endpoint = '/mpesa/c2b/v1/registerurl';
return this.httpClient.post(endpoint, request);
}
/**
* Simulate a C2B transaction
*/
async simulateC2B(request) {
const endpoint = '/mpesa/c2b/v1/simulate';
// Format phone number
const formattedRequest = {
...request,
Msisdn: utils_1.MpesaUtils.formatPhoneNumber(request.Msisdn),
};
return this.httpClient.post(endpoint, formattedRequest);
}
/**
* Business to Customer (B2C) payment
*/
async b2cPayment(request) {
const endpoint = '/mpesa/b2c/v1/paymentrequest';
// Format phone number
const formattedRequest = {
...request,
PartyB: utils_1.MpesaUtils.formatPhoneNumber(request.PartyB),
};
return this.httpClient.post(endpoint, formattedRequest);
}
/**
* Business to Business (B2B) payment
*/
async b2bPayment(request) {
const endpoint = '/mpesa/b2b/v1/paymentrequest';
return this.httpClient.post(endpoint, request);
}
/**
* STK Push (Lipa Na M-Pesa Online)
*/
async stkPush(request) {
if (!this.config.passkey) {
throw new Error('Passkey is required for STK Push requests');
}
const timestamp = utils_1.MpesaUtils.generateTimestamp();
const password = utils_1.MpesaUtils.generatePassword(request.BusinessShortCode, this.config.passkey, timestamp);
const fullRequest = {
...request,
Password: password,
Timestamp: timestamp,
PhoneNumber: utils_1.MpesaUtils.formatPhoneNumber(request.PhoneNumber),
PartyA: utils_1.MpesaUtils.formatPhoneNumber(request.PartyA),
};
const endpoint = '/mpesa/stkpush/v1/processrequest';
return this.httpClient.post(endpoint, fullRequest);
}
/**
* STK Push Query (Check status of STK Push)
*/
async stkPushQuery(checkoutRequestID) {
if (!this.config.passkey || !this.config.shortCode) {
throw new Error('Passkey and shortCode are required for STK Push query');
}
const timestamp = utils_1.MpesaUtils.generateTimestamp();
const password = utils_1.MpesaUtils.generatePassword(this.config.shortCode, this.config.passkey, timestamp);
const request = {
BusinessShortCode: this.config.shortCode,
Password: password,
Timestamp: timestamp,
CheckoutRequestID: checkoutRequestID,
};
const endpoint = '/mpesa/stkpushquery/v1/query';
return this.httpClient.post(endpoint, request);
}
/**
* Check account balance
*/
async getAccountBalance(request) {
const endpoint = '/mpesa/accountbalance/v1/query';
return this.httpClient.post(endpoint, request);
}
/**
* Query transaction status
*/
async getTransactionStatus(request) {
const endpoint = '/mpesa/transactionstatus/v1/query';
return this.httpClient.post(endpoint, request);
}
/**
* Reverse a transaction
*/
async reverseTransaction(request) {
const endpoint = '/mpesa/reversal/v1/request';
return this.httpClient.post(endpoint, request);
}
/**
* Generate security credential for API requests
*/
generateSecurityCredential(initiatorPassword) {
if (!this.config.certificatePath) {
throw new Error('Certificate path is required to generate security credential');
}
return utils_1.MpesaUtils.generateSecurityCredential(initiatorPassword, this.config.certificatePath);
}
/**
* Convenience method for salary payment (B2C)
*/
async salaryPayment(amount, phoneNumber, remarks, queueTimeOutURL, resultURL, occasion) {
if (!this.config.initiatorName || !this.config.securityCredential) {
throw new Error('InitiatorName and SecurityCredential are required for salary payments');
}
const request = {
InitiatorName: this.config.initiatorName,
SecurityCredential: this.config.securityCredential,
CommandID: 'SalaryPayment',
Amount: amount,
PartyA: this.config.shortCode,
PartyB: phoneNumber,
Remarks: remarks,
QueueTimeOutURL: queueTimeOutURL,
ResultURL: resultURL,
Occasion: occasion,
};
return this.b2cPayment(request);
}
/**
* Convenience method for business payment (B2C)
*/
async businessPayment(amount, phoneNumber, remarks, queueTimeOutURL, resultURL, occasion) {
if (!this.config.initiatorName || !this.config.securityCredential) {
throw new Error('InitiatorName and SecurityCredential are required for business payments');
}
const request = {
InitiatorName: this.config.initiatorName,
SecurityCredential: this.config.securityCredential,
CommandID: 'BusinessPayment',
Amount: amount,
PartyA: this.config.shortCode,
PartyB: phoneNumber,
Remarks: remarks,
QueueTimeOutURL: queueTimeOutURL,
ResultURL: resultURL,
Occasion: occasion,
};
return this.b2cPayment(request);
}
/**
* Convenience method for paybill payment (STK Push)
*/
async paybillPayment(amount, phoneNumber, accountReference, transactionDesc, callBackURL) {
const request = {
BusinessShortCode: this.config.shortCode,
TransactionType: 'CustomerPayBillOnline',
Amount: amount,
PartyA: phoneNumber,
PartyB: this.config.shortCode,
PhoneNumber: phoneNumber,
CallBackURL: callBackURL,
AccountReference: accountReference,
TransactionDesc: transactionDesc,
};
return this.stkPush(request);
}
/**
* Convenience method for buy goods payment (STK Push)
*/
async buyGoodsPayment(amount, phoneNumber, accountReference, transactionDesc, callBackURL) {
const request = {
BusinessShortCode: this.config.shortCode,
TransactionType: 'CustomerBuyGoodsOnline',
Amount: amount,
PartyA: phoneNumber,
PartyB: this.config.shortCode,
PhoneNumber: phoneNumber,
CallBackURL: callBackURL,
AccountReference: accountReference,
TransactionDesc: transactionDesc,
};
return this.stkPush(request);
}
/**
* Get configuration (useful for debugging)
*/
getConfig() {
// Return config without sensitive data
return {
environment: this.config.environment,
shortCode: this.config.shortCode,
initiatorName: this.config.initiatorName,
};
}
}
exports.MpesaService = MpesaService;
//# sourceMappingURL=mpesaService.js.map