File size: 2,980 Bytes
9113b22
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
// 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');
    }
});