mpesa-mz-sdk
Version:
SDK para integração com a API M-Pesa de Moçambique
214 lines (213 loc) • 11.5 kB
JavaScript
;
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();
}