UNPKG

@dankira/niubiz

Version:

A simple library for integrating with the niubiz API

227 lines (223 loc) 9.84 kB
/** * @statics */ const VISA_DEV_MERCHANT_ID = '456879852'; const initial = { production: false, VISA_DEV_MERCHANT_ID: VISA_DEV_MERCHANT_ID, VISA_DEV_USER: 'integraciones@niubiz.com.pe', VISA_DEV_PWD: '_7z3@8fF', VISA_DEV_URL_SECURITY: 'https://apisandbox.vnforappstest.com/api.security/v1/security', VISA_DEV_URL_SESSION: `https://apisandbox.vnforappstest.com/api.ecommerce/v2/ecommerce/token/session/`, VISA_DEV_URL_JS: 'https://static-content-qas.vnforapps.com/env/sandbox/js/checkout.js', VISA_DEV_URL_AUTHORIZATION: `https://apisandbox.vnforappstest.com/api.authorization/v3/authorization/ecommerce/`, VISA_PROD_MERCHANT_ID: '', VISA_PROD_USER: '', VISA_PROD_PWD: '', VISA_PROD_URL_SECURITY: 'https://apiprod.vnforapps.com/api.security/v1/security', VISA_PROD_URL_SESSION: `https://apiprod.vnforapps.com/api.ecommerce/v2/ecommerce/token/session/`, VISA_PROD_URL_JS: 'https://static-content.vnforapps.com/v2/js/checkout.js', VISA_PROD_URL_AUTHORIZATION: `https://apiprod.vnforapps.com/api.authorization/v3/authorization/ecommerce/`, proxy_url: 'https://app.blocmin.com/api/capture_pay', logo: 'https://i.ibb.co/1JtQKJNk/logo-with.png', responseUrl: '/' }; const payment = { amount: 0, antifraud: { clientIp: '', merchantDefineData: { MDD4: '', MDD21: 0, MDD32: '', MDD75: '', MDD77: 0 } }, channel: 'web' }; const getDomain = () => { const protocolo = window.location.protocol; const dominio = window.location.hostname; return `${protocolo}//${dominio}`; }; const generateSesion = async (token, payment) => { const sessionData = payment; let url = initial.production ? initial.VISA_PROD_URL_SESSION : initial.VISA_DEV_URL_SESSION; try { const response = await fetch(`${url}${initial.production ? initial.VISA_PROD_MERCHANT_ID : initial.VISA_DEV_MERCHANT_ID}`, { method: "POST", headers: { "Content-Type": "application/json", "Authorization": `${token}` }, body: JSON.stringify(sessionData) }); if (!response.ok) { throw new Error(`Error HTTP: ${response.status}`); } const data = await response.json(); console.log("Sesión generada:", data); return data.sessionKey; } catch (error) { console.error("Error generando sesión:", error); return null; } }; const generatePurchaseNumber = () => { return Date.now().toString().slice(-12); }; let token = null; const setInitialConfig = (config) => { Object.assign(initial, config); }; const setPaymentConfig = (config) => { Object.assign(payment, config); }; async function getVisaSession() { const url = initial.production ? initial.VISA_PROD_URL_SECURITY : initial.VISA_DEV_URL_SECURITY; const user = initial.production ? initial.VISA_PROD_USER : initial.VISA_DEV_USER; const password = initial.production ? initial.VISA_PROD_PWD : initial.VISA_DEV_PWD; const headers = new Headers({ "Accept": "*/*", "Authorization": "Basic " + btoa(`${user}:${password}`) }); try { const response = await fetch(url, { method: "POST", headers: headers }); if (!response.ok) { throw new Error(`Error HTTP: ${response.status}`); } token = await response.text(); const sessionKey = await generateSesion(token, payment); return sessionKey; } catch (error) { console.error("Error en la solicitud:", error); return null; } } const captureSubmit = async (e) => { e.preventDefault(); console.log('Formulario enviado:', e); }; const setup = async () => { const script = document.createElement("script"); const frmVisaNet = document.getElementById("frmVisaNet"); if (!frmVisaNet) { console.error("No se encontró el formulario con id 'frmVisaNet'"); return; } frmVisaNet.addEventListener("submit", captureSubmit); // Capturar el submit y prevenir recarga const sessionKey = await getVisaSession(); script.src = initial.production ? initial.VISA_PROD_URL_JS : initial.VISA_DEV_URL_JS; script.setAttribute("data-sessiontoken", sessionKey); script.setAttribute("data-channel", "web"); script.setAttribute("data-merchantid", initial.production ? initial.VISA_PROD_MERCHANT_ID : initial.VISA_DEV_MERCHANT_ID); script.setAttribute("data-merchantlogo", initial.logo ?? ""); script.setAttribute("data-purchasenumber", generatePurchaseNumber()); script.setAttribute("data-amount", payment.amount.toString()); script.setAttribute("data-expirationminutes", "5"); script.setAttribute("data-timeouturl", '/'); const params = { purchaseNumber: script.getAttribute("data-purchasenumber"), amount: script.getAttribute("data-amount"), responseUrl: `${getDomain()}${initial.responseUrl}`, token: token, production: initial.production, merchantId: script.getAttribute("data-merchantid"), }; const queryString = Object.entries(params) .map(([key, value]) => `${key}=${encodeURIComponent(value?.toString() ?? '')}`) .join('&'); frmVisaNet.action = `${initial.proxy_url}?${queryString}`; frmVisaNet.appendChild(script); }; const formatResponse = (callback) => { const urlParams = new URLSearchParams(window.location.search); let paramsObject = {}; urlParams.forEach((value, key) => { paramsObject[key] = value; }); const headersAndDataMap = { header: { ecoreTransactionUUID: paramsObject["header[ecoreTransactionUUID]"] || "", ecoreTransactionDate: paramsObject["header[ecoreTransactionDate]"] || "", millis: paramsObject["header[millis]"] || "" }, fulfillment: { channel: paramsObject["fulfillment[channel]"] || "", merchantId: paramsObject["fulfillment[merchantId]"] || "", terminalId: paramsObject["fulfillment[terminalId]"] || "", captureType: paramsObject["fulfillment[captureType]"] || "", countable: paramsObject["fulfillment[countable]"] || "", fastPayment: paramsObject["fulfillment[fastPayment]"] || "", signature: paramsObject["fulfillment[signature]"] || "" }, order: { tokenId: paramsObject["order[tokenId]"] || "", purchaseNumber: paramsObject["order[purchaseNumber]"] || "", amount: paramsObject["order[amount]"] || "", installment: paramsObject["order[installment]"] || "", currency: paramsObject["order[currency]"] || "", authorizedAmount: paramsObject["order[authorizedAmount]"] || "", authorizationCode: paramsObject["order[authorizationCode]"] || "", actionCode: paramsObject["order[actionCode]"] || "", traceNumber: paramsObject["order[traceNumber]"] || "", transactionDate: paramsObject["order[transactionDate]"] || "", transactionId: paramsObject["order[transactionId]"] || "" }, dataMap: { TERMINAL: paramsObject["dataMap[TERMINAL]"] || "", BRAND_ACTION_CODE: paramsObject["dataMap[BRAND_ACTION_CODE]"] || "", BRAND_HOST_DATE_TIME: paramsObject["dataMap[BRAND_HOST_DATE_TIME]"] || "", TRACE_NUMBER: paramsObject["dataMap[TRACE_NUMBER]"] || "", CARD_TYPE: paramsObject["dataMap[CARD_TYPE]"] || "", ECI_DESCRIPTION: paramsObject["dataMap[ECI_DESCRIPTION]"] || "", SIGNATURE: paramsObject["dataMap[SIGNATURE]"] || "", CARD: paramsObject["dataMap[CARD]"] || "", MERCHANT: paramsObject["dataMap[MERCHANT]"] || "", STATUS: paramsObject["dataMap[STATUS]"] || "", INSTALLMENTS_INFO: paramsObject["dataMap[INSTALLMENTS_INFO]"] || "", ACTION_DESCRIPTION: paramsObject["dataMap[ACTION_DESCRIPTION]"] || "", ID_UNICO: paramsObject["dataMap[ID_UNICO]"] || "", AMOUNT: paramsObject["dataMap[AMOUNT]"] || "", BRAND_HOST_ID: paramsObject["dataMap[BRAND_HOST_ID]"] || "", AUTHORIZATION_CODE: paramsObject["dataMap[AUTHORIZATION_CODE]"] || "", YAPE_ID: paramsObject["dataMap[YAPE_ID]"] || "", CURRENCY: paramsObject["dataMap[CURRENCY]"] || "", TRANSACTION_DATE: paramsObject["dataMap[TRANSACTION_DATE]"] || "", ACTION_CODE: paramsObject["dataMap[ACTION_CODE]"] || "", CVV2_VALIDATION_RESULT: paramsObject["dataMap[CVV2_VALIDATION_RESULT]"] || "", ECI: paramsObject["dataMap[ECI]"] || "", ID_RESOLUTOR: paramsObject["dataMap[ID_RESOLUTOR]"] || "", BRAND: paramsObject["dataMap[BRAND]"] || "", ADQUIRENTE: paramsObject["dataMap[ADQUIRENTE]"] || "", QUOTA_AMOUNT: paramsObject["dataMap[QUOTA_AMOUNT]"] || "", BRAND_NAME: paramsObject["dataMap[BRAND_NAME]"] || "", PROCESS_CODE: paramsObject["dataMap[PROCESS_CODE]"] || "", TRANSACTION_ID: paramsObject["dataMap[TRANSACTION_ID]"] || "" } }; if (callback) { if (urlParams.size == 0) { return; } if (!headersAndDataMap.dataMap.ACTION_CODE) { callback({ code: 400, res: "error", message: "No se recibió información de la transacción valida" }); return; } else { callback(headersAndDataMap); } } }; export { formatResponse, setInitialConfig, setPaymentConfig, setup }; //# sourceMappingURL=niubiz.esm.js.map