UNPKG

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
"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