This SDK provides a streamlined integration for Airtel Money payments in Node.js applications, offering both v1 and v2 API versions, token caching, and a retry-based polling mechanism for payment status tracking.
- Dual API Version Support: Seamless support for both API versions (
v1
andv2
), including version-based request and response handling. - Bearer Token Caching: Implements token caching to optimize API requests and reduce load on authentication services.
- AES and RSA Encryption: Utilizes AES for data encryption and RSA for secure key exchange in v2 API.
- Retry Mechanism: Includes configurable retry and timeout settings for polling payment status.
- Comprehensive Error Handling: Detailed error logging with full response data, headers, and status codes.
- Node.js (>= 14.x)
- NPM or Yarn
- Airtel Money API access (sandbox or production)
Install the package in your Node.js project:
npm install airtel-money-node-sdk
- Copy the
env.example
file to.env
:
cp env.example .env
- Update the
.env
file with your actual values:
# Airtel API Configuration
AIRTEL_API_BASE_URL=https://openapiuat.airtel.africa # Sandbox URL
# AIRTEL_API_BASE_URL=https://openapi.airtel.africa # Production URL
# OAuth2 Credentials
CLIENT_ID=your_client_id_here
CLIENT_SECRET=your_client_secret_here
GRANT_TYPE=client_credentials
# Country and Currency Configuration
COUNTRY=UG
CURRENCY=UGX
# API Version (1 or 2)
AIRTEL_API_VERSION=1
# Polling and Retry Configuration
DEFAULT_MAX_RETRIES=5
DEFAULT_POLLING_INTERVAL_MS=5000
POLLING_TIMEOUT=30000
To start a payment, call the initiateAirtelPayment
function with the payment amount, recipient's phone number, and a reference.
const { initiateAirtelPayment } = require('airtel-money-node-sdk');
async function makePayment() {
try {
const amount = '100.00';
const msisdn = '977XXXXXX'; // Recipient's phone number without country code
const reference = 'Invoice #12345'; // Reference for the payment
const paymentStatus = await initiateAirtelPayment(amount, msisdn, reference);
console.log('Final Payment Status:', paymentStatus);
// paymentStatus will contain:
// { status: 'SUCCESS' | 'FAILED', data: responseData }
} catch (error) {
console.error('Payment initiation failed:', error.message);
}
}
makePayment();
The SDK automatically handles both v1 and v2 API requests based on the AIRTEL_API_VERSION
environment variable:
- V1 API: Simple JSON payload with direct transaction ID usage
- V2 API: Encrypted payload using AES-256-CBC encryption with RSA key exchange
The SDK includes an intelligent polling mechanism that:
- Automatically polls payment status based on the configured
DEFAULT_MAX_RETRIES
andDEFAULT_POLLING_INTERVAL_MS
- Uses exponential backoff (interval increases with each retry)
- Returns final status:
SUCCESS
(TS),FAILED
(TF), or throws error on timeout
The SDK automatically:
- Caches bearer tokens until expiry (minus 60-second buffer)
- Refreshes tokens when needed
- Handles OAuth2 authentication seamlessly
Variable | Description | Default | Required |
---|---|---|---|
AIRTEL_API_BASE_URL |
Airtel API base URL | - | Yes |
CLIENT_ID |
OAuth2 client ID | - | Yes |
CLIENT_SECRET |
OAuth2 client secret | - | Yes |
GRANT_TYPE |
OAuth2 grant type | client_credentials |
Yes |
COUNTRY |
Country code (e.g., UG) | - | Yes |
CURRENCY |
Currency code (e.g., UGX) | - | Yes |
AIRTEL_API_VERSION |
API version (1 or 2) | 1 |
No |
DEFAULT_MAX_RETRIES |
Maximum polling retries | 5 |
No |
DEFAULT_POLLING_INTERVAL_MS |
Base polling interval (ms) | 5000 |
No |
POLLING_TIMEOUT |
API request timeout (ms) | 30000 |
No |
RSA_PUBLIC_KEY |
API v2 RSA public key | Your Public Key | Yes |
The SDK provides comprehensive error handling:
- All API errors are logged with full response details
- Automatic retry mechanism for failed requests
- Detailed error messages for debugging
- Graceful handling of network timeouts
The SDK interacts with the following Airtel Money API endpoints:
- Authentication:
POST /auth/oauth2/token
- V1 Payments:
POST /merchant/v1/payments/
- V2 Payments:
POST /merchant/v2/payments/
- V1 Status:
GET /standard/v1/payments/{transactionId}
- V2 Status:
GET /standard/v1/payments/{reference}
- RSA Keys:
GET /v1/rsa/encryption-keys
(V2 only)
Contributions are welcome! Please read the CONTRIBUTING.md file for detailed guidelines before submitting a pull request or opening an issue.
This project is licensed under the MIT License. See the LICENSE file for details.