Rumah >hujung hadapan web >tutorial js >Membina Kalkulator Penghantaran Tersuai dengan Fungsi Stripe dan Netlify untuk Pelbagai Mata Wang (€/$), Kuantiti dan Sokongan Lokasi
Komit 3c90066
Sebelum anda membaca lebih lanjut, hanya sebagai FYI, saya belajar dan kod sendiri untuk membina perkara yang kita perlukan untuk menjalankan perniagaan kita. Jadi, sila ambil maklumat berikut sebagaimana adanya. Ini contoh dunia sebenar yang kami gunakan untuk kami sendiri? buku kuning tentang kerja bersama. Pada masa itu kami tidak dapat mencari penyelesaian yang lebih baik, jadi saya membina perkara berikut untuk tapak web eCommerce kami.
Menjual satu produk dalam talian, seperti buku, boleh menjadi mudah sehingga anda menghadapi kerumitan kadar penghantaran antarabangsa, berbilang mata wang dan kuantiti yang berbeza-beza—terutamanya kerana Stripe Checkout membenarkan hanya satu kadar penghantaran secara lalai. Dalam artikel ini, mari kita lihat cara kami membina kalkulator penghantaran tersuai menggunakan Netlify Functions dan Stripe untuk menangani cabaran ini. Pada akhirnya, anda akan mempunyai penyelesaian yang berkesan yang disesuaikan untuk menjual sehingga tiga salinan buku, dengan kos penghantaran dinamik berdasarkan mata wang (EUR/USD), kuantiti pelanggan. , dan lokasi.
Walaupun contoh ini sangat khusus untuk keperluan kami, anda boleh mengubah suainya mengikut keperluan anda sendiri. Sila berasa bebas untuk berkongsi penyelesaian anda, peningkatan atau sebarang peningkatan yang anda lakukan.
Sebelum kami menyelam, pastikan anda mempunyai perkara berikut:
Mari cipta pengalaman daftar keluar yang lancar yang:
Di bawah saya akan merangkumi kedua-dua bahagian hadapan (HTML dan JavaScript) dan bahagian belakang (Fungsi Netlify).
Projek hendaklah mengandungi folder dan fail berikut:
/functions - create-checkout-session.js /index.html .env netlify.toml package.json
Buat fail baharu dalam direktori /functions anda bernama create-checkout-session.js.
/functions - create-checkout-session.js /index.html .env netlify.toml package.json
// functions/create-checkout-session.js // Add Stripe secret key const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY); exports.handler = async (event) => { // Parse the order data sent from the frontend const order = JSON.parse(event.body); // Define country groups const euCountries = ['AL', 'AM', 'AT', ...]; // Add the EU countries you ship to const worldCountries = ['AE', 'AR', 'AU', ...]; // Add worldwide countries you ship to let allowedCountries = []; // Payment methods based on currency let paymentMethods = []; // Determine shipping rates and allowed countries if (order.currency === 'EUR') { paymentMethods = ['card', 'sepa_debit', 'ideal', 'bancontact', 'p24', 'eps', 'giropay', 'sofort']; if (order.shippingOption === 'europe-eur') { allowedCountries = euCountries; // Set shipping rate IDs for Europe in EUR order.shippingRate = process.env[`SHIPPING_RATE_EUR_EU_${order.items}`]; } else if (order.shippingOption === 'world-eur') { allowedCountries = worldCountries; // Set shipping rate IDs for World in EUR order.shippingRate = process.env[`SHIPPING_RATE_EUR_W_${order.items}`]; } } else if (order.currency === 'USD') { paymentMethods = ['card']; if (order.shippingOption === 'europe-usd') { allowedCountries = euCountries; // Set shipping rate IDs for Europe in USD order.shippingRate = process.env[`SHIPPING_RATE_USD_EU_${order.items}`]; } else if (order.shippingOption === 'world-usd') { allowedCountries = worldCountries; // Set shipping rate IDs for World in USD order.shippingRate = process.env[`SHIPPING_RATE_USD_W_${order.items}`]; } } // Create the Stripe Checkout session const session = await stripe.checkout.sessions.create({ payment_method_types: paymentMethods, line_items: [ { price: order.priceId, // The price ID of your product quantity: order.items, }, ], mode: 'payment', billing_address_collection: 'auto', shipping_rates: [order.shippingRate], shipping_address_collection: { allowed_countries: allowedCountries, }, success_url: `${process.env.URL}/success?session_id={CHECKOUT_SESSION_ID}`, cancel_url: `${process.env.URL}/cancel`, }); return { statusCode: 200, body: JSON.stringify({ sessionId: session.id, publishableKey: process.env.STRIPE_PUBLISHABLE_KEY, }), }; };
Memulakan Stripe SDK dengan kunci rahsia anda.
Menghuraikan data pesanan masuk dari bahagian hadapan.
const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);
exports.handler = async (event) => { const order = JSON.parse(event.body); // Rest of the code... };
Tentukan kaedah pembayaran yang tersedia berdasarkan mata wang.
const euCountries = [/* ... */]; const worldCountries = [/* ... */]; let allowedCountries = [];
let paymentMethods = [];
if (order.currency === 'EUR') { paymentMethods = [/* ... */]; if (order.shippingOption === 'europe-eur') { allowedCountries = euCountries; order.shippingRate = process.env[`SHIPPING_RATE_EUR_EU_${order.items}`]; } else if (order.shippingOption === 'world-eur') { allowedCountries = worldCountries; order.shippingRate = process.env[`SHIPPING_RATE_EUR_W_${order.items}`]; } } else if (order.currency === 'USD') { // Similar logic for USD }
Di bawah ialah contoh ringkas kod HTML dan JavaScript yang berinteraksi dengan Fungsi Netlify kami.
const session = await stripe.checkout.sessions.create({ payment_method_types: paymentMethods, line_items: [/* ... */], mode: 'payment', billing_address_collection: 'auto', shipping_rates: [order.shippingRate], shipping_address_collection: { allowed_countries: allowedCountries, }, success_url: `${process.env.URL}/success?session_id={CHECKOUT_SESSION_ID}`, cancel_url: `${process.env.URL}/cancel`, });
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Book Pre-Order</title> <!-- Include any CSS or Meta tags here --> </head> <body> <!-- Book Purchase Section --> <section id="pricing"> <div class="pricing-content"> <!-- Currency Tabs --> <ul class="tabs-menu"> <li id="active_currency_eur" class="current"><a href="#tab-1">Buy in ?? EUR</a></li> <li id="active_currency"><a href="#tab-2">Buy in ?? USD</a></li> </ul> <!-- EUR Tab Content --> <div id="tab-1" class="tab-content"> <h3>1 Print Book</h3> <p>A beautiful, 350 pages book.</p> <p>Price: <span id="book-price-eur">€95</span></p> <!-- Number of Books --> <label for="num-books">Number of Books (Max 3)</label> <select name="num-books" id="num-books" required> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> </select> <!-- Shipping Destination --> <label for="shipping-amount-eur">Select Shipping Destination</label> <select name="shipping-amount" id="shipping-amount-eur" required> <optgroup label="Europe €14"> <option value="europe-eur">Austria</option> <option value="europe-eur">Belgium</option> <!-- Add other European countries --> </optgroup> <optgroup label="Worldwide €22"> <option value="world-eur">United States</option> <option value="world-eur">Canada</option> <!-- Add other worldwide countries --> </optgroup> </select> <!-- Checkout Button --> <button id="checkout-button-eur" type="button">PRE-ORDER</button> </div> <!-- USD Tab Content --> <div id="tab-2" class="tab-content"> <h3>1 Print Book</h3> <p>A beautiful, 350 pages book.</p> <p>Price: <span id="book-price-usd"></span></p> <!-- Number of Books --> <label for="num-books-usd">Number of Books (Max 3)</label> <select name="num-books-usd" id="num-books-usd" required> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> </select> <!-- Shipping Destination --> <label for="shipping-amount-usd">Select Shipping Destination</label> <select name="shipping-amount" id="shipping-amount-usd" required> <optgroup label="Europe "> <option value="europe-usd">Austria</option> <option value="europe-usd">Belgium</option> <!-- Add other European countries --> </optgroup> <optgroup label="Worldwide "> <option value="world-usd">United States</option> <option value="world-usd">Canada</option> <!-- Add other worldwide countries --> </optgroup> </select> <!-- Checkout Button --> <button id="checkout-button-usd" type="button">PRE-ORDER</button> </div> </div> </section> <!-- Include Stripe.js --> <script src="https://js.stripe.com/v3/"></script> <!-- Include your JavaScript file --> <script src="script.js"></script> </body> </html>
Pastikan anda menambah produk dan harga penghantaran anda pada Papan Pemuka Stirpe.
Pada Jalur:
Di Netlify:
Buat fail .env dalam akar projek anda dan tambahkan pembolehubah persekitaran anda (atau lakukan pada UI Netlify seperti yang ditunjukkan di atas Konfigurasi tapak > Pembolehubah persekitaran):
/functions - create-checkout-session.js /index.html .env netlify.toml package.json
Konfigurasikan Netlify untuk menggunakan pembolehubah persekitaran dalam fungsi anda:
// functions/create-checkout-session.js // Add Stripe secret key const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY); exports.handler = async (event) => { // Parse the order data sent from the frontend const order = JSON.parse(event.body); // Define country groups const euCountries = ['AL', 'AM', 'AT', ...]; // Add the EU countries you ship to const worldCountries = ['AE', 'AR', 'AU', ...]; // Add worldwide countries you ship to let allowedCountries = []; // Payment methods based on currency let paymentMethods = []; // Determine shipping rates and allowed countries if (order.currency === 'EUR') { paymentMethods = ['card', 'sepa_debit', 'ideal', 'bancontact', 'p24', 'eps', 'giropay', 'sofort']; if (order.shippingOption === 'europe-eur') { allowedCountries = euCountries; // Set shipping rate IDs for Europe in EUR order.shippingRate = process.env[`SHIPPING_RATE_EUR_EU_${order.items}`]; } else if (order.shippingOption === 'world-eur') { allowedCountries = worldCountries; // Set shipping rate IDs for World in EUR order.shippingRate = process.env[`SHIPPING_RATE_EUR_W_${order.items}`]; } } else if (order.currency === 'USD') { paymentMethods = ['card']; if (order.shippingOption === 'europe-usd') { allowedCountries = euCountries; // Set shipping rate IDs for Europe in USD order.shippingRate = process.env[`SHIPPING_RATE_USD_EU_${order.items}`]; } else if (order.shippingOption === 'world-usd') { allowedCountries = worldCountries; // Set shipping rate IDs for World in USD order.shippingRate = process.env[`SHIPPING_RATE_USD_W_${order.items}`]; } } // Create the Stripe Checkout session const session = await stripe.checkout.sessions.create({ payment_method_types: paymentMethods, line_items: [ { price: order.priceId, // The price ID of your product quantity: order.items, }, ], mode: 'payment', billing_address_collection: 'auto', shipping_rates: [order.shippingRate], shipping_address_collection: { allowed_countries: allowedCountries, }, success_url: `${process.env.URL}/success?session_id={CHECKOUT_SESSION_ID}`, cancel_url: `${process.env.URL}/cancel`, }); return { statusCode: 200, body: JSON.stringify({ sessionId: session.id, publishableKey: process.env.STRIPE_PUBLISHABLE_KEY, }), }; };
Jalankan arahan berikut untuk memasang Stripe SDK:
const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);
exports.handler = async (event) => { const order = JSON.parse(event.body); // Rest of the code... };
Et voilà! Anda telah menyediakan fungsi kalkulator penghantaran tersuai yang melaraskan kadar penghantaran secara dinamik berdasarkan mata wang, kuantiti dan lokasi.
Jangan ragu untuk menyesuaikan dan mengembangkan persediaan ini agar sesuai dengan produk dan dasar penghantaran anda sendiri.
Nota: Artikel ini berdasarkan senario dunia sebenar untuk prapesanan/penjualan satu buku dengan sehingga tiga salinan dan menunjukkan satu cara untuk mengendalikan pengiraan penghantaran yang melibatkan pembolehubah mata wang, kuantiti dan lokasi. Mungkin terdapat kaedah yang lebih cekap bergantung pada keperluan khusus anda.
Atas ialah kandungan terperinci Membina Kalkulator Penghantaran Tersuai dengan Fungsi Stripe dan Netlify untuk Pelbagai Mata Wang (€/$), Kuantiti dan Sokongan Lokasi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!