@dankira/niubiz
Version:
A simple library for integrating with the niubiz API
227 lines (223 loc) • 9.84 kB
JavaScript
/**
* @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