220 lines
8.6 KiB
JavaScript
220 lines
8.6 KiB
JavaScript
/* global ppress_stripe_vars */
|
|
/* global ppressCheckoutForm */
|
|
/* global pp_ajax_form */
|
|
|
|
(function ($) {
|
|
|
|
function PPressStripe() {
|
|
|
|
var _this = this,
|
|
stripe = Stripe(ppress_stripe_vars.publishable_key, {
|
|
'locale': ppress_stripe_vars.locale
|
|
});
|
|
|
|
this.init = function () {
|
|
|
|
window.processCheckoutFlag = false;
|
|
window.confirmPaymentFlag = false;
|
|
|
|
$(document).on('ppress_updated_checkout', _this.updated_checkout);
|
|
|
|
$(document).on('ppress_update_checkout', _this.unmountPaymentElement);
|
|
|
|
$(document).on('click', '#ppress-checkout-button', function () {
|
|
window.processCheckoutFlag = true;
|
|
});
|
|
|
|
_this.updatePaymentElement();
|
|
};
|
|
|
|
this.updated_checkout = function (e, response) {
|
|
|
|
_this.checkout_form = $('form#ppress_mb_checkout_form');
|
|
|
|
_this.checkout_form.on('ppress_checkout_place_order_stripe', _this.validateFormSubmission);
|
|
_this.checkout_form.on('ppress_process_checkout_stripe', _this.processCheckout);
|
|
|
|
_this.mountPaymentElement(response);
|
|
};
|
|
|
|
this.fieldValueOrEmpty = function (field) {
|
|
if (!field) return '';
|
|
|
|
return field;
|
|
};
|
|
|
|
this.getBillingDetails = function () {
|
|
var country = $('#stripe_ppress_billing_country').val(),
|
|
state = $('#stripe_ppress_billing_state').val(),
|
|
val = {
|
|
name: _this.fieldValueOrEmpty($('#stripe-card_name').val()),
|
|
email: _this.fieldValueOrEmpty($('#ppmb_email').val()),
|
|
phone: _this.fieldValueOrEmpty($('#stripe_ppress_billing_phone').val())
|
|
};
|
|
|
|
// only include address to billing details if the billing address fields are in the checkout form
|
|
if (country) {
|
|
val.address = {
|
|
line1: _this.fieldValueOrEmpty($('#stripe_ppress_billing_address').val()),
|
|
line2: '',
|
|
city: _this.fieldValueOrEmpty($('#stripe_ppress_billing_city').val()),
|
|
state: _this.fieldValueOrEmpty(state),
|
|
country: _this.fieldValueOrEmpty(country),
|
|
postal_code: _this.fieldValueOrEmpty($('#stripe_ppress_billing_postcode').val()),
|
|
}
|
|
}
|
|
|
|
return val;
|
|
};
|
|
|
|
this.updatePaymentElement = function () {
|
|
|
|
var callback = function () {
|
|
|
|
_this.unmountPaymentElement();
|
|
|
|
if (typeof window.elements.create !== 'undefined') {
|
|
window.paymentElement = window.elements.create('payment', _this.getPaymentOptions());
|
|
window.paymentElement.mount('#ppress-stripe-card-element');
|
|
}
|
|
};
|
|
|
|
// If the email address is changed, re-mount to allow the Link element to show.
|
|
$(document).on('change', '#ppmb_email', callback);
|
|
};
|
|
|
|
this.getPaymentOptions = function () {
|
|
var obj = {
|
|
layout: {type: 'tabs'},
|
|
fields: {
|
|
billingDetails: ppress_stripe_vars.hideBillingFields === 'true' ? 'never' : 'auto'
|
|
},
|
|
terms: {
|
|
card: 'never'
|
|
}
|
|
};
|
|
|
|
// [Fix] Passing "never" for fields.billingDetails in combination with defaultValues.billingDetails is not recommended.
|
|
// Instead pass billing_details when creating the payment method or confirming the payment.
|
|
if (obj.fields.billingDetails === 'auto') {
|
|
obj.defaultValues = {
|
|
billingDetails: _this.getBillingDetails()
|
|
};
|
|
}
|
|
|
|
return obj;
|
|
};
|
|
|
|
this.mountPaymentElement = function (response) {
|
|
|
|
if ($('#ppress-stripe-card-element').length === 0) return;
|
|
|
|
window.elements = stripe.elements(response.data.stripe_args);
|
|
|
|
window.paymentElement = window.elements.create('payment', _this.getPaymentOptions());
|
|
|
|
window.paymentElement.mount('#ppress-stripe-card-element');
|
|
};
|
|
|
|
this.unmountPaymentElement = function () {
|
|
|
|
if ($('#ppress-stripe-card-element').length === 0) return;
|
|
|
|
if (typeof window.paymentElement.destroy !== 'undefined') {
|
|
window.paymentElement.destroy();
|
|
}
|
|
};
|
|
|
|
this.validateFormSubmission = function () {
|
|
|
|
if (window.processCheckoutFlag === true) {
|
|
|
|
window.processCheckoutFlag = false;
|
|
|
|
window.elements.submit().then(function (result) {
|
|
|
|
if ('error' in result && typeof result.error.message !== 'undefined') {
|
|
ppressCheckoutForm.createAlertMessage(result.error.message);
|
|
} else {
|
|
_this.checkout_form.trigger('submit');
|
|
}
|
|
});
|
|
|
|
return false;
|
|
}
|
|
};
|
|
|
|
this.processCheckout = function (e, response, payment_method) {
|
|
|
|
if (ppressCheckoutForm.is_var_defined(response.gateway_response) === true) {
|
|
|
|
if (
|
|
ppressCheckoutForm.is_var_defined(response.gateway_response.latest_invoice) === true || // for subscription payments
|
|
ppressCheckoutForm.is_var_defined(response.gateway_response.status) === true // for one-time payments
|
|
) {
|
|
|
|
// ensure the below block of code runs once
|
|
if (window.confirmPaymentFlag === false) {
|
|
|
|
window.confirmPaymentFlag = true;
|
|
|
|
var client_secret, stripeAction = 'confirmPayment', actionResultParam = 'paymentIntent';
|
|
|
|
if (ppressCheckoutForm.is_var_defined(response.gateway_response.client_secret)) {
|
|
client_secret = response.gateway_response.client_secret;
|
|
} else if (
|
|
ppressCheckoutForm.is_var_defined(response.gateway_response.latest_invoice.payment_intent) &&
|
|
ppressCheckoutForm.is_var_defined(response.gateway_response.latest_invoice.payment_intent.client_secret)
|
|
) {
|
|
client_secret = response.gateway_response.latest_invoice.payment_intent.client_secret;
|
|
} else if (
|
|
ppressCheckoutForm.is_var_defined(response.gateway_response.setup_intent_response) &&
|
|
ppressCheckoutForm.is_var_defined(response.gateway_response.setup_intent_response.client_secret)
|
|
) {
|
|
client_secret = response.gateway_response.setup_intent_response.client_secret;
|
|
stripeAction = 'confirmSetup';
|
|
actionResultParam = 'setupIntent';
|
|
}
|
|
|
|
if (typeof client_secret === 'undefined') {
|
|
$(document.body).trigger('ppress_checkout_success', [response, payment_method]);
|
|
window.location.assign(response.order_success_url);
|
|
}
|
|
|
|
var cp_getBillingDetails = _this.getBillingDetails();
|
|
|
|
stripe[stripeAction]({
|
|
elements: window.elements,
|
|
clientSecret: client_secret,
|
|
confirmParams: {
|
|
return_url: response.order_success_url,
|
|
payment_method_data: {
|
|
billing_details: cp_getBillingDetails
|
|
}
|
|
},
|
|
redirect: 'if_required'
|
|
|
|
}).then(function (result) {
|
|
if (result.error) {
|
|
window.confirmPaymentFlag = false;
|
|
ppressCheckoutForm.createAlertMessage(result.error.message);
|
|
} else {
|
|
|
|
if (result[actionResultParam]['status'] === 'succeeded') {
|
|
$(document.body).trigger('ppress_checkout_success', [response, payment_method]);
|
|
}
|
|
|
|
window.location.assign(response.order_success_url);
|
|
}
|
|
});
|
|
}
|
|
|
|
return false;
|
|
}
|
|
}
|
|
};
|
|
}
|
|
|
|
(new PPressStripe()).init();
|
|
|
|
})(jQuery); |