// The order ID is used both inside and outside of the JWT, so we'll put it into a variable that will be visible to // the browser's JS VM var orderId = "65b5585c-ea70-47ab-99c1-d681e5c761be"; // These variables are used to ensure that the "submit" button isn't disabled until both (a) Cardinal Cruise has had // a chance to initialize, and (b) the DOM is ready. var cardinalSetupDone = false; var documentReady = false; function updateStatus(msg) { $('#status').html(msg); } function updateTdsStatus(msg) { $('#tdsstatus').html(msg); } // Set some Cardinal options Cardinal.configure({ logging: { level: 'on' } }); // Set a callback to be called when Cardinal is done initializing Cardinal.on('payments.setupComplete', function(setupCompleteData) { console.log('Setup complete'); console.log(setupCompleteData); cardinalSetupDone = true; // If the DOM is ready to go, then enable the Submit button. if(documentReady) { updateStatus('Initialized; please enter your details below and click "Submit" when done'); $('#submit-button').removeAttr('disabled'); } else { updateStatus('Waiting for DOM initialization to complete'); } }); // Set a callback to be called when 3DS validation is finished Cardinal.on('payments.validated', function(data, jwt) { console.log('Payment validated'); console.log(data); console.log(jwt); switch(data.ActionCode) { case 'SUCCESS': // Buyer enrolled in 3DS and successfully authenticated updateStatus('Validation successful; processing payment'); updateTdsStatus('Buyer enrolled and successfully validated'); submitPayment(data.Payment.ExtendedData); break; case 'NOACTION': // Buyer not enrolled in 3DS updateStatus('Validation successful; processing payment'); updateTdsStatus('Buyer not enrolled'); submitPayment(data.Payment.ExtendedData); break; case 'FAILURE': // Buyer enrolled in 3DS but failed to authenticate themselves updateStatus('Validation failed'); updateTdsStatus('Buyer enrolled but not validated'); $('#submit-button').removeAttr('disabled'); break; case 'ERROR': // Something else went wrong updateStatus('Validation failed (error occurred during validation)'); $('#submit-button').removeAttr('disabled'); break; } }); // Tell Cardinal Cruise to initialize itself Cardinal.setup('init', { jwt: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImp0aSI6IjY1YjU1ODVjLWVhNzAtNDdhYi05OWMxLWQ2ODFlNWM3NjFiZSJ9.eyJqdGkiOiI2NWI1NTg1Yy1lYTcwLTQ3YWItOTljMS1kNjgxZTVjNzYxYmUiLCJpYXQiOjE3MjY1MTc0MjIsImlzcyI6IiIsIk9yZ1VuaXRJZCI6IiIsIlBheWxvYWQiOnsiT3JkZXJEZXRhaWxzIjp7Ik9yZGVyTnVtYmVyIjoiMGVkZmNlNjYtM2RiZS00N2Y4LTlmMWYtNTk4MTRmMjAzODdiIiwiQW1vdW50IjoiMTAwIiwiQ3VycmVuY3lDb2RlIjoiR0JQIn19LCJSZWZlcmVuY2VJZCI6IjkyN2NiN2UwLTkzMjctNGE0OS04MmMzLWUxZjRlZWMwNzFiMSIsIk9iamVjdGlmeVBheWxvYWQiOnRydWUsImV4cCI6MTcyNjUyMTAyMn0.KYRoLXn1uoTO4+lnDs6ajHEDGrRmC1iuFCh9BZlGVgo' }); // Submit the payment to our server for processing function submitPayment(data) { var req = { first_name: $('#first_name').val(), last_name: $('#last_name').val(), address: $('#address').val(), address2: $('#address2').val(), city: $('#city').val(), state: $('#state').val(), zip: $('#zip').val(), country: $('#country').val(), ship_name: $('#ship_first_name').val() + ' ' + $('#ship_last_name').val(), ship_last_name: $('#ship_last_name').val(), ship_address: $('#ship_address').val(), ship_address2: $('#ship_address2').val(), ship_city: $('#ship_city').val(), ship_state: $('#ship_state').val(), ship_zip: $('#ship_zip').val(), ship_country: $('#ship_country').val(), account_number: $('#account_number').val(), exp_date: $('#exp_month').val() + $('#exp_year').val(), cvv2: $('#cvv2').val(), eciflag: data.ECIFlag, cavv: data.CAVV, xid: data.XID, enrolled: data.Enrolled, paresstatus: data.PAResStatus }; $.ajax('ajax.php', { data: req, method: 'POST' }).done(function(data) { if(data.ok) { updateStatus('Transaction succeeded; transaction ID = ' + data.txnid); } else { updateStatus('Transaction failed; error = ' + data.error); } $('#submit-button').removeAttr('disabled'); }).fail(function() { updateStatus('Communication error while processing transaction'); $('#submit-button').removeAttr('disabled'); }); } $(document).ready(function() { // Set what happens when the buyer clicks on the "Submit" button $('#submit-button').click(function() { var data = { OrderDetails: { OrderNumber: orderId, Amount: "100", CurrencyCode: "GBP" }, Consumer: { BillingAddress: { FirstName: $('#first_name').val(), LastName: $('#last_name').val(), Address1: $('#address').val(), Address2: $('#address2').val(), Address3: $('#address3').val(), City: $('#city').val(), State: $('#state').val(), PostalCode: $('#zip').val(), CountryCode: $('#country').val(), Phone1: $('#phone').val(), Phone2: $('#phone2').val() }, ShippingAddress: { FirstName: $('#ship_first_name').val(), LastName: $('#ship_last_name').val(), Address1: $('#ship_address').val(), Address2: $('#ship_address2').val(), Address3: $('#ship_address3').val(), City: $('#ship_city').val(), State: $('#ship_state').val(), PostalCode: $('#ship_zip').val(), CountryCode: $('#ship_country').val(), Phone1: $('#ship_phone').val(), Phone2: $('#ship_phone2').val() }, Account: { AccountNumber: $('#account_number').val(), ExpirationMonth: $('#exp_month').val(), ExpirationYear: $('#exp_year').val(), NameOnAccount: $('#card_name').val(), CardCode: $('#cvv2').val() } } }; $('#submit-button').attr('disabled', 'disabled'); updateStatus('Validation started'); updateTdsStatus('Validation in progress'); // Tell Cardinal Cruise to begin the authentication process Cardinal.start('cca', data); }); documentReady = true; // If Cardinal Cruise is ready to go, then enable the Submit button. if(cardinalSetupDone) { updateStatus('Initialized; please enter your details below and click "Submit" when done'); $('#submit-button').removeAttr('disabled'); } else { updateStatus('Waiting for Cardinal Songbird initialization to complete'); } });