UNPKG

mpesa-mz-sdk

Version:

SDK para integração com a API M-Pesa de Moçambique

214 lines (213 loc) 11.5 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.MpesaError = exports.generateUniqueReference = exports.MpesaService = void 0; // src/index.ts const mpesa_service_1 = require("./mpesa-service"); Object.defineProperty(exports, "MpesaService", { enumerable: true, get: function () { return mpesa_service_1.MpesaService; } }); Object.defineProperty(exports, "MpesaError", { enumerable: true, get: function () { return mpesa_service_1.MpesaError; } }); const utils_1 = require("./utils"); Object.defineProperty(exports, "generateUniqueReference", { enumerable: true, get: function () { return utils_1.generateUniqueReference; } }); // Load environment variables from .env file const dotenv = __importStar(require("dotenv")); dotenv.config(); async function runExample() { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r; const config = { apiKey: process.env.MPESA_API_KEY, publicKey: process.env.MPESA_PUBLIC_KEY, serviceProviderCode: process.env.MPESA_SERVICE_PROVIDER_CODE, origin: process.env.MPESA_ORIGIN, timeout: 60000, // 60 seconds timeout for requests env: process.env.MPESA_ENV // Novo campo para ambiente }; // Basic validation of environment variables for (const key in config) { if (key !== 'timeout' && !config[key]) { console.error(`Error: Environment variable ${key.toUpperCase()} not defined. Please check your .env file.`); process.exit(1); } } const mpesa = new mpesa_service_1.MpesaService(config); try { // --- Nenhuma chamada explícita para getAccessToken é necessária aqui --- console.log('--- Public Key sendo usada diretamente como token de acesso ---'); console.log('\n--- Initiating C2B Payment (Customer to Business) ---'); // IMPORTANT: Use test MSISDNs provided by M-Pesa for sandbox environment const customerMsisdnC2B = '25884xxxxxxx'; // REPLACE with a valid sandbox test MSISDN const amountC2B = 10.00; const trxRefC2B = 'T12344C'; const thirdPartyRefC2B = '0UEM53'; console.log(`C2B Payload: Amount=${amountC2B}, MSISDN=${customerMsisdnC2B}, Ref=${trxRefC2B}`); const c2bResponse = await mpesa.c2b({ amount: amountC2B, number: customerMsisdnC2B, transactionReference: trxRefC2B, thirdPartyReference: thirdPartyRefC2B }); console.log('C2B Response:', { status: c2bResponse.status, message: c2bResponse.message, transactionId: (_a = c2bResponse.data) === null || _a === void 0 ? void 0 : _a.transactionId, amount: (_b = c2bResponse.data) === null || _b === void 0 ? void 0 : _b.amount }); // Wait a bit before querying, as C2B might be asynchronous await new Promise(resolve => setTimeout(resolve, 5000)); console.log('\n--- Querying C2B Transaction Status ---'); if ((_c = c2bResponse.data) === null || _c === void 0 ? void 0 : _c.transactionId) { console.log(`Querying Transaction ID: ${c2bResponse.data.transactionId}`); const queryResponseC2B = await mpesa.query({ queryReference: c2bResponse.data.transactionId, thirdPartyReference: thirdPartyRefC2B }); console.log('C2B Transaction Query Response:', { status: queryResponseC2B.status, message: queryResponseC2B.message, transactionStatus: (_d = queryResponseC2B.data) === null || _d === void 0 ? void 0 : _d.transactionStatus, paymentStatus: (_e = queryResponseC2B.data) === null || _e === void 0 ? void 0 : _e.paymentStatusDesc }); } else { console.warn('C2B transaction ID not available in response for query.'); } console.log('\n--- Initiating B2C Payment (Business to Customer) ---'); // IMPORTANT: Use test MSISDNs provided by M-Pesa for sandbox environment const receiverMsisdnB2C = '25884yyyyyyy'; // REPLACE with a valid sandbox test MSISDN const amountB2C = 5.00; const trxRefB2C = (0, utils_1.generateUniqueReference)('B2C'); const thirdPartyRefB2C = (0, utils_1.generateUniqueReference)('TPB2C'); console.log(`B2C Payload: Amount=${amountB2C}, MSISDN=${receiverMsisdnB2C}, Ref=${trxRefB2C}`); const b2cResponse = await mpesa.b2c({ amount: amountB2C, number: receiverMsisdnB2C, transactionReference: trxRefB2C, thirdPartyReference: thirdPartyRefB2C }); console.log('B2C Response:', { status: b2cResponse.status, message: b2cResponse.message, transactionId: (_f = b2cResponse.data) === null || _f === void 0 ? void 0 : _f.transactionId, amount: (_g = b2cResponse.data) === null || _g === void 0 ? void 0 : _g.amount, recipient: `${((_h = b2cResponse.data) === null || _h === void 0 ? void 0 : _h.recipientFirstName) || ''} ${((_j = b2cResponse.data) === null || _j === void 0 ? void 0 : _j.recipientLastName) || ''}`.trim() }); // Wait a bit before querying await new Promise(resolve => setTimeout(resolve, 5000)); console.log('\n--- Querying B2C Transaction Status ---'); if ((_k = b2cResponse.data) === null || _k === void 0 ? void 0 : _k.transactionId) { console.log(`Querying Transaction ID: ${b2cResponse.data.transactionId}`); const queryResponseB2C = await mpesa.query({ queryReference: b2cResponse.data.transactionId, thirdPartyReference: thirdPartyRefB2C }); console.log('B2C Transaction Query Response:', { status: queryResponseB2C.status, message: queryResponseB2C.message, transactionStatus: (_l = queryResponseB2C.data) === null || _l === void 0 ? void 0 : _l.transactionStatus, paymentStatus: (_m = queryResponseB2C.data) === null || _m === void 0 ? void 0 : _m.paymentStatusDesc }); } else { console.warn('B2C transaction ID not available in response for query.'); } // --- Exemplo de B2B --- console.log('\n--- Initiating B2B Payment (Business to Business) ---'); const primaryPartyCodeB2B = 'COMPANY001'; // Código da empresa que envia const recipientPartyCodeB2B = 'COMPANY002'; // Código da empresa que recebe const amountB2B = 200.00; const trxRefB2B = (0, utils_1.generateUniqueReference)('B2B'); const thirdPartyRefB2B = (0, utils_1.generateUniqueReference)('TPB2B'); console.log(`B2B Payload: Amount=${amountB2B}, From=${primaryPartyCodeB2B}, To=${recipientPartyCodeB2B}, Ref=${trxRefB2B}`); const b2bResponse = await mpesa.b2b({ amount: amountB2B, primaryPartyCode: primaryPartyCodeB2B, recipientPartyCode: recipientPartyCodeB2B, transactionReference: trxRefB2B, thirdPartyReference: thirdPartyRefB2B }); console.log('B2B Response:', { status: b2bResponse.status, message: b2bResponse.message, transactionId: (_o = b2bResponse.data) === null || _o === void 0 ? void 0 : _o.transactionId, amount: (_p = b2bResponse.data) === null || _p === void 0 ? void 0 : _p.amount, from: (_q = b2bResponse.data) === null || _q === void 0 ? void 0 : _q.primaryPartyCode, to: (_r = b2bResponse.data) === null || _r === void 0 ? void 0 : _r.recipientPartyCode }); // --- Example of a Reversal (Uncomment to test) --- // console.log('\n--- Attempting to Reverse a Transaction ---'); // const originalTransactionIdToReverse = 'MPA_TRANS_ID_FROM_PREVIOUS_SUCCESSFUL_C2B'; // Replace with an actual transaction ID that can be reversed in sandbox // const reversalAmount = 5.00; // const reversalThirdPartyRef = generateUniqueReference('REV'); // console.log(`Reversal Payload: Original Trx ID=${originalTransactionIdToReverse}, Amount=${reversalAmount}, Ref=${reversalThirdPartyRef}`); // const reversalResponse = await mpesa.reversal({ // originalTransactionId: originalTransactionIdToReverse, // reversalAmount: reversalAmount, // thirdPartyReference: reversalThirdPartyRef // }); // // console.log('Reversal Response:', { // status: reversalResponse.status, // message: reversalResponse.message, // transactionId: reversalResponse.data?.transactionId, // originalTransactionId: reversalResponse.data?.originalTransactionId, // reversalAmount: reversalResponse.data?.reversalAmount // }); } catch (error) { if (error instanceof mpesa_service_1.MpesaError) { console.error('\n--- M-Pesa API Error Details ---'); console.error(` Message: ${error.message}`); console.error(` M-Pesa Code: ${error.details.code}`); console.error(` M-Pesa Description: ${error.details.description}`); console.error(` HTTP Status: ${error.details.httpStatus}`); if (error.details.transactionId) console.error(` Transaction ID: ${error.details.transactionId}`); if (error.details.conversationId) console.error(` Conversation ID: ${error.details.conversationId}`); if (error.details.thirdPartyReference) console.error(` Third Party Reference: ${error.details.thirdPartyReference}`); } else { console.error('\n--- Unexpected Error ---'); console.error(' Error:', error); if (error instanceof Error) { console.error(' Stack:', error.stack); } } } } // Run the example when the script is executed directly if (require.main === module) { runExample(); }