dry-node
Version:
Initialiseur de structure Node Express typée et modulaire
122 lines (105 loc) • 3.79 kB
JavaScript
require('dotenv').config();
const axios = require('axios');
const DryGenerateCharacterFunction = require("./dry-generate-character.function");
const MOMO_BASE_URL = process.env.MOMO_BASE_URL;
const MOMO_API_KEY = process.env.MOMO_API_KEY;
const X_REFERENCE_ID = process.env.X_REFERENCE_ID;
const CALLBACK_URL = process.env.CALLBACK_URL;
const MOMO_SUBSCRIPTION_KEY = "16c784e9b34c42dcaead6e5f8a650a63";
const MOMO_CURRENCY = "XAF"; // Franc CFA
async function DryPaymentMomo1(phone, amount, currency){
try {
const transactionId = DryGenerateCharacterFunction(12, 'ABCDEF0123456789'); // ID transaction personnalisé
const success = await makePayment(phone, amount, transactionId);
if (success) {
console.log("Paiement initié, en attente de confirmation...");
}
} catch (error) {
console.error("Échec du paiement:", error);
}
}
/**
* Get Token
* @returns {Promise<any>}
*/
async function getAccessToken() {
console.log(MOMO_BASE_URL);
console.log("MOMO_API_KEY",MOMO_API_KEY);
try {
const response = await axios.post(`${MOMO_BASE_URL}/collection/token/`, {}, {
headers: {
Authorization: `Basic ${Buffer.from(
`${MOMO_API_KEY}:${MOMO_SUBSCRIPTION_KEY}`
).toString("base64")}`,
},
});
return response.data.access_token;
} catch (error) {
console.error("Erreur d'authentification:", error.response?.data || error.message);
throw error;
}
}
/**
* Make a payment
* @param phoneNumber
* @param amount
* @param externalId
* @returns {Promise<boolean>}
*/
async function makePayment(phoneNumber, amount, externalId) {
const accessToken = await getAccessToken();
const payload = {
amount: amount.toString(),
currency: MOMO_CURRENCY,
externalId: externalId,
payer: {
partyIdType: "MSISDN",
partyId: phoneNumber
},
payerMessage: "Paiement pour service",
payeeNote: "Merci pour votre achat"
};
try {
const response = await axios.post(`${MOMO_BASE_URL}/collection/v1_0/requesttopay`, payload, {
headers: {
'Authorization': `Bearer ${accessToken}`,
'X-Reference-Id': X_REFERENCE_ID,
'X-Target-Environment': 'sandbox',
'Ocp-Apim-Subscription-Key': MOMO_API_KEY,
'Content-Type': 'application/json',
'X-Callback-Url': CALLBACK_URL
}
});
console.log("Paiement en attente de confirmation:", response.status);
return response.status === 202; // 202 = Requête acceptée
} catch (error) {
console.error("Erreur de paiement:", error.response?.data || error.message);
throw error;
}
}
/**
* Check payment status
* @param referenceId
* @returns {Promise<any>}
*/
async function checkPaymentStatus(referenceId) {
const accessToken = await getAccessToken();
try {
const response = await axios.get(`${MOMO_BASE_URL}/collection/v1_0/requesttopay/${referenceId}`, {
headers: {
'Authorization': `Bearer ${accessToken}`,
'X-Target-Environment': 'sandbox',
'Ocp-Apim-Subscription-Key': MOMO_API_KEY,
'Content-Type': 'application/json'
}
});
return response.data;
} catch (error) {
console.error("Erreur lors de la vérification:", error.response?.data || error.message);
throw error;
}
}
module.exports = {
DryPaymentMomo1,
checkPaymentStatus
}