@mygateway/mygateway-three-ds-sdk-frontend
Version:
183 lines (150 loc) • 5.22 kB
JavaScript
function isUuid(uuid) {
const pattern =
/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
if (pattern.test(uuid)) {
return true;
}
return false;
}
function isWithinOneHour(dateStr1, dateStr2) {
function parseRFC1123Date(str) {
// Divide a string por espaços:
// ["Mon,", "17", "Feb", "2025", "13:34:25", "GMT"]
const parts = str.split(" ");
const day = parseInt(parts[1], 10);
const monthStr = parts[2];
const year = parseInt(parts[3], 10);
const [hour, minute, second] = parts[4].split(":").map(Number);
// Mapeamento dos meses para número (0 = Janeiro, 11 = Dezembro)
const monthMap = {
Jan: 0,
Feb: 1,
Mar: 2,
Apr: 3,
May: 4,
Jun: 5,
Jul: 6,
Aug: 7,
Sep: 8,
Oct: 9,
Nov: 10,
Dec: 11,
};
const month = monthMap[monthStr];
// Converte para timestamp em UTC
return Date.UTC(year, month, day, hour, minute, second);
}
// Função para converter dateStr2 no formato "YYYY-MM-DD HH:MM:SS"
function parseCustomDate(str) {
const [datePart, timePart] = str.split(" ");
const [year, month, day] = datePart.split("-").map(Number);
const [hour, minute, second] = timePart.split(":").map(Number);
// Note que o mês é subtraído por 1, pois Date.UTC espera 0-11 para o mês
return Date.UTC(year, month - 1, day, hour, minute, second);
}
// Converte ambas as datas para timestamps
const time1 = parseRFC1123Date(dateStr1);
const time2 = parseCustomDate(dateStr2);
// Calcula a diferença absoluta entre os dois timestamps
const diffInMs = Math.abs(time1 - time2);
// 1 hora = 3.600.000 milissegundos
return diffInMs <= 3600000;
}
function injectAdiqScript(organizationId, orgId, sessionId) {
const existScript = document.getElementById("challengeScript");
if (!!existScript) return;
const script = document.createElement("script");
script.id = "challengeScript";
script.type = "text/javascript";
script.src = `https://h.online-metrix.net/fp/tags.js?org_id=${orgId}&session_id=${organizationId}${sessionId}`;
script.async = true;
document.head.appendChild(script);
}
function injectAdiqIframe(organizationId, orgId, sessionId) {
const existIframe = document.getElementById("challengeIframe");
if (!!existIframe) return;
const noscript = document.createElement("noscript");
const iframe = document.createElement("iframe");
iframe.id = "challengeIframe";
iframe.style.width = "100px";
iframe.style.height = "100px";
iframe.style.border = "0";
iframe.style.position = "absolute";
iframe.style.top = "-5000px";
iframe.src = `https://h.online-metrix.net/fp/tags.js?org_id=${orgId}&session_id=${organizationId}${sessionId}`;
noscript.appendChild(iframe);
document.body.appendChild(noscript);
}
function injectAdiqInput(sessionId) {
const existInput = document.getElementById("codeAntiFraud");
if (!!existInput) return;
const hiddenDiv = document.querySelector("div[hidden]");
if (hiddenDiv) {
const input = document.createElement("input");
input.type = "text";
input.id = "codeAntiFraud";
input.name = "codeAntiFraud";
input.value = sessionId;
hiddenDiv.appendChild(input);
}
}
class MyGateway3DS {
callback;
threeDsType;
threeDs;
constructor(
inputName = "ccnum",
callback,
threeDsType = 1,
sessionId,
options
) {
this.callback = callback;
this.threeDsType = threeDsType;
if (
!!!inputName ||
!!!callback ||
!!!threeDsType ||
!!!sessionId ||
!!!options
)
throw new Error("Configuração inválida");
const crypt = options.crypt.split("$$");
const location = atob(crypt[0]);
const guid1 = crypt[1];
const object = JSON.parse(atob(crypt[2]));
const guid2 = crypt[3];
const seed = atob(options.seed);
const now = new Date().toUTCString();
if (window.location.origin.toLowerCase() !== location.toLowerCase()) {
throw new Error("Configuração inválida");
}
if (!isUuid(guid1) || !isUuid(guid2)) {
throw new Error("Configuração inválida");
}
if (!isWithinOneHour(now, seed)) {
throw new Error("Configuração inválida");
}
if (object.sessionId !== sessionId) {
throw new Error("Sessão inválida");
}
if (threeDsType == 1) {
const data = object.providerExternalOne;
const organizationId = atob(data.organizationId);
const orgId = atob(data.orgId);
injectAdiqScript(organizationId, orgId, sessionId);
injectAdiqIframe(organizationId, orgId, sessionId);
injectAdiqInput(sessionId);
this.threeDs = new Adiq3ds(inputName, callback);
}
}
async Authorization3ds() {
return await this.threeDs.Authorization3ds();
}
GetThreeDsCode() {
return this.threeDs.getThreeDsCode();
}
InitChallenge(acsUrl, pareq, authTransactionId) {
return this.threeDs.InitChallenge(acsUrl, pareq, authTransactionId);
}
}