dry-node
Version:
Initialiseur de structure Node Express typée et modulaire
210 lines (164 loc) • 6.3 kB
JavaScript
const btoa = require("btoa");
const request = require("request");
const uuid = require("uuid");
const {post} = require("axios");
/*** VARIABLE **/
const UUID = uuid.v1();
const { APP_ENV, MOMO_PRIMARY_KEY,MOMO_API_KEY, MOMO_API_USER, MOMO_SUBSCRIPTION_KEY, MOMO_TARGET_ENV, MOMO_BASE_URL } = process.env;
async function DryPaymentMomoLastFunction(phoneNumber, amount, currency, reference) {
if(APP_ENV === "DEV"){
try {
console.log("data", APP_ENV);
const accessToken = await getAccessToken();
const data = await makePayment(accessToken, phoneNumber, amount, currency, reference);
console.log("data", data);
return data;
} catch (error) {
console.error('Erreur :', error.response ? error.response.data : error.message);
}
}else{
// Generate token
const _data = {
phoneNumber,
amount,
currency,
reference
}
const data = await generateUserToken(_data, 'pay');
data.environment = process.env.ENVIRONMENT;
data.UUID = UUID;
}
}
/*** GET TOKEN **/
async function getAccessToken() {
console.log("commme", MOMO_BASE_URL+'/collection/token/', MOMO_PRIMARY_KEY);
const response = await post(MOMO_BASE_URL+'/collection/token', {}, {
auth: {
username: MOMO_PRIMARY_KEY,
password: UUID,
},
});
console.log('response', response);
return response.data.access_token;
}
/*** MAKE PAYMENT **/
async function makePayment(accessToken, phone, amount, currency, reference) {
const paymentData = {
amount: amount,
currency: currency, // Changer la devise selon votre besoin
external_id: reference, // Identifiant unique de la transaction
payee: {
party_id_type: 'MSISDN',
party_id: phone, // Numéro de téléphone du bénéficiaire
},
payer_message: 'Paiement de test',
payee_note: 'Note de test',
};
return post(MOMO_BASE_URL + '/collection/v1_0/requesttopay', paymentData, {
headers: {
'Authorization': `Bearer ${accessToken}`,
'X-Target-Environment': 'sandbox',
},
});
}
/*** GENERATE USER TOKEN **/
const generateUserToken = async ( data, label) => {
// encoding to base64
let authorizationBasic = btoa(MOMO_API_USER + ":" + MOMO_API_KEY);
let request = require("request");
let options = {
method: "POST",
url: MOMO_BASE_URL +"/collection/token/",
headers: {
"Ocp-Apim-Subscription-Key": MOMO_PRIMARY_KEY,
Authorization: "Basic " + authorizationBasic,
},
};
return new Promise(function (resolve, reject) {
request(options, async function (error, response) {
if (error) throw new Error(error);
console.log(response.statusCode);
console.log("user token generated successfully ...", response.body);
const token = JSON.parse(response.body).access_token;
console.log(token);
if (token) {
console.log("sending request to pay");
console.log("STEP FIVE");
let result;
if(label === 'pay'){
result = await sendRequestToPay(token, data);
}
if(label === 'check'){
console.log('ISCHELK');
result = await getTransactionStatus(token)
}
resolve(result)
}
});
});
}
/*** SEND REQUEST TO PAY **/
const sendRequestToPay = async ( token, data) => {
const request = require("request");
const reference = data.reference;
const numberPhone = data.number;
const amount = data.amount;
const options = {
method: "POST",
url: process.env.MTN_ENV + "collection/v1_0/requesttopay",
headers: {
"Content-Type": "application/json",
"X-Reference-Id": UUID,
"X-Target-Environment": MOMO_TARGET_ENV,
"Ocp-Apim-Subscription-Key": MOMO_PRIMARY_KEY,
Authorization: "Bearer " + token,
'X-Callback-Url': MOMO_BASE_URL+"/v1/mtn/payment"
},
body: JSON.stringify({
amount: amount,
currency: "XAF",
externalId: reference+ "_"+ new Date().getTime(),
// payer: { partyIdType: "MSISDN", partyId: "242067008940" },
payer: { partyIdType: "MSISDN", partyId: numberPhone },
payerMessage: "Achat de billet SimoWay",
payeeNote: "Achat de billet SimoWay pour la reservation : " + reference ,
}),
};
return new Promise(function (resolve, reject) {
request(options, async function (error, response) {
if (error) throw new Error(error);
const requestToPay = response.statusCode;
if (requestToPay === "202") {
console.log(
"request to pay sent successfully ...... "
);
const result = await getTransactionStatus(token);
resolve(result)
}
});
});
}
/*** GETTING TRANSACTION **/
const getTransactionStatus = async (token) => {
const request = require("request");
let target = "sandbox";
if(process.env.ENVIRONMENT === 'production'){
target ='mtncongo';
}
const options = {
method: "GET",
url: MOMO_BASE_URL +`collection/v1_0/requesttopay/${UUID}`,
headers: {
"X-Target-Environment": MOMO_TARGET_ENV,
"Ocp-Apim-Subscription-Key": MOMO_PRIMARY_KEY,
Authorization: "Bearer " + token,
},
};
return new Promise(function (resolve, reject) {
request(options, async function (error, response) {
if (error) throw new Error(error);
resolve( JSON.parse(response.body));
});
});
}
module.exports = DryPaymentMomoLastFunction;