@safaricom-et/mpesa-node-js-sdk
Version:
A TypeScript SDK for integrating M-Pesa mobile payment services into applications, enabling seamless money transfers and transactions.
259 lines (180 loc) • 7.46 kB
Markdown
# [mpesa-node-js-sdk] M-Pesa SDK for NodeJS
[](https://mit-license.org/Safaricom-Ethiopia-PLC)
## Overview
The M-Pesa Node.js SDK simplifies the integration of M-Pesa mobile payment services into your applications. It offers an intuitive API to manage core M-Pesa operations such as sending payments, receiving payments, checking account balances, and more. Whether you're building for the sandbox or production environment, this SDK helps streamline your workflow.
## Features
- **Authentication**: Generate and manage secure tokens for API access.
- **STK Push**: Effortlessly trigger M-Pesa payments to your customers via STK Push.
- **Customer to Business (C2B)**: Process customer payments with validation and confirmation callbacks.
- **Business to Customer (B2C)**: Easily send payments (Payouts for salaries, rewards, or refunds) from your business to customers.
- **Error Handling**: CBenefit from centralized and consistent error management for reliability.
- **Automatic Retries**: Request handling with automatic retries for improved success rates.
- **Logging**: Tailor log levels to your needs (Emergency upto Debug) for optimal debugging and monitoring.
## Requirements
- Node.js v22.8.0 or later is installed on your system.
- You have an M-Pesa Developer Account.
- Register at M-Pesa Developer Portal. </br>
\_Make sure to obtain your consumerKey and consumerSecret from the M-Pesa Developer Portal for authentication.\_\_
## Installation
Install the Package
Use your preferred package manager to install the M-Pesa NodeJS SDK:
```bash
npm install @safaricom-et/mpesa-node-js-sdk
```
or
```bash
yarn install @safaricom-et/mpesa-node-js-sdk
```
or
```bash
pnpm install @safaricom-et/mpesa-node-js-sdk
```
## Configuration Guide
### Set Up the Environment
To configure the SDK, create a .env file in your project root and add the following environment variables:
```dotenv
MPESA_CONSUMER_KEY=your-consumer-key
MPESA_CONSUMER_SECRET=your-consumer-secret
MPESA_ENVIRONMENT=sandbox
```
_Set MPESA_ENVIRONMENT to production when deploying to live environments._
### Basic Configuration
Create an instance in your project by importing and configuring the SDK:
```nodejs
import { Mpesa } from 'mpesa-node-js-sdk';
const mpesa = new Mpesa({
apiKey: process.env.MPESA_CONSUMER_KEY,
secretKey: process.env.MPESA_CONSUMER_SECRET,
environment: process.env.MPESA_ENVIRONMENT,
});
// Example: Check account balance
mpesa.accountBalance({
shortCode: '123456',
callbackUrl: 'https://yourcallback.url',
}).then(response => console.log(response))
.catch(error => console.error(error));
```
### _Getting Started_
- ### MPesa Instance
Detailed reference for the `MPesa` Instance, its core methods, authentication handling, payload types, response types, and expected errors.
- ### MPesa Class
The `MPesa` class is the primary interface for interacting with the M-Pesa API. It provides core methods to handle authentication, STK Push, B2C payments, and URL registration while abstracting the complexity of API calls.
- ### Singleton Behavior
The `MPesa` class follows the singleton design pattern to ensure only one instance is created during the application's lifecycle. This avoids redundant configurations and centralizes API interactions.
Example
```nodejs
import { MPesa } from 'mpesa-node-js-sdk';
const mpesa = MPesa.getInstance({
environment: 'sandbox',
apiKey: 'your-api-key',
secretKey: 'your-secret-key',
retries: 3,
logLevel: 'informational',
});
```
_const sameMpesa = MPesa.getInstance(); // Returns the same instance as above_ </br>
If you call `MPesa.getInstance()` without passing configuration after the first call, it will reuse the previously initialized instance.
## Usage
### Step 1: Authentication
Handles automatic token generation and caching. You don't need to call this method directly as it is invoked automatically before making API requests.
**Example:**
```nodejs
await mpesa.authenticate(); // Generates a new token
```
**Errors:**
- AuthenticationError: _Thrown if token generation fails._
### Step 2: STK Push Integration
Initiates a payment request to a customer's phone using the M-Pesa STK Push API.
**Parameters:**
- _Payload:_ _An object of type StkPushPayloadType._
**Example:**
```nodejs
const payload = {
BusinessShortCode: '123456',
Password: 'base64-encoded-password',
Timestamp: '20250101120000',
TransactionType: 'CustomerPayBillOnline',
Amount: 100,
PartyA: '254700123456',
PartyB: '123456',
PhoneNumber: '254700123456',
CallBackURL: 'https://your-callback-url.com',
AccountReference: 'Ref123',
TransactionDesc: 'Payment Description',
};
try {
const response = await mpesa.stkPush(payload);
console.log('STK Push Response:', response);
} catch (error) {
console.error('STK Push failed:', error);
}
```
### Step 3: C2B Payment
Registers validation and confirmation URLs for receiving payment notifications.
**Parameters:**
- _Payload:_ _An object of type RegisterUrlPayloadType._
**Example:**
```nodejs
const payload = {
ShortCode: '123456',
ResponseType: 'Completed',
CommandID: 'RegisterURL',
ConfirmationURL: 'https://your-domain.com/c2b/confirmation',
ValidationURL: 'https://your-domain.com/c2b/validation',
};
try {
const response = await mpesa.registerC2BUrl(payload);
console.log('C2B URL Registration Response:', response);
} catch (error) {
console.error('C2B URL registration failed:', error);
}
```
### Step 4: B2C Payout
Processes business-to-customer payments.
**Parameters:**
- _Payload:_ _An object of type B2CPayloadType._
**Example:**
```nodejs
const payload = {
InitiatorName: 'testapi',
SecurityCredential: 'encrypted-password',
CommandID: 'BusinessPayment',
Amount: 500,
PartyA: '101010',
PartyB: '254700123456',
Remarks: 'Payment for services',
QueueTimeOutURL: 'https://your-domain.com/b2c/timeout',
ResultURL: 'https://your-domain.com/b2c/result',
Occassion: 'Bonus',
};
try {
const response = await mpesa.b2cPayment(payload);
console.log('B2C Payment Response:', response);
} catch (error) {
console.error('B2C Payment failed:', error);
}
```
## Contributing
Contributions are welcome! Please follow these steps:
1. **Fork the repository** on GitHub.
2. **Clone your fork** to your local machine.
```bash
git clone https://github.com/Safaricom-Ethiopia-PLC/mpesa-node-js-sdk.git
```
3. **Create a new feature branch**.
```bash
git checkout -b feature/<your-feature-name>
```
4. **Make your changes** and commit them.
```bash
git commit -am "Add new <short feature description>"
```
5. **Push your branch** to your fork.
```bash
git push origin feature/<your-feature-name>
```
6. **Open a pull request** from your branch to the main repository.
## License
This project is licensed under the [MIT License](https://mit-license.org/Safaricom-Ethiopia-PLC). See the [LICENSE](LICENSE) file for more details.
---
_Happy coding with M-Pesa NodeJS SDK!_