Maison > Article > interface Web > Création d'un calculateur d'expédition personnalisé avec les fonctions Stripe et Netlify pour la prise en charge de plusieurs devises (€/$), de la quantité et de l'emplacement
Commettre 3c90066
Avant de poursuivre votre lecture, à titre informatif, j'apprends et code par moi-même pour créer ce dont nous avons besoin pour gérer notre entreprise. Veuillez donc prendre les informations suivantes telles quelles. C'est un exemple réel que nous avons utilisé pour le nôtre ? livre jaune sur le coworking. À l'époque, nous ne pouvions pas trouver de meilleure solution, j'ai donc créé ce qui suit pour notre site de commerce électronique.
Vendre un seul produit en ligne, comme un livre, peut être simple jusqu'à ce que vous soyez confronté aux complexités des tarifs d'expédition internationaux, des devises multiples et des quantités variables, d'autant plus que Stripe Checkout n'autorise qu'un seul tarif d'expédition par défaut. Dans cet article, expliquons comment nous avons créé un calculateur d'expédition personnalisé à l'aide de Netlify Functions et Stripe pour relever ces défis. À la fin, vous disposerez d'une solution fonctionnelle adaptée pour vendre jusqu'à trois exemplaires d'un livre, avec des frais d'expédition dynamiques basés sur la devise (EUR/USD) du client, la quantité , et emplacement.
Bien que cet exemple soit très spécifique à nos besoins, vous pouvez le modifier en fonction de vos propres besoins. N'hésitez pas à partager vos solutions, mises à niveau ou toute amélioration que vous apportez.
Avant de plonger, assurez-vous d'avoir les éléments suivants :
Créons une expérience de paiement transparente qui :
Ci-dessous, je couvrirai à la fois les composants frontend (HTML et JavaScript) et backend (Netlify Function).
Le projet doit inclure les dossiers et fichiers suivants :
/functions - create-checkout-session.js /index.html .env netlify.toml package.json
Créez un nouveau fichier dans votre répertoire /functions nommé 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, }), }; };
Initialise le SDK Stripe avec votre clé secrète.
Analyse les données des commandes entrantes depuis le frontend.
const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);
exports.handler = async (event) => { const order = JSON.parse(event.body); // Rest of the code... };
Déterminez les modes de paiement disponibles en fonction de la devise.
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 }
Vous trouverez ci-dessous un exemple abrégé du code HTML et JavaScript qui interagit avec notre fonction Netlify.
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>
Assurez-vous d'ajouter vos produits et vos prix d'expédition sur le tableau de bord Stirpe.
Sur Stripe :
Sur Netlify :
Créez un fichier .env à la racine de votre projet et ajoutez vos variables d'environnement (ou faites-le sur l'interface utilisateur de Netlify comme indiqué ci-dessus Configuration du site > Variables d'environnement) :
/functions - create-checkout-session.js /index.html .env netlify.toml package.json
Configurez Netlify pour utiliser des variables d'environnement dans vos fonctions :
// 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, }), }; };
Exécutez la commande suivante pour installer le SDK Stripe :
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à ! Vous avez configuré une fonction de calcul d'expédition personnalisée qui ajuste dynamiquement les tarifs d'expédition en fonction de la devise, de la quantité et de l'emplacement.
N'hésitez pas à adapter et à développer cette configuration en fonction de vos propres produits et politiques d'expédition.
Remarque : Cet article est basé sur un scénario réel de précommande/vente d'un seul livre comportant jusqu'à trois exemplaires et montre une façon de gérer les calculs d'expédition impliquant des variables de devise, de quantité et d'emplacement. Il peut y avoir des méthodes plus efficaces en fonction de vos besoins spécifiques.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!