eubottura's picture
{% macro render_extra_keys(json_dict, handled_keys) %}
9113b22 verified
// Stripe Integration Script
// Initialize Stripe with your publishable key
const stripe = Stripe('pk_test_51P8KpGDMHO4ZxtzFDMHO4ZxtzFDMHO4ZxtzF'); // Replace with your actual publishable key
const elements = stripe.elements({
appearance: {
theme: 'stripe',
variables: {
colorPrimary: '#6366f1', // indigo-500
colorText: '#1f2937', // gray-800
colorBackground: '#ffffff',
colorDanger: '#ef4444', // red-500
},
rules: {
'.Input': {
borderColor: '#d1d5db', // gray-300
borderRadius: '0.5rem',
boxShadow: 'none',
},
'.Input:focus': {
borderColor: '#6366f1', // indigo-500
boxShadow: '0 0 0 3px rgba(99, 102, 241, 0.3)',
},
}
}
});
// Create and mount the Payment Element
const paymentElement = elements.create('payment', {
layout: {
type: 'tabs',
defaultCollapsed: false,
radios: false,
spacedAccordionItems: false
},
paymentMethodOrder: ['card', 'klarna', 'afterpay_clearpay', 'affirm'],
wallets: {
applePay: 'never',
googlePay: 'never'
}
});
paymentElement.mount('#payment-element');
// Handle form submission
const submitButton = document.getElementById('submit-button');
const errorMessage = document.getElementById('error-message');
submitButton.addEventListener('click', async (e) => {
e.preventDefault();
// Disable the button and show loading state
submitButton.disabled = true;
submitButton.innerHTML = `
<div class="flex items-center justify-center">
<svg class="animate-spin -ml-1 mr-3 h-5 w-5 text-white" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
<circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
<path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>
</svg>
Processing...
</div>
`;
// Confirm the payment
const {error} = await stripe.confirmPayment({
elements,
confirmParams: {
return_url: 'https://your-website.com/order-confirmation', // Replace with your actual return URL
},
});
// Handle errors
if (error) {
errorMessage.classList.remove('hidden');
errorMessage.textContent = error.message;
submitButton.disabled = false;
submitButton.innerHTML = 'Pay $55.98';
}
});
// Handle real-time validation errors from the Payment Element
paymentElement.on('change', (event) => {
if (event.error) {
errorMessage.classList.remove('hidden');
errorMessage.textContent = event.error.message;
} else {
errorMessage.classList.add('hidden');
}
});