UNPKG

mpesalib

Version:

A robust Node.js library for Safaricom's Daraja API with complete TypeScript support and modern async/await patterns

238 lines (200 loc) 6.74 kB
// Local development import (while working with source code) // For development/local testing, use relative import: import { Mpesa, MpesaConfig } from '../src'; // For published package, use: // import { Mpesa, MpesaConfig } from 'mpesalib'; // Production import (after installing from npm): // import { Mpesa, MpesaConfig } from 'mpesa-daraja-api'; // Example 1: Basic configuration const config: MpesaConfig = { consumerKey: 'your_consumer_key', consumerSecret: 'your_consumer_secret', environment: 'sandbox', // or 'production' shortCode: '174379', initiatorName: 'testapi', securityCredential: 'your_security_credential', passkey: 'your_passkey', }; const mpesa = new Mpesa(config); // Example 2: Using environment variables const mpesaFromEnv = Mpesa.fromEnv(); // Example 3: STK Push (Lipa Na M-Pesa Online) async function stkPushExample() { try { const response = await mpesa.paybillPayment( 1000, // Amount '254712345678', // Phone number 'INV001', // Account reference 'Payment for invoice INV001', // Description 'https://yourdomain.com/callback' // Callback URL ); console.log('STK Push initiated:', response); // Query STK Push status if (response.CheckoutRequestID) { const statusResponse = await mpesa.stkPushQuery(response.CheckoutRequestID); console.log('STK Push status:', statusResponse); } } catch (error) { console.error('STK Push failed:', error); } } // Example 4: B2C Payment (Business to Customer) async function b2cPaymentExample() { try { const response = await mpesa.businessPayment( 5000, // Amount '254712345678', // Recipient phone number 'Business payment', // Remarks 'https://yourdomain.com/timeout', // Timeout URL 'https://yourdomain.com/result', // Result URL 'Monthly payment' // Occasion (optional) ); console.log('B2C Payment initiated:', response); } catch (error) { console.error('B2C Payment failed:', error); } } // Example 5: C2B Registration async function c2bRegistrationExample() { try { const response = await mpesa.registerC2BUrls({ ShortCode: '600000', ResponseType: 'Completed', ConfirmationURL: 'https://yourdomain.com/c2b/confirmation', ValidationURL: 'https://yourdomain.com/c2b/validation', }); console.log('C2B URLs registered:', response); } catch (error) { console.error('C2B registration failed:', error); } } // Example 6: C2B Simulation async function c2bSimulationExample() { try { const response = await mpesa.simulateC2B({ ShortCode: '600000', CommandID: 'CustomerPayBillOnline', Amount: 1000, Msisdn: '254712345678', BillRefNumber: 'INV001', }); console.log('C2B simulation result:', response); } catch (error) { console.error('C2B simulation failed:', error); } } // Example 7: Account Balance async function accountBalanceExample() { try { const response = await mpesa.getAccountBalance({ InitiatorName: 'testapi', SecurityCredential: 'your_security_credential', CommandID: 'AccountBalance', PartyA: '600000', IdentifierType: '4', Remarks: 'Balance inquiry', QueueTimeOutURL: 'https://yourdomain.com/timeout', ResultURL: 'https://yourdomain.com/result', }); console.log('Account balance request:', response); } catch (error) { console.error('Account balance inquiry failed:', error); } } // Example 8: Transaction Status Query async function transactionStatusExample() { try { const response = await mpesa.getTransactionStatus({ InitiatorName: 'testapi', SecurityCredential: 'your_security_credential', CommandID: 'TransactionStatusQuery', TransactionID: 'OEI2AK4Q16', // Transaction ID to query PartyA: '600000', IdentifierType: '4', ResultURL: 'https://yourdomain.com/result', QueueTimeOutURL: 'https://yourdomain.com/timeout', Remarks: 'Status query', Occasion: 'Transaction inquiry', }); console.log('Transaction status:', response); } catch (error) { console.error('Transaction status query failed:', error); } } // Example 9: Transaction Reversal async function transactionReversalExample() { try { const response = await mpesa.reverseTransaction({ InitiatorName: 'testapi', SecurityCredential: 'your_security_credential', CommandID: 'TransactionReversal', TransactionID: 'OEI2AK4Q16', // Transaction ID to reverse Amount: 1000, ReceiverParty: '600000', RecieverIdentifierType: '4', ResultURL: 'https://yourdomain.com/result', QueueTimeOutURL: 'https://yourdomain.com/timeout', Remarks: 'Transaction reversal', Occasion: 'Error correction', }); console.log('Transaction reversal:', response); } catch (error) { console.error('Transaction reversal failed:', error); } } // Example 10: Handling callbacks import express from 'express'; const app = express(); app.use(express.json()); // STK Push callback handler app.post('/mpesa/stkpush/callback', (req, res) => { const callbackData = req.body; console.log('STK Push callback received:', callbackData); // Process the callback if (callbackData.Body?.stkCallback) { const callback = callbackData.Body.stkCallback; if (callback.ResultCode === 0) { console.log('Payment successful:', callback.CheckoutRequestID); // Update your database, send confirmation, etc. } else { console.log('Payment failed:', callback.ResultDesc); // Handle failed payment } } // Always respond with 200 OK res.status(200).json({ status: 'OK' }); }); // B2C result callback handler app.post('/mpesa/b2c/result', (req, res) => { const resultData = req.body; console.log('B2C result received:', resultData); // Process the result if (resultData.Result) { const result = resultData.Result; if (result.ResultCode === 0) { console.log('B2C payment successful:', result.TransactionID); } else { console.log('B2C payment failed:', result.ResultDesc); } } res.status(200).json({ status: 'OK' }); }); // Run examples async function runExamples() { console.log('Running M-Pesa API examples...'); await stkPushExample(); await c2bRegistrationExample(); await accountBalanceExample(); console.log('Examples completed!'); } // Uncomment to run examples // runExamples().catch(console.error); export { stkPushExample, b2cPaymentExample, c2bRegistrationExample, c2bSimulationExample, accountBalanceExample, transactionStatusExample, transactionReversalExample, };