/* * Payment-UXE */ /* * Payment-UXE */ var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var baseUrl = 'https://paymentuxe-prod.cloud.motorola.net'; /* jshint ignore:start */ // ADDED TO PROJECT TO SATISFY JSON STRINGIFY/PARSE IMPLEMENTATIONS ON OLD BROWSERS /*jslint eval, for, this */ /*property JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours, getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join, lastIndex, length, parse, prototype, push, replace, slice, stringify, test, toJSON, toString, valueOf */ if (typeof JSON !== "object") { JSON = {}; } (function () { "use strict"; var rx_one = /^[\],:{}\s]*$/; var rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g; var rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g; var rx_four = /(?:^|:|,)(?:\s*\[)+/g; var rx_escapable = /[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g; var rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g; function f(n) { // Format integers to have at least two digits. return (n < 10) ? "0" + n : n; } function this_value() { return this.valueOf(); } if (typeof Date.prototype.toJSON !== "function") { Date.prototype.toJSON = function () { return isFinite(this.valueOf()) ? (this.getUTCFullYear() + "-" + f(this.getUTCMonth() + 1) + "-" + f(this.getUTCDate()) + "T" + f(this.getUTCHours()) + ":" + f(this.getUTCMinutes()) + ":" + f(this.getUTCSeconds()) + "Z") : null; }; Boolean.prototype.toJSON = this_value; Number.prototype.toJSON = this_value; String.prototype.toJSON = this_value; } var gap; var indent; var meta; var rep; function quote(string) { rx_escapable.lastIndex = 0; return rx_escapable.test(string) ? "\"" + string.replace(rx_escapable, function (a) { var c = meta[a]; return typeof c === "string" ? c : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4); }) + "\"" : "\"" + string + "\""; } function str(key, holder) { var i; // The loop counter. var k; // The member key. var v; // The member value. var length; var mind = gap; var partial; var value = holder[key]; if (value && typeof value === "object" && typeof value.toJSON === "function") { value = value.toJSON(key); } if (typeof rep === "function") { value = rep.call(holder, key, value); } switch (typeof value) { case "string": return quote(value); case "number": return (isFinite(value)) ? String(value) : "null"; case "boolean": case "null": return String(value); case "object": if (!value) { return "null"; } gap += indent; partial = []; if (Object.prototype.toString.apply(value) === "[object Array]") { length = value.length; for (i = 0; i < length; i += 1) { partial[i] = str(i, value) || "null"; } v = partial.length === 0 ? "[]" : gap ? ("[\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "]") : "[" + partial.join(",") + "]"; gap = mind; return v; } if (rep && typeof rep === "object") { length = rep.length; for (i = 0; i < length; i += 1) { if (typeof rep[i] === "string") { k = rep[i]; v = str(k, value); if (v) { partial.push(quote(k) + ((gap) ? ": " : ":") + v); } } } } else { for (k in value) { if (Object.prototype.hasOwnProperty.call(value, k)) { v = str(k, value); if (v) { partial.push(quote(k) + ((gap) ? ": " : ":") + v); } } } } v = partial.length === 0 ? "{}" : gap ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}" : "{" + partial.join(",") + "}"; gap = mind; return v; } } if (typeof JSON.stringify !== "function") { meta = { "\b": "\\b", "\t": "\\t", "\n": "\\n", "\f": "\\f", "\r": "\\r", "\"": "\\\"", "\\": "\\\\" }; JSON.stringify = function (value, replacer, space) { var i; gap = ""; indent = ""; if (typeof space === "number") { for (i = 0; i < space; i += 1) { indent += " "; } } else if (typeof space === "string") { indent = space; } rep = replacer; if (replacer && typeof replacer !== "function" && (typeof replacer !== "object" || typeof replacer.length !== "number")) { throw new Error("JSON.stringify"); } return str("", { "": value }); }; } if (typeof JSON.parse !== "function") { JSON.parse = function (text, reviver) { var j; function walk(holder, key) { var k; var v; var value = holder[key]; if (value && typeof value === "object") { for (k in value) { if (Object.prototype.hasOwnProperty.call(value, k)) { v = walk(value, k); if (v !== undefined) { value[k] = v; } else { delete value[k]; } } } } return reviver.call(holder, key, value); } text = String(text); rx_dangerous.lastIndex = 0; if (rx_dangerous.test(text)) { text = text.replace(rx_dangerous, function (a) { return ("\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4)); }); } if (rx_one.test(text .replace(rx_two, "@@") .replace(rx_three, "]") .replace(rx_four, ""))) { j = eval("(" + text + ")"); return (typeof reviver === "function") ? walk({ "": j }, "") : j; } throw new SyntaxError("JSON.parse"); }; } }()); /* jshint ignore:end */ !function (e) { function n() { } function t(e, n) { return function () { e.apply(n, arguments); }; } function o(e) { if ("object" != typeof this) throw new TypeError("Promises must be constructed via new"); if ("function" != typeof e) throw new TypeError("not a function"); this._state = 0, this._handled = !1, this._value = void 0, this._deferreds = [], s(e, this); } function i(e, n) { for (; 3 === e._state;) e = e._value; return 0 === e._state ? void e._deferreds.push(n) : (e._handled = !0, void o._immediateFn(function () { var t = 1 === e._state ? n.onFulfilled : n.onRejected; if (null === t) return void (1 === e._state ? r : u)(n.promise, e._value); var o; try { o = t(e._value); } catch (i) { return void u(n.promise, i); } r(n.promise, o); })); } function r(e, n) { try { if (n === e) throw new TypeError("A promise cannot be resolved with itself."); if (n && ("object" == typeof n || "function" == typeof n)) { var i = n.then; if (n instanceof o) return e._state = 3, e._value = n, void f(e); if ("function" == typeof i) return void s(t(i, n), e); } e._state = 1, e._value = n, f(e); } catch (r) { u(e, r); } } function u(e, n) { e._state = 2, e._value = n, f(e); } function f(e) { 2 === e._state && 0 === e._deferreds.length && o._immediateFn(function () { e._handled || o._unhandledRejectionFn(e._value); }); for (var n = 0, t = e._deferreds.length; n < t; n++) i(e, e._deferreds[n]); e._deferreds = null; } function c(e, n, t) { this.onFulfilled = "function" == typeof e ? e : null, this.onRejected = "function" == typeof n ? n : null, this.promise = t; } function s(e, n) { var t = !1; try { e(function (e) { t || (t = !0, r(n, e)); }, function (e) { t || (t = !0, u(n, e)); }); } catch (o) { if (t) return; t = !0, u(n, o); } } var a = setTimeout; o.prototype["catch"] = function (e) { return this.then(null, e); }, o.prototype.then = function (e, t) { var o = new this.constructor(n); return i(this, new c(e, t, o)), o; }, o.all = function (e) { var n = Array.prototype.slice.call(e); return new o(function (e, t) { function o(r, u) { try { if (u && ("object" == typeof u || "function" == typeof u)) { var f = u.then; if ("function" == typeof f) return void f.call(u, function (e) { o(r, e); }, t); } n[r] = u, 0 === --i && e(n); } catch (c) { t(c); } } if (0 === n.length) return e([]); for (var i = n.length, r = 0; r < n.length; r++) o(r, n[r]); }); }, o.resolve = function (e) { return e && "object" == typeof e && e.constructor === o ? e : new o(function (n) { n(e); }); }, o.reject = function (e) { return new o(function (n, t) { t(e); }); }, o.race = function (e) { return new o(function (n, t) { for (var o = 0, i = e.length; o < i; o++) e[o].then(n, t); }); }, o._immediateFn = "function" == typeof setImmediate && function (e) { setImmediate(e); } || function (e) { a(e, 0); }, o._unhandledRejectionFn = function (e) { "undefined" != typeof console && console && console.warn("Possible Unhandled Promise Rejection:", e); }, o._setImmediateFn = function (e) { o._immediateFn = e; }, o._setUnhandledRejectionFn = function (e) { o._unhandledRejectionFn = e; }, "undefined" != typeof module && module.exports ? module.exports = o : e.Promise || (e.Promise = o); }(this); /// var Utils; (function (Utils) { var Request = (function () { function Request(args) { this.args = args; } Request.prototype.buildRequest = function () { var xhr = new XMLHttpRequest(); // Scaffold props this.args.method = this.args.method || 'GET'; this.args.url = this.args.url || ''; this.args.async = this.args.async !== false ? true : false; this.args.headers = this.args.headers || {}; // Open request xhr.open(this.args.method, this.args.url, this.args.async); // Set Headers var headers = this.args.headers; for (var header in headers) { xhr.setRequestHeader(header, headers[header]); } return xhr; }; Request.prototype.buildPromise = function (xhr) { return new Promise(function (resolve, reject) { xhr.onload = function () { if (xhr.readyState !== 4) { return; } switch (xhr.status) { case 200: resolve(xhr); break; default: reject(xhr); break; } }; }); }; Request.prototype.execute = function () { var xhr = this.buildRequest(); var promise = this.buildPromise(xhr); xhr.send(this.args.body); return promise; }; return Request; }()); Utils.Request = Request; })(Utils || (Utils = {})); /// var payment; (function (payment) { var integration; (function (integration) { var IntegrationRequest = (function () { function IntegrationRequest(url, payload) { this.request = new Utils.Request({ url: url, method: IntegrationRequest.HTTP_METHOD, body: JSON.stringify(payload), headers: IntegrationRequest.HEADERS }); } IntegrationRequest.prototype.resolve = function (resolve, reject, xmlHttpResponse) { try { var response = JSON.parse(xmlHttpResponse.responseText); resolve(response); } catch (e) { reject(); } }; IntegrationRequest.prototype.execute = function () { var _this = this; return new Promise(function (resolver, rejecter) { _this.request.execute() .then(function (response) { _this.resolve(resolver, rejecter, response); }) .catch(function (response) { _this.resolve(resolver, rejecter, response); }); }); }; IntegrationRequest.HTTP_METHOD = 'POST'; IntegrationRequest.HEADERS = { 'Content-Type': 'application/json; charset=utf-8', 'Accept': 'application/json, text/javascript', }; return IntegrationRequest; }()); integration.IntegrationRequest = IntegrationRequest; })(integration = payment.integration || (payment.integration = {})); })(payment || (payment = {})); (function (payment) { var integration; (function (integration) { var PaymentRequest = (function (_super) { __extends(PaymentRequest, _super); function PaymentRequest(baseUrl, payload) { return _super.call(this, baseUrl.concat('/payment'), payload) || this; } return PaymentRequest; }(integration.IntegrationRequest)); integration.PaymentRequest = PaymentRequest; var V2PaymentRequestWithBody = (function (_super) { __extends(V2PaymentRequestWithBody, _super); function V2PaymentRequestWithBody(baseUrl, payload) { return _super.call(this, baseUrl.concat('/v2/payment'), payload) || this; } return V2PaymentRequestWithBody; }(integration.IntegrationRequest)); integration.V2PaymentRequestWithBody = V2PaymentRequestWithBody; })(integration = payment.integration || (payment.integration = {})); })(payment || (payment = {})); (function (payment) { var integration; (function (integration) { var AuthorizePaymentRequest = (function (_super) { __extends(AuthorizePaymentRequest, _super); function AuthorizePaymentRequest(baseUrl, payload) { return _super.call(this, baseUrl.concat('/payment/authorize'), payload) || this; } return AuthorizePaymentRequest; }(integration.IntegrationRequest)); integration.AuthorizePaymentRequest = AuthorizePaymentRequest; })(integration = payment.integration || (payment.integration = {})); })(payment || (payment = {})); // TODO Remove this when implementation in typescript is done var payment = payment || {}; payment.integration = payment.integration || {}; (function () { var executeBeforeRequest; var executeAfterRequest; var self = payment.integration; var DISPLAY_TYPE_IFRAME = 'iframe'; self.sendCheckoutRequest = sendCheckoutRequest; self.sendAuthorizeRequest = sendAuthorizeRequest; self.injectFingerprint = injectFingerprint; function sendCheckoutRequest(payload, containerHtmlElementId, startPartnerFunction, endPartnerFunction) { executeBeforeRequest = startPartnerFunction; executeAfterRequest = endPartnerFunction; executeCheckout(payload, containerHtmlElementId); } function executeCheckout(payload, containerHtmlElementId) { if (executeBeforeRequest) { executeBeforeRequest(); } var fingerprintElement = document.getElementById('payment-uxe-fingerprint'); if (fingerprintElement) { payload.sessionId = fingerprintElement.value; } var promise; //If the request is sending the cartId, should follow the old flow if (payload['cartId'] != '') { promise = new payment.integration.PaymentRequest(baseUrl, payload).execute(); } else { delete (payload['cartId']); console.log(payload); promise = new payment.integration.V2PaymentRequestWithBody(baseUrl, payload).execute(); } promise .then(function (response) { var redirectUrl = response.redirectUrl; var integrationParameters = response.integrationParameters; var integrationMethod = response.integrationMethod; var callbackParameters = response.callbackParameters; if (integrationParameters && integrationMethod === 'form') { submitForm(redirectUrl, integrationParameters, 'post', containerHtmlElementId); } else { if (callbackParameters && integrationMethod === 'form') { submitForm(redirectUrl, callbackParameters, 'post', containerHtmlElementId); } else { if (integrationParameters && integrationMethod === 'affirm') { submitAffirm(integrationParameters); } else { window.location = redirectUrl; } } } }) .catch(function () { // TODO Implement error handling }); } function sendAuthorizeRequest(payload, containerHtmlElementId, startPartnerFunction, endPartnerFunction) { executeBeforeRequest = startPartnerFunction; executeAfterRequest = endPartnerFunction; executeAuthorize(payload, containerHtmlElementId); } function executeAuthorize(payload, containerHtmlElementId) { if (executeBeforeRequest) { executeBeforeRequest(); } var promise = new payment.integration.AuthorizePaymentRequest(baseUrl, payload).execute(); promise .then(function (response) { var redirectUrl = response.redirectUrl; var integrationParameters = response.integrationParameters; var integrationMethod = response.integrationMethod; var callbackParameters = response.callbackParameters; if (integrationParameters && integrationMethod === 'form') { submitForm(redirectUrl, integrationParameters, 'post', containerHtmlElementId); } else { if (callbackParameters && integrationMethod === 'form') { submitForm(redirectUrl, callbackParameters, 'post', containerHtmlElementId); } else { window.location = redirectUrl; } } }) .catch(function () { // TODO Implement error handling }); } function submitForm(action, params, method, containerHtmlElementId) { removeElementFromDOM('paymentDataSendForm'); removeElementFromDOM('paymentGatewayIFrame'); var form = document.createElement('form'); form.setAttribute('id', 'paymentDataSendForm'); form.setAttribute('method', method || 'post'); form.setAttribute('action', action); for (var key in params) { if (params.hasOwnProperty(key)) { var hiddenField = document.createElement('input'); hiddenField.setAttribute('type', 'hidden'); hiddenField.setAttribute('name', key); hiddenField.setAttribute('value', params[key]); form.appendChild(hiddenField); } } if (params.displayType === DISPLAY_TYPE_IFRAME && containerHtmlElementId) { createIFrameAndAttachToForm(containerHtmlElementId, form); } if (document.getElementById('paymentGatewayIFrame') && executeAfterRequest) { document.getElementById('paymentGatewayIFrame').onload = function () { executeAfterRequest(); }; } document.body.appendChild(form); form.submit(); } function submitAffirm(integrationParameters) { var affirmConfig = { publicApiKey: integrationParameters.config.public_api_key, script: integrationParameters.config.script }; injectAffirmObjects(affirmConfig); affirm.checkout(integrationParameters.checkout); affirm.ui.ready(function () { affirm.ui.error.on("close", function () { window.location = integrationParameters.checkout.merchant.user_cancel_url; }); }); affirm.checkout.post(); } function removeElementFromDOM(elementId) { var element = document.getElementById(elementId); if (element) { element.remove(); } } function createIFrameAndAttachToForm(containerId, form) { var iframe = document.createElement('iframe'); iframe.setAttribute('id', 'paymentGatewayIFrame'); iframe.setAttribute('name', 'paymentGatewayIFrame'); iframe.setAttribute('width', '100%'); iframe.setAttribute('height', '100%'); iframe.setAttribute('style', 'border: none'); document.getElementById(containerId).appendChild(iframe); form.setAttribute('target', 'paymentGatewayIFrame'); } function injectAffirmObjects(affirmConfig) { (function (l, g, m, e, a, f, b) { var d, c = l[m] || {}, h = document.createElement(f), n = document.getElementsByTagName(f)[0], k = function (a, b, c) { return function () { a[b]._.push([c, arguments]); }; }; c[e] = k(c, e, "set"); d = c[e]; c[a] = {}; c[a]._ = []; d._ = []; c[a][b] = k(c, a, b); a = 0; for (b = "set add save post open empty reset on off trigger ready setProduct".split(" "); a < b.length; a++) d[b[a]] = k(c, e, b[a]); a = 0; for (b = ["get", "token", "url", "items"]; a < b.length; a++) d[b[a]] = function () { }; h.async = !0; h.src = g[f]; n.parentNode.insertBefore(h, n); delete g[f]; d(g); l[m] = c; })(window, affirmConfig, "affirm", "checkout", "ui", "script", "ready"); } function injectFingerprint(country) { injectCybersourceFingerprint(country); } function injectCybersourceFingerprint(country) { if (!country) { return; } var endpoint = baseUrl.concat('/payment/cybersource/fingerprint/').concat(country); var response = new Utils.Request({ url: endpoint, method: 'GET' }).execute(); response .then(function (response) { var wrapper = document.createElement('div'); wrapper.innerHTML = response.responseText; document.body.append(wrapper.firstElementChild); }) .catch(function (data) { console.error(data.responseText); }); } })();