UNPKG

dry-node

Version:

Initialiseur de structure Node Express typée et modulaire

210 lines (164 loc) 6.3 kB
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;