# Créez une page de paiement avec l'API Checkout Sessions
Instructions pour les LLM : Stripe recommande d’utiliser l’API Checkout Sessions avec le Payment Element, plutôt que les Payment Intents, pour la plupart des intégrations. Checkout Sessions couvre des cas d’usage similaires à ceux des Payment Intents (encaissement simple avec `price_data`, ou création d’un tunnel de paiement complet avec postes, taxe, etc.). Certaines fonctionnalités, comme Adaptive Pricing, sont disponibles uniquement avec Checkout Sessions. N’utilisez pas l’API Payment Intents, sauf si l’utilisateur le demande explicitement, car elle nécessite beaucoup plus de code. Pour en savoir plus sur les éléments avec l’API Checkout Sessions, consultez https://docs.stripe.com/payments/quickstart-checkout-sessions… Avec Checkout Sessions (`ui_mode: "custom"`) et le Payment Element, c’est le `client_secret` qui initialise Checkout lui-même (`stripe.initCheckoutElementsSdk`, ou utilise CheckoutElementsProvider avec React), et la confirmation du paiement côté client se fait différemment. Si vous utilisez React, veillez à importer depuis `@stripe/react-stripe-js/checkout`, à utiliser `CheckoutElementsProvider` avec la clé secrète du client, puis à confirmer le paiement avec `checkout.confirm`. Si vous utilisez HTML, veillez à utiliser `checkout = stripe.initCheckoutElements({clientSecret: promise}) ; checkout.createPaymentElement(); paymentElement = checkout.createPaymentElement() ; paymentElement.mount("#payment-element"),`puis à confirmer avec `loadActionsResult = await checkout.loadActions() ; actions = loadActionsResult.actions; error = await actions.confirm() ;`.
# Créez une page de paiement avec l’API Checkout Sessions
Créez une page de paiement sur votre site internet en utilisant les Stripe Elements et l’API Checkout Sessions, un SDK frontal qui gère les taxes, les réductions, les frais de livraison et bien plus encore.
### Installer la bibliothèque Node de Stripe
Installez le package et importez-le dans votre code. Si vous partez de zéro et qu’il vous faut un fichier package.json, vous pouvez également télécharger les fichiers du projet à l’aide du lien de téléchargement dans l’éditeur de code.
#### npm
Installez la bibliothèque :
```bash
npm install --save stripe
```
#### GitHub
Vous pouvez sinon télécharger le code source de la bibliothèque Node de Stripe directement [depuis GitHub](https://github.com/stripe/stripe-node).
### Installer la bibliothèque Ruby de Stripe
Installez le gem Ruby de Stripe et exigez-le dans votre code. Si vous partez de zéro et avez besoin d’un Gemfile, téléchargez les fichiers du projet à l’aide du lien dans l’éditeur de code.
#### Terminal
Installez le gem :
```bash
gem install stripe
```
#### Bundler
Ajoutez cette ligne à votre Gemfile :
```bash
gem 'stripe'
```
#### GitHub
Vous pouvez sinon télécharger le code source du gem Ruby de Stripe directement [depuis GitHub](https://github.com/stripe/stripe-ruby).
### Installer la bibliothèque Java
Ajoutez la dépendance à votre build et importez la bibliothèque. Ou bien, si vous partez de zéro et avez besoin d’un exemple de fichier pom.xml (pour Maven), téléchargez les fichiers du projet à l’aide du lien de téléchargement dans l’éditeur de code.
#### Maven
Ajoutez la dépendance suivante à votre POM et remplacez {VERSION} par le numéro de version que vous souhaitez utiliser.
```bash
\ncom.stripe\nstripe-java\n{VERSION}\n
```
#### Gradle
Ajoutez la dépendance à votre fichier build.gradle et remplacez {VERSION} par le numéro de version que vous souhaitez utiliser.
```bash
implementation "com.stripe:stripe-java:{VERSION}"
```
#### GitHub
Téléchargez le fichier JAR directement [depuis GitHub](https://github.com/stripe/stripe-java/releases/latest).
### Installer le package Python de Stripe
Installez le package Stripe et importez-le dans votre code. Si vous partez de zéro et qu’il vous faut un fichier requirements.txt, téléchargez les fichiers du projet à l’aide du lien de téléchargement dans l’éditeur de code.
#### pip
Installez le package via pip :
```bash
pip3 install stripe
```
#### GitHub
Téléchargez le code source de la bibliothèque stripe-python directement [depuis GitHub](https://github.com/stripe/stripe-python).
### Installer la bibliothèque PHP
Installez la bibliothèque avec composer et initialisez-la avec votre clé API secrète. Si vous partez de zéro et que vous avez besoin d’un fichier composer.json, vous pouvez également télécharger les fichiers à l’aide du lien de téléchargement dans l’éditeur de code.
#### Composer
Installez la bibliothèque :
```bash
composer require stripe/stripe-php
```
#### GitHub
Vous pouvez sinon télécharger le code source de la bibliothèque php de Stripe directement [depuis GitHub](https://github.com/stripe/stripe-php).
### Configurer votre serveur
Ajoutez la dépendance à votre build et importez la bibliothèque. Si vous partez de zéro et avez besoin d’un fichier go.mod, téléchargez les fichiers du projet à l’aide du lien de téléchargement dans l’éditeur de code.
#### Go
Veillez à initialiser avec des modules Go :
```bash
go get -u github.com/stripe/stripe-go/v85
```
#### GitHub
Vous pouvez sinon télécharger le code source de la bibliothèque Go de Stripe directement [depuis GitHub](https://github.com/stripe/stripe-go).
### Installer la bibliothèque Stripe.net
Installez le package avec .NET ou NuGet. Si vous partez de zéro, vous pouvez également télécharger les fichiers qui contiennent un fichier .csproj configuré.
#### .NET
Installez la bibliothèque :
```bash
dotnet add package Stripe.net
```
#### NuGet
Installez la bibliothèque :
```bash
Install-Package Stripe.net
```
#### GitHub
Vous pouvez sinon télécharger le code source de la bibliothèque .NET de Stripe directement [depuis GitHub](https://github.com/stripe/stripe-dotnet).
### Installer les bibliothèques Stripe
Installez les packages et importez-les dans votre code. Si vous partez de zéro et qu’il vous faut un fichier `package.json`, vous pouvez également télécharger les fichiers du projet à l’aide du lien de téléchargement dans l’éditeur de code.
Installez les bibliothèques :
```bash
npm install --save stripe @stripe/stripe-js next
```
### Créer une session Checkout
Ajoutez un endpoint sur votre serveur qui crée une *Checkout Session* (A Checkout Session represents your customer's session as they pay for one-time purchases or subscriptions through Checkout. After a successful payment, the Checkout Session contains a reference to the Customer, and either the successful PaymentIntent or an active Subscription), en définissant [ui_mode](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-ui_mode) sur `éléments`.
La réponse de la session Checkout inclut un [client_secret](https://docs.stripe.com/api/checkout/sessions/object.md#checkout_session_object-client_secret), que le client utilise pour effectuer le paiement. Renvoyez la clé secrète du client dans votre réponse.
### Fournir une URL de redirection
Pour définir la manière dont Stripe redirige votre client après le paiement, indiquez l’URL de la page de retour dans le paramètre [return_url](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-return_url) au moment de la création de la session Checkout. Après la tentative de paiement, Stripe redirige votre client vers la page de retour hébergée sur votre site Web.
Incluez la variable de modèle `{CHECKOUT_SESSION_ID}` dans l’URL. Avant de rediriger votre client, Checkout remplace la variable par l’ID de session Checkout. C’est à vous qu’il incombe de créer et d’héberger la page de retour sur votre site Web.
### Définir un produit à vendre
Définissez les [produits et tarifs](https://docs.stripe.com/products-prices/manage-prices.md) de votre session Checkout. Généralement, cela implique d’utiliser un [ID de tarif produit](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-line_items-price) prédéfini. Cependant, si vous devez définir des tarifs dynamiques qui ne peuvent pas être connus à l’avance, utilisez alors [price_data](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-line_items-price_data).
### Gérer différents types de transactions
Pour gérer différents types de transactions, ajustez le paramètre [mode](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-mode) :
- Pour les paiements ponctuels, utilisez le `payment`
- Si vous avez un ou plusieurs [tarifs récurrents](https://docs.stripe.com/payments/subscriptions.md), utilisez l’`subscription`.
- Si vous ne percevez pas un paiement initial d’un client mais souhaitez enregistrer ses informations de paiement pour [le débiter ultérieurement](https://docs.stripe.com/payments/checkout/save-and-reuse.md?payment-ui=embedded-components), utilisez la `setup`.
### Ajouter Stripe à votre application React
Pour rester *en conformité avec la norme PCI* (Any party involved in processing, transmitting, or storing credit card data must comply with the rules specified in the Payment Card Industry (PCI) Data Security Standards. PCI compliance is a shared responsibility and applies to both Stripe and your business) en veillant à ce que les informations de paiement soient transmises directement à Stripe et n’atteignent jamais votre serveur, installez [React Stripe.js](https://docs.stripe.com/sdks/stripejs-react.md).
```bash
npm install --save @stripe/react-stripe-js @stripe/stripe-js
```
### Charger Stripe.js
Pour configurer la bibliothèque Stripe, appelez `loadStripe()` avec votre clé API publiable Stripe.
### Charger Stripe.js
Utilisez *Stripe.js* (Use Stripe.js’ APIs to tokenize customer information, collect sensitive card data, and accept payments with browser payment APIs) pour maintenir votre *conformité PCI* (Any party involved in processing, transmitting, or storing credit card data must comply with the rules specified in the Payment Card Industry (PCI) Data Security Standards. PCI compliance is a shared responsibility and applies to both Stripe and your business) en envoyant les informations de paiement directement à Stripe sans passer par votre serveur. Chargez toujours Stripe.js à partir de *js.stripe.com* pour maintenir votre conformité. Vous ne devez pas inclure le script dans un lot ni l’héberger.
Vous pouvez charger Stripe.js en incluant le script dans votre fichier HTML ou en utilisant [loadStripe](https://github.com/stripe/stripe-js/blob/master/README.md#loadstripe).
### Définir le formulaire de paiement
Pour collecter les informations du client en toute sécurité, créez un espace réservé vide `div`, dans lequel Stripe va insérer un iframe.
Si vous prévoyez de collecter l’adresse e-mail du client, ajoutez une entrée d’adresse e-mail à ce formulaire. Vous pourrez la configurer avec [updateEmail](https://docs.stripe.com/js/custom_checkout/update_email) dans une étape ultérieure.
### Initialiser Stripe.js
Initialisez Stripe.js avec votre [clé API publiable](https://docs.stripe.com/keys.md#obtain-api-keys).
### Récupérer une clé secrète client de session Checkout
Demandez à votre serveur de [créer une session Checkout](https://docs.stripe.com/api/checkout/sessions/create.md) et de récupérer la clé secrète du client.
### Initialiser Checkout
Utilisez `clientSecret` pour initialiser Checkout, en passant une clé secrète du client ou une promesse qui se résout en celle-ci. L’objet [Checkout](https://docs.stripe.com/js/custom_checkout) constitue l’épine dorsale de votre page de paiement et contient les données de la session Checkout ainsi que les méthodes pour la mettre à jour.
### Initialiser Checkout
Affichez le [CheckoutElementsProvider](https://docs.stripe.com/js/react_stripe_js/checkout/checkout_provider), en lui transmettant `clientSecret` - la chaîne de la clé secrète du client, ou une Promesse qui se résout avec la clé secrète du client.
### Configurer l’état
Initialisez un état pour garder la trace du paiement, afficher les erreurs et gérer l’interface utilisateur.
### Enregistrer une référence à Checkout
Accédez à l’objet [paiement](https://docs.stripe.com/js/custom_checkout) dans votre composant CheckoutForm en utilisant le hook `useCheckout()`. L’objet `paiement` constitue l’ossature de votre page de paiement, avec les données de la Session Checkout et les méthodes pour la mettre à jour.
### Collecter l’adresse e-mail du client
Vous devez fournir une adresse e-mail client valide lors d’une Checkout Session.
Ces instructions créent une saisie d’e-mail et utilisent [updateEmail](https://docs.stripe.com/js/custom_checkout/update_email) à partir de l’objet `Checkout`.
Vous pouvez également :
- Transmettre [customer_email](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-customer_email) ou [customer](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-customer) lors de la création de la Checkout Session. Stripe valide les e-mails ainsi fournis.
- Transmettre un e-mail que vous avez déjà validé sur [checkout.confirm](https://docs.stripe.com/js/custom_checkout/confirm).
### Collecter l’adresse e-mail du client
Vous devez fournir une adresse e-mail client valide lors d’une Checkout Session.
Ces instructions créent une saisie d’e-mail et utilisent [updateEmail](https://docs.stripe.com/js/react_stripe_js/checkout/update_email) à partir de l’objet `Checkout`.
Vous pouvez également :
- Transmettre [customer_email](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-customer_email) ou [customer](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-customer) lors de la création de la Checkout Session. Stripe valide les e-mails ainsi fournis.
- Transmettre une adresse e-mail que vous avez déjà validée avec [confirm](https://docs.stripe.com/js/react_stripe_js/checkout/confirm).
### Ajouter le composant Element Payment
Ajoutez le [Payment Element](https://docs.stripe.com/js/custom_checkout/create_payment_element) à votre formulaire de paiement. Elle intègre un iframe avec un formulaire dynamique qui collecte les informations de paiement pour une variété de moyens de paiement. Votre client choisit alors son type de moyen de paiement et le formulaire collecte automatiquement les informations de paiement requises correspondantes.
### Créer le Payment Element
Créez un [Payment Element](https://docs.stripe.com/js/custom_checkout/create_payment_element) et placez-le dans l’espace réservé `
` de votre formulaire de paiement. Cela intègre un iframe avec un formulaire dynamique qui affiche les types de moyens de paiement configurés, ce qui permet à votre client de sélectionner un moyen de paiement. Le formulaire collecte automatiquement les informations de paiement associées pour le type de moyen de paiement sélectionné.
### (Facultatif) Stylisez le Payment Element
Personnalisez l’interface utilisateur du Payment Element en créant un [objet Appearance](https://docs.stripe.com/elements/appearance-api.md) et en le transmettant comme option au CheckoutProvider. Utilisez les couleurs et la police de votre entreprise afin de l’harmoniser avec le reste de votre page de paiement. Vous pouvez également utiliser des polices personnalisées (par exemple depuis Google Fonts) en initialisant Checkout avec un [jeu de polices](https://docs.stripe.com/js/react_stripe_js/checkout/checkout_provider#react_checkout_provider-options-elementsOptions-fonts).
N’oubliez pas d’ouvrir l’aperçu à droite pour voir vos modifications en temps réel.
> Certaines parties de cette démonstration bêta pourraient ne pas correspondre à votre page de paiement réelle. Ces paramètres ne représentent qu’un sous-ensemble des variables de l’[objet Appearance](https://docs.stripe.com/payments/paiement/customization/appearance.md?payment-ui=embedded-components), et l’[objet Appearance](https://docs.stripe.com/payments/paiement/customization/appearance.md?payment-ui=embedded-components) ne contrôle que certains attributs des Elements Stripe. Vous êtes responsable du style du reste de votre page de paiement.
### (Facultatif) Stylisez le Payment Element
Personnalisez l’interface utilisateur du composant Payment Element en créant un [objet Appearance](https://docs.stripe.com/elements/appearance-api.md) et en initialisant Checkout avec cet objet. Utilisez la palette de couleurs et la police de votre entreprise pour l’harmoniser avec le reste de votre page de paiement. Utilisez des polices personnalisées (par exemple, Google Fonts) en initialisant Checkout avec un [jeu de polices](https://docs.stripe.com/js/custom_checkout/init#custom_checkout_init-options-elementsOptions-fonts).
N’oubliez pas d’ouvrir l’aperçu à droite pour voir vos modifications en temps réel.
> Certaines parties de cette démonstration bêta pourraient ne pas correspondre à votre page de paiement réelle. Ces paramètres ne représentent qu’un sous-ensemble des variables de l’[objet Appearance](https://docs.stripe.com/payments/paiement/customization/appearance.md?payment-ui=embedded-components), et l’[objet Appearance](https://docs.stripe.com/payments/paiement/customization/appearance.md?payment-ui=embedded-components) ne contrôle que certains attributs des Elements Stripe. Vous êtes responsable du style du reste de votre page de paiement.
### Gérer l’événement d’envoi
Écoutez l’événement de soumission du formulaire pour savoir quand confirmer le paiement via l’API Stripe.
### Finaliser le paiement
Appelez [confirmer](https://docs.stripe.com/js/custom_checkout/confirm) lorsque le client est prêt à finaliser le paiement, par exemple en réponse au clic sur un bouton de paiement.
### Gérer les erreurs
En cas d’[erreurs](https://docs.stripe.com/error-codes.md) immédiate (par exemple, la carte de votre client est refusée), Stripe.js renvoie une erreur. Affichez-la à l’intention de votre client pour qu’il puisse effectuer une nouvelle tentative de paiement.
### Créer un endpoint pour récupérer une session Checkout
Ajoutez un endpoint pour récupérer l’état d’une session Checkout.
### Ajouter une page de retour
Pour présenter les informations de commande à votre client, créez une page de retour pour l’URL que vous avez fournie en tant que `return_url` de la session Checkout. Stripe redirige le client vers cette page une fois le paiement abouti.
### Ajouter un composant de retour
Pour présenter les informations de commande à votre client, ajoutez un nouveau composant de routage et de retour pour l’URL que vous avez fournie en tant que `return_url` de la session Checkout. Stripe redirige le client vers cette page une fois le paiement abouti.
### Récupérer une session Checkout
Dès que votre page de retour est chargée, envoyez immédiatement une requête au endpoint de votre serveur. Utilisez l’ID de session Checkout dans l’URL pour récupérer le statut de la session Checkout.
### Gérer la session
Gérez le résultat de la session à l’aide de son état :
- `complete` : le paiement a abouti. Utilisez les informations de la session Checkout pour afficher une page de confirmation.
- `open` : le paiement a échoué ou a été annulé. Montez à nouveau Checkout pour que votre client puisse effectuer une nouvelle tentative.
### Exécuter l’application
Démarrer votre serveur et accéder à .
### Exécuter l’application
Démarrer votre serveur et accéder à .
### Exécuter l’application serveur
Démarrez votre serveur.
### Exécuter l’application client
Démarrez votre application React et accédez à .
```bash
npm start
```
### Faire un essai
Cliquez sur le bouton de paiement pour finaliser le paiement. Vous serez ensuite redirigé vers la page de retour spécifiée.
Si la page de retour s’affiche et que le paiement figure dans la liste des [paiements réussis](https://dashboard.stripe.com/test/payments?status%5B0%5D=successful) sur le Dashboard, cela signifie que votre intégration fonctionne comme prévu. Utilisez l’une des cartes de test suivantes pour simuler un paiement :
| Scenario | Card Number |
| ----------------------------------- | ---------------- |
| Payment succeeds | 4242424242424242 |
| Payment requires 3DS authentication | 4000002500003155 |
| Payment is declined | 4000000000009995 |
Pour en savoir plus, consultez la section [Testing](https://docs.stripe.com/testing.md).
## Félicitations !
Vous disposez désormais d’une intégration Checkout de base fonctionnelle. Apprenez maintenant à personnaliser l’apparence de votre page de paiement, à automatiser la collecte des taxes et à localiser les devises.
### Personnaliser la page de paiement
Personnalisez votre processus de paiement en utilisant des [sessions Checkout](https://docs.stripe.com/api/checkout/sessions/create.md) pour activer des fonctionnalités supplémentaires, comme la collecte d’adresses et le remplissage automatique des données clients.
### Renseigner automatiquement les données client
Utilisez [customer_email](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-customer_email) pour préremplir l’adresse e-mail du client. Vous pouvez aussi transmettre un ID [Customer](https://docs.stripe.com/api/customers.md) dans le champ customer afin de renseigner automatiquement l’adresse e-mail enregistrée pour ce client. Dans ce cas, updateEmail n’est pas disponible : désactivez ou supprimez donc le champ de saisie de l’adresse e-mail front-end. Si vous utilisez Accounts v2 pour modéliser vos clients, vous pouvez également transmettre un ID de compte dans le champ [customer_account](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-customer_account) afin de préremplir l’adresse e-mail associée. Pour en savoir plus, consultez la [différence entre les Customers v1 et les Accounts v2](https://docs.stripe.com/connect/use-accounts-as-customers.md).
### Demander les informations de facturation et de livraison
Utilisez les paramètres [billing_address_collection](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-billing_address_collection) et [shipping_address_collection](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-shipping_address_collection) pour collecter l’adresse de votre client. [shipping_address_collection](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-shipping_address_collection) exige une liste des pays autorisés (`allowed_countries`), que Checkout affiche dans un menu déroulant sur la page.
### Collecter les informations de facturation et de livraison
Utilisez l’Address Element pour collecter l’adresse de votre client.
### Automatisation de l’encaissement des taxes
Calculez et collectez le montant exact de la taxe sur vos transactions Stripe. En savoir plus sur la [taxe Stripe](https://docs.stripe.com/tax.md) et [comment l’ajouter à Checkout](https://docs.stripe.com/tax/checkout.md).
### Configurer Stripe Tax dans le Dashboard
[Activez Stripe Tax](https://dashboard.stripe.com/settings/tax/activate) pour suivre vos obligations fiscales, percevoir automatiquement les taxes et accéder aux rapports dont vous avez besoin pour remplir vos déclarations.
### Ajouter le paramètre de calcul automatique des taxes
Définissez le paramètre `automatic_tax` sur `enabled: true`.
### Collecter les informations de facturation
Utilisez l’Address Element pour collecter l’adresse de votre client.
### Localiser les devises
Adaptive Pricing permet à vos clients de payer dans leur devise locale dans plus de 150 pays.
### Activer Adaptive Pricing
[Activez Adaptive Pricing](https://dashboard.stripe.com/settings/adaptive-pricing) dans les paramètres de votre Dashboard.
### Localisation et formatage des prix
Affichez les montants localisés et formatés de l’[objet Session](https://docs.stripe.com/js/custom_checkout/session_object).
### Localisation et formatage des prix
Affichez les montants localisés et formatés à partir du hook [useCheckout](https://docs.stripe.com/js/react_stripe_js/checkout/use_checkout).
### Afficher le Currency Selector Element
Installez le composant Currency Selector Element pour permettre à vos clients de choisir leur devise et afficher le taux de change.
### Marquer votre intégration comme prête pour Adaptive Pricing
Définissez le paramètre `adaptivePricing.allowed` sur `true`.
// This test secret API key is a placeholder. Don't include personal details in requests with this key.
// To see your test secret API key embedded in code samples, sign in to your Stripe account.
// You can also find your test secret API key at https://dashboard.stripe.com/test/apikeys.
const stripe = require("stripe")("<>");
const YOUR_DOMAIN = "http://localhost:4242";
const YOUR_DOMAIN = "http://localhost:3000";
const session = await stripe.checkout.sessions.create({
ui_mode: "elements",
customer_email: "customer@example.com",
billing_address_collection: "auto",
shipping_address_collection: {
allowed_countries: ["US", "CA"],
},
line_items: [
{
// Provide the exact Price ID (for example, price_1234) of the product you want to sell
price: "{{PRICE_ID}}",
quantity: 1,
},
],
line_items: [{
price_data: {
product_data: {
name: "{{PRICE_DATA_NAME}}",
},
currency: "{{PRICE_DATA_CURRENCY}}",
unit_amount: {{PRICE_DATA_UNIT_AMOUNT}},
},
quantity: 1,
}],
line_items: [{
price_data: {
product_data: {
name: "{{PRICE_DATA_NAME}}",
},
currency: "{{PRICE_DATA_CURRENCY}}",
unit_amount: {{PRICE_DATA_UNIT_AMOUNT}},
recurring: {
interval: "{{PRICE_DATA_INTERVAL}}",
interval_count: {{PRICE_DATA_INTERVAL_COUNT}},
},
},
quantity: 1,
}],
mode: {{CHECKOUT_MODE}},
return_url: `${YOUR_DOMAIN}/complete?session_id={CHECKOUT_SESSION_ID}`,
return_url: `${YOUR_DOMAIN}/complete.html?session_id={CHECKOUT_SESSION_ID}`,
automatic_tax: {enabled: true},
});
res.send({ clientSecret: session.client_secret });
app.get("/session-status", async (req, res) => {
const session = await stripe.checkout.sessions.retrieve(req.query.session_id, {expand: ["payment_intent"]});
res.send({
status: session.status,
payment_status: session.payment_status,
payment_intent_id: session.payment_intent.id,
payment_intent_status: session.payment_intent.status
});
});
{
"name": "stripe-sample",
"version": "1.0.0",
"description": "A sample Stripe implementation",
"main": "server.js",
"scripts": {
"start": "node server.js"
},
"author": "stripe-samples",
"license": "ISC",
"dependencies": {
"express": "^4.17.1",
"stripe": "^21.0.1"
}
}
{
"name": "stripe-sample",
"version": "0.1.0",
"dependencies": {
"@stripe/react-stripe-js": "^3.7.0",
"@stripe/stripe-js": "^7.3.0",
"express": "^4.17.1",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-scripts": "^3.4.0",
"stripe": "21.0.1"
},
"devDependencies": {
"concurrently": "4.1.2"
},
"homepage": "http://localhost:3000/checkout",
"proxy": "http://localhost:4242",
"scripts": {
"start-client": "react-scripts start",
"start-server": "node server.js",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject",
"start": "concurrently \"yarn start-client\" \"yarn start-server\""
},
"eslintConfig": {
"extends": "react-app"
},
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
}
}
\# This test secret API key is a placeholder. Don't include personal details in requests with this key.
# To see your test secret API key embedded in code samples, sign in to your Stripe account.
# You can also find your test secret API key at https://dashboard.stripe.com/test/apikeys.
Stripe.api_key = '<>'
Stripe.api_version = '2026-03-25.dahlia'
YOUR_DOMAIN = 'http://localhost:4242'
YOUR_DOMAIN = 'http://localhost:3000'
session = Stripe::Checkout::Session.create({
ui_mode: 'elements',
customer_email: 'customer@example.com',
billing_address_collection: 'required',
shipping_address_collection: {
allowed_countries: ['US', 'CA'],
},
line_items: [{
\# Provide the exact Price ID (for example, price_1234) of the product you want to sell
price: '{{PRICE_ID}}',
quantity: 1,
}],
line_items: [{
price_data: {
product_data: {
name: '{{PRICE_DATA_NAME}}',
},
currency: '{{PRICE_DATA_CURRENCY}}',
unit_amount: {{PRICE_DATA_UNIT_AMOUNT}},
},
quantity: 1,
}],
line_items: [{
price_data: {
product_data: {
name: '{{PRICE_DATA_NAME}}',
},
currency: '{{PRICE_DATA_CURRENCY}}',
unit_amount: {{PRICE_DATA_UNIT_AMOUNT}},
recurring: {
interval: '{{PRICE_DATA_INTERVAL}}',
interval_count: {{PRICE_DATA_INTERVAL_COUNT}},
},
},
quantity: 1,
}],
mode: {{CHECKOUT_MODE}},
return_url: YOUR_DOMAIN + '/complete.html?session_id={CHECKOUT_SESSION_ID}',
return_url: YOUR_DOMAIN + '/complete?session_id={CHECKOUT_SESSION_ID}',
automatic_tax: {enabled: true},
})
{ clientSecret: session.client_secret }.to_json
get '/session-status' do
session = Stripe::Checkout::Session.retrieve({id: params[:session_id], expand: ["payment_intent"]})
{ status: session.status, payment_status: session.payment_status, payment_intent_id: session.payment_intent.id, payment_intent_status: session.payment_intent.status }.to_json
end
import stripe
\# This test secret API key is a placeholder. Don't include personal details in requests with this key.
# To see your test secret API key embedded in code samples, sign in to your Stripe account.
# You can also find your test secret API key at https://dashboard.stripe.com/test/apikeys.
stripe.api_key = '<>'
stripe.api_version = '2026-03-25.dahlia'
YOUR_DOMAIN = 'http://localhost:4242'
YOUR_DOMAIN = 'http://localhost:3000'
session = stripe.checkout.Session.create(
ui_mode = 'elements',
customer_email='customer@example.com',
billing_address_collection='auto',
shipping_address_collection={
'allowed_countries': ['US', 'CA'],
},
line_items=[
{
\# Provide the exact Price ID (for example, price_1234) of the product you want to sell
'price': '{{PRICE_ID}}',
'quantity': 1,
},
],
line_items=[
{
'price_data': {
'product_data': {
'name': '{{PRICE_DATA_NAME}}',
},
'currency': '{{PRICE_DATA_CURRENCY}}',
'unit_amount': {{PRICE_DATA_UNIT_AMOUNT}},
},
'quantity': 1,
},
],
line_items=[
{
'price_data': {
'product_data': {
'name': '{{PRICE_DATA_NAME}}',
},
'currency': '{{PRICE_DATA_CURRENCY}}',
'unit_amount': {{PRICE_DATA_UNIT_AMOUNT}},
'recurring': {
'interval': '{{PRICE_DATA_INTERVAL}}',
'interval_count': {{PRICE_DATA_INTERVAL_COUNT}},
},
},
'quantity': 1,
},
],
mode={{CHECKOUT_MODE}},
return_url=YOUR_DOMAIN + '/complete.html?session_id={CHECKOUT_SESSION_ID}',
return_url=YOUR_DOMAIN + '/complete?session_id={CHECKOUT_SESSION_ID}',
automatic_tax={'enabled': True},
)
return jsonify(clientSecret=session.client_secret)
@app.route('/session-status', methods=['GET'])
def session_status():
session = stripe.checkout.Session.retrieve(request.args.get('session_id'), expand=["payment_intent"])
return jsonify(status=session.status, payment_status=session.payment_status, payment_intent_id=session.payment_intent.id, payment_intent_status=session.payment_intent.status)
certifi==2026.1.4
chardet==5.2.0
click==8.3.1
Flask==3.1.2
idna==3.11
itsdangerous==2.2.0
Jinja2==3.1.6
MarkupSafe==3.0.3
requests==2.32.5
stripe==15.0.0
toml==0.10.2
Werkzeug==3.1.5
$stripe = new \Stripe\StripeClient([
"api_key" => $stripeSecretKey,
"stripe_version" => "2026-03-25.dahlia"
]);
$YOUR_DOMAIN = 'http://localhost:4242';
$YOUR_DOMAIN = 'http://localhost:3000';
$checkout_session = $stripe->checkout->sessions->create([
'ui_mode' => 'elements',
'customer_email' => 'customer@example.com',
'billing_address_collection' => 'required',
'shipping_address_collection' => [
'allowed_countries' => ['US', 'CA'],
],
'line_items' => [[
\# Provide the exact Price ID (for example, price_1234) of the product you want to sell
'price' => '{{PRICE_ID}}',
'quantity' => 1,
]],
'line_items' => [[
'price_data' => [
'product_data' => [
'name' => '{{PRICE_DATA_NAME}}',
],
'currency' => '{{PRICE_DATA_CURRENCY}}',
'unit_amount' => {{PRICE_DATA_UNIT_AMOUNT}},
],
'quantity' => 1,
]],
'line_items' => [[
'price_data' => [
'product_data' => [
'name' => '{{PRICE_DATA_NAME}}',
],
'currency' => '{{PRICE_DATA_CURRENCY}}',
'unit_amount' => {{PRICE_DATA_UNIT_AMOUNT}},
'recurring' => [
'interval' => '{{PRICE_DATA_INTERVAL}}',
'interval_count' => {{PRICE_DATA_INTERVAL_COUNT}},
],
],
'quantity' => 1,
]],
'mode' => {{CHECKOUT_MODE}},
'return_url' => $YOUR_DOMAIN . '/complete.html?session_id={CHECKOUT_SESSION_ID}',
'return_url' => $YOUR_DOMAIN . '/complete?session_id={CHECKOUT_SESSION_ID}',
'automatic_tax' => [
'enabled' => true,
],
]);
echo json_encode(array('clientSecret' => $checkout_session->client_secret));
try {
// retrieve JSON from POST body
$jsonStr = file_get_contents('php://input');
$jsonObj = json_decode($jsonStr);
$session = $stripe->checkout->sessions->retrieve($jsonObj->session_id, ['expand' => ['payment_intent']]);
echo json_encode(['status' => $session->status, 'payment_status' => $session->payment_status, 'payment_intent_id' => $session->payment_intent->id, 'payment_intent_status' => $session->payment_intent->status]);
http_response_code(200);
} catch (Error $e) {
http_response_code(500);
echo json_encode(['error' => $e->getMessage()]);
}
$stripeSecretKey = '<>';
// This test secret API key is a placeholder. Don't include personal details in requests with this key.
// To see your test secret API key embedded in code samples, sign in to your Stripe account.
// You can also find your test secret API key at https://dashboard.stripe.com/test/apikeys.
services.AddSingleton(new StripeClient("<>"));
var domain = "http://localhost:4242";
var domain = "http://localhost:3000";
UiMode = "elements",
CustomerEmail = "customer@example.com",
BillingAddressCollection = "auto",
ShippingAddressCollection = new SessionShippingAddressCollectionOptions
{
AllowedCountries = new List
{
"US",
"CA",
},
},
LineItems = new List
{
new SessionLineItemOptions
{
// Provide the exact Price ID (for example, price_1234) of the product you want to sell
Price = "{{PRICE_ID}}",
Quantity = 1,
},
},
LineItems = new List
{
new SessionLineItemOptions
{
PriceData = new SessionLineItemPriceDataOptions
{
ProductData = new SessionLineItemPriceDataProductDataOptions
{
Name = "{{PRICE_DATA_NAME}}",
},
Currency = "{{PRICE_DATA_CURRENCY}}",
UnitAmount = {{PRICE_DATA_UNIT_AMOUNT}},
},
Quantity = 1,
},
},
LineItems = new List
{
new SessionLineItemOptions
{
PriceData = new SessionLineItemPriceDataOptions
{
ProductData = new SessionLineItemPriceDataProductDataOptions
{
Name = "{{PRICE_DATA_NAME}}",
},
Currency = "{{PRICE_DATA_CURRENCY}}",
UnitAmount = {{PRICE_DATA_UNIT_AMOUNT}},
Recurring = new SessionLineItemPriceDataRecurringOptions
{
Interval = "{{PRICE_DATA_INTERVAL}}",
IntervalCount = {{PRICE_DATA_INTERVAL_COUNT}},
},
},
Quantity = 1,
},
},
Mode = {{CHECKOUT_MODE}},
ReturnUrl = domain + "/complete.html?session_id={CHECKOUT_SESSION_ID}",
ReturnUrl = domain + "/complete?session_id={CHECKOUT_SESSION_ID}",
AutomaticTax = new SessionAutomaticTaxOptions { Enabled = true },
Session session = _client.V1.Checkout.Sessions.Create(options);
return Json(new {clientSecret = session.ClientSecret});
[Route("session-status")]
[ApiController]
public class SessionStatusController : Controller
{
private readonly StripeClient _client;
public SessionStatusController(StripeClient client)
{
_client = client;
}
[HttpGet]
public ActionResult SessionStatus([FromQuery] string session_id)
{
var options = new SessionGetOptions();
options.AddExpand("payment_intent");
Session session = _client.V1.Checkout.Sessions.Get(session_id, options);
return Json(new {status = session.Status, payment_status = session.PaymentStatus, payment_intent_id = session.PaymentIntent.Id, payment_intent_status = session.PaymentIntent.Status});
}
}
"github.com/stripe/stripe-go/v85"
sc := stripe.NewClient("<>")
domain := "http://localhost:4242"
domain := "http://localhost:3000"
params := &stripe.CheckoutSessionCreateParams{
UIMode: stripe.String("elements"),
ReturnURL: stripe.String(domain + "/complete.html?session_id={CHECKOUT_SESSION_ID}"),
ReturnURL: stripe.String(domain + "/complete?session_id={CHECKOUT_SESSION_ID}"),
CustomerEmail: stripe.String("customer@example.com"),
BillingAddressCollection: stripe.String("auto"),
ShippingAddressCollection: &stripe.CheckoutSessionCreateShippingAddressCollectionParams{
AllowedCountries: stripe.StringSlice([]string{
"US",
"CA",
}),
},
LineItems: []*stripe.CheckoutSessionCreateLineItemParams{
{
// Provide the exact Price ID (for example, price_1234) of the product you want to sell
Price: stripe.String("{{PRICE_ID}}"),
Quantity: stripe.Int64(1),
},
},
LineItems: []*stripe.CheckoutSessionCreateLineItemParams{
{
PriceData: &stripe.CheckoutSessionCreateLineItemPriceDataParams{
ProductData: &stripe.CheckoutSessionCreateLineItemPriceDataProductDataParams{
Name: stripe.String("{{PRICE_DATA_NAME}}"),
},
Currency: stripe.String("{{PRICE_DATA_CURRENCY}}"),
UnitAmount: stripe.Int64({{PRICE_DATA_UNIT_AMOUNT}}),
},
Quantity: stripe.Int64(1),
},
},
LineItems: []*stripe.CheckoutSessionCreateLineItemParams{
{
PriceData: &stripe.CheckoutSessionCreateLineItemPriceDataParams{
ProductData: &stripe.CheckoutSessionCreateLineItemPriceDataProductDataParams{
Name: stripe.String("{{PRICE_DATA_NAME}}"),
},
Currency: stripe.String("{{PRICE_DATA_CURRENCY}}"),
UnitAmount: stripe.Int64({{PRICE_DATA_UNIT_AMOUNT}}),
Recurring: &stripe.CheckoutSessionCreateLineItemPriceDataRecurringParams{
Interval: stripe.String("{{PRICE_DATA_INTERVAL}}"),
IntervalCount: stripe.Int64({{PRICE_DATA_INTERVAL_COUNT}}),
},
},
Quantity: stripe.Int64(1),
},
},
Mode: {{CHECKOUT_MODE}},
AutomaticTax: &stripe.CheckoutSessionCreateAutomaticTaxParams{Enabled: stripe.Bool(true)},
}
s, err := sc.V1CheckoutSessions.Create(context.TODO(), params)
if err != nil {
log.Printf("sc.V1CheckoutSessions.Create: %v", err)
}
writeJSON(w, struct {
ClientSecret string `json:"clientSecret"`
}{
ClientSecret: s.ClientSecret,
})
func retrieveCheckoutSession(sc *stripe.Client, w http.ResponseWriter, r *http.Request) {
params := &stripe.CheckoutSessionRetrieveParams{}
params.AddExpand("payment_intent")
s, _ := sc.V1CheckoutSessions.Retrieve(context.TODO(), r.URL.Query().Get("session_id"), params)
writeJSON(w, struct {
Status string `json:"status"`
PaymentStatus string `json:"payment_status"`
PaymentIntentId string `json:"payment_intent_id"`
PaymentIntentStatus string `json:"payment_intent_status"`
}{
Status: string(s.Status),
PaymentStatus: string(s.PaymentStatus),
PaymentIntentId: string(s.PaymentIntent.ID),
PaymentIntentStatus: string(s.PaymentIntent.Status),
})
}
require github.com/stripe/stripe-go/v85 v85.0.0
// This test secret API key is a placeholder. Don't include personal details in requests with this key.
// To see your test secret API key embedded in code samples, sign in to your Stripe account.
// You can also find your test secret API key at https://dashboard.stripe.com/test/apikeys.
Stripe.apiKey = "<>";
String YOUR_DOMAIN = "http://localhost:4242";
String YOUR_DOMAIN = "http://localhost:3000";
SessionCreateParams params =
SessionCreateParams.builder()
.setUiMode(SessionCreateParams.UiMode.ELEMENTS)
.setCustomerEmail("customer@example.com")
.setBillingAddressCollection(SessionCreateParams.BillingAddressCollection.REQUIRED)
.setShippingAddressCollection(
SessionCreateParams.ShippingAddressCollection.builder()
.addAllowedCountry(SessionCreateParams.ShippingAddressCollection.AllowedCountry.CA)
.addAllowedCountry(SessionCreateParams.ShippingAddressCollection.AllowedCountry.US)
.build())
.setMode({{CHECKOUT_MODE}})
.setReturnUrl(YOUR_DOMAIN + "/complete?session_id={CHECKOUT_SESSION_ID}")
.setReturnUrl(YOUR_DOMAIN + "/complete.html?session_id={CHECKOUT_SESSION_ID}")
.setAutomaticTax(
SessionCreateParams.AutomaticTax.builder()
.setEnabled(true)
.build())
.addLineItem(
SessionCreateParams.LineItem.builder()
.setQuantity(1L)
// Provide the exact Price ID (for example, price_1234) of the product you want to sell
.setPrice("{{PRICE_ID}}")
.build())
.addLineItem(
SessionCreateParams.LineItem.builder()
.setQuantity(1L)
.setPriceData(
SessionCreateParams.LineItem.PriceData.builder()
.setProductData(
SessionCreateParams.LineItem.PriceData.ProductData.builder()
.setName("{{PRICE_DATA_NAME}}")
.build())
.setCurrency("{{PRICE_DATA_CURRENCY}}")
.setUnitAmount({{PRICE_DATA_UNIT_AMOUNT}}L)
.build())
.build())
.addLineItem(
SessionCreateParams.LineItem.builder()
.setQuantity(1L)
.setPriceData(
SessionCreateParams.LineItem.PriceData.builder()
.setProductData(
SessionCreateParams.LineItem.PriceData.ProductData.builder()
.setName("{{PRICE_DATA_NAME}}")
.build())
.setCurrency("{{PRICE_DATA_CURRENCY}}")
.setUnitAmount({{PRICE_DATA_UNIT_AMOUNT}}L)
.setRecurring(
SessionCreateParams.LineItem.PriceData.Recurring.builder()
.setInterval(SessionCreateParams.LineItem.PriceData.Recurring.Interval.{{PRICE_DATA_INTERVAL}})
.setIntervalCount({{PRICE_DATA_INTERVAL_COUNT}}L)
.build())
.build())
.build())
.build();
Map map = new HashMap();
map.put("clientSecret", session.getRawJsonObject().getAsJsonPrimitive("client_secret").getAsString());
return map;
get("/session-status", (request, response) -> {
RequestOptions options = RequestOptions.builder().build();
SessionRetrieveParams params =
SessionRetrieveParams.builder().addExpand("payment_intent").build();
Session session = Session.retrieve(request.queryParams("session_id"), params, options);
Map map = new HashMap();
map.put("status", session.getRawJsonObject().getAsJsonPrimitive("status").getAsString());
map.put("payment_status", session.getRawJsonObject().getAsJsonPrimitive("payment_status").getAsString());
map.put("payment_intent_id", session.getRawJsonObject().getAsJsonObject("payment_intent").getAsJsonPrimitive("id").getAsString());
map.put("payment_intent_status", session.getRawJsonObject().getAsJsonObject("payment_intent").getAsJsonPrimitive("status").getAsString());
return map;
}, gson::toJson);
const stripe = Stripe("<>");
const emailInput = document.getElementById("email");
const emailErrors = document.getElementById("email-errors");
const validateEmail = async (email) => {
const updateResult = await actions.updateEmail(email);
const isValid = updateResult.type !== "error";
return { isValid, message: !isValid ? updateResult.error.message : null };
};
const promise = fetch("/create-checkout-session", {
method: "POST",
headers: { "Content-Type": "application/json" },
})
.then((r) => r.json())
.then((r) => r.clientSecret);
const promise = fetch('/create.php', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
})
.then((r) => r.json())
.then((r) => r.clientSecret);
const appearance = {
{{APPEARANCE}}
};
checkout = stripe.initCheckoutElementsSdk({
clientSecret: promise,
elementsOptions: { appearance },
adaptivePricing: { allowed: true },
});
checkout.on('change', (session) => {
// Handle changes to the checkout session
document.getElementById('submit').disabled = !session.canConfirm;
document.querySelector("#button-text").textContent = `Pay ${
session.total.total.amount
} now`;
});
emailInput.addEventListener("input", () => {
// Clear any validation errors
emailErrors.textContent = "";
emailInput.classList.remove("error");
});
emailInput.addEventListener("blur", async () => {
const newEmail = emailInput.value;
if (!newEmail) {
return;
}
const { isValid, message } = await validateEmail(newEmail);
if (!isValid) {
emailInput.classList.add("error");
emailErrors.textContent = message;
}
});
const paymentElement = checkout.createPaymentElement();
paymentElement.mount("#payment-element");
const billingAddressElement = checkout.createBillingAddressElement();
billingAddressElement.mount("#billing-address-element");
const billingAddressElement = checkout.createBillingAddressElement();
billingAddressElement.mount("#billing-address-element");
const shippingAddressElement = checkout.createShippingAddressElement();
shippingAddressElement.mount("#shipping-address-element");
const currencySelectorElement = checkout.createCurrencySelectorElement();
currencySelectorElement.mount("#currency-selector-element");
async function handleSubmit(e) {
e.preventDefault();
setLoading(true);
const email = document.getElementById("email").value;
const { isValid, message } = await validateEmail(email);
if (!isValid) {
emailInput.classList.add("error");
emailErrors.textContent = message;
showMessage(message);
setLoading(false);
return;
}
const { error } = await actions.confirm();
// This point will only be reached if there is an immediate error when
// confirming the payment. Otherwise, your customer will be redirected to
// your `return_url`. For some payment methods like iDEAL, your customer will
// be redirected to an intermediate site first to authorize the payment, then
// redirected to the `return_url`.
showMessage(error.message);
setLoading(false);
}
const queryString = window.location.search;
const urlParams = new URLSearchParams(queryString);
const sessionId = urlParams.get("session_id");
if (!sessionId) {
console.log("No session ID found");
setErrorState();
return;
}
const response = await fetch(`/session-status?session_id=${sessionId}`);
const response = await fetch("/status.php", {
headers: {
Accept: "application/json",
"Content-Type": "application/json",
},
method: "POST",
body: JSON.stringify({ session_id: sessionId }),
});
const session = await response.json();
setSessionDetails(session);
{
"name": "stripe-sample",
"version": "0.1.0",
"dependencies": {
"@stripe/react-stripe-js": "^6.0.0",
"@stripe/stripe-js": "^9.0.0",
"express": "^4.17.1",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-scripts": "^5.0.1",
"react-router-dom": "^6.16.0",
"stripe": "^8.202.0"
},
"devDependencies": {
"concurrently": "4.1.2"
},
"homepage": "http://localhost:3000/checkout",
"proxy": "http://localhost:4242",
"scripts": {
"start-client": "react-scripts start",
"start-server": "node server.js",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject",
"start": "concurrently \"yarn start-client\" \"yarn start-server\""
},
"eslintConfig": {
"extends": "react-app"
},
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
}
}
{
"name": "client",
"version": "0.1.0",
"private": true,
"dependencies": {
"@stripe/react-stripe-js": "^6.0.0",
"@stripe/stripe-js": "^9.0.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-scripts": "^5.0.1",
"react-router-dom": "^6.16.0"
},
"homepage": "http://localhost:3000/checkout",
"proxy": "http://127.0.0.1:4242",
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
},
"eslintConfig": {
"extends": "react-app"
},
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
}
}
import React, { useMemo } from "react";
import {loadStripe} from '@stripe/stripe-js';
import {
CheckoutElementsProvider
} from '@stripe/react-stripe-js/checkout';
// Make sure to call `loadStripe` outside of a component’s render to avoid
// recreating the `Stripe` object on every render.
// This is a public sample test API key.
// Don’t submit any personally identifiable information in requests made with this key.
// Sign in to see your own test publishable API key embedded in code samples.
const stripePromise = loadStripe("<>");
const clientSecret = useMemo(() => {
return fetch('/create-checkout-session', {
method: 'POST',
})
.then((res) => res.json())
.then((data) => data.clientSecret);
}, []);
const clientSecret = useMemo(() => {
return fetch('/create.php', {
method: 'POST',
})
.then((res) => res.json())
.then((data) => data.clientSecret);
}, []);
const appearance = {
{{APPEARANCE}}
};
} />
} />
BillingAddressElement,
BillingAddressElement,
ShippingAddressElement,
CurrencySelectorElement,
const validateEmail = async (email, checkout) => {
const updateResult = await checkout.updateEmail(email);
const isValid = updateResult.type !== "error";
return { isValid, message: !isValid ? updateResult.error.message : null };
}
const EmailInput = ({ checkout, email, setEmail, error, setError }) => {
const handleBlur = async () => {
if (!email) {
return;
}
const { isValid, message } = await validateEmail(email, checkout);
if (!isValid) {
setError(message);
}
};
const handleChange = (e) => {
setError(null);
setEmail(e.target.value);
};
return (
<>
{error &&
);
}
if (checkoutState.type === 'error') {
return (
Error: {checkoutState.error.message}
);
}
const handleSubmit = async (e) => {
e.preventDefault();
const {checkout} = checkoutState;
setIsSubmitting(true);
const { isValid, message } = await validateEmail(email, checkout);
if (!isValid) {
setEmailError(message);
setMessage(message);
setIsSubmitting(false);
return;
}
const confirmResult = await checkout.confirm();
// This point will only be reached if there is an immediate error when
// confirming the payment. Otherwise, your customer will be redirected to
// your `return_url`. For some payment methods like iDEAL, your customer will
// be redirected to an intermediate site first to authorize the payment, then
// redirected to the `return_url`.
if (confirmResult.type === 'error') {
setMessage(confirmResult.error.message);
}
setIsSubmitting(false);
};
)
\## Set Price ID
In the back end code, replace `{{PRICE_ID}}` with a Price ID (`price_xxx`) that you created.
1. Build the server
~~~
pip3 install -r requirements.txt
~~~
1. Build the server
~~~
bundle install
~~~
1. Build the server
~~~
composer install
~~~
1. Build the server
~~~
dotnet restore
~~~
1. Build the server
~~~
mvn package
~~~
2. Run the server
~~~
export FLASK_APP=server.py
python3 -m flask run --port=4242
~~~
2. Run the server
~~~
ruby server.rb -o 0.0.0.0
~~~
2. Run the server
~~~
php -S 127.0.0.1:4242 --docroot=public
~~~
2. Run the server
~~~
dotnet run
~~~
2. Run the server
~~~
java -cp target/sample-jar-with-dependencies.jar com.stripe.sample.Server
~~~
3. Build the client app
~~~
npm install
~~~
4. Run the client app
~~~
npm start
~~~
5. Go to [http://localhost:3000/checkout](http://localhost:3000/checkout)
3. Go to [http://localhost:4242/checkout.html](http://localhost:4242/checkout.html)
3. Build the client app
~~~
npm install
~~~
4. Run the client app
~~~
npm start
~~~
5. Go to [http://localhost:3000/checkout](http://localhost:3000/checkout)
3. Go to [http://localhost:4242/checkout.html](http://localhost:4242/checkout.html)
3. Build the client app
~~~
npm install
~~~
4. Run the client app
~~~
npm start
~~~
5. Go to [http://localhost:3000/checkout](http://localhost:3000/checkout)
3. Go to [http://localhost:4242/checkout.html](http://localhost:4242/checkout.html)
3. Build the client app
~~~
npm install
~~~
4. Run the client app
~~~
npm start
~~~
5. Go to [http://localhost:3000/checkout](http://localhost:3000/checkout)
3. Go to [http://localhost:4242/checkout.html](http://localhost:4242/checkout.html)
3. Build the client app
~~~
npm install
~~~
4. Run the client app
~~~
npm start
~~~
5. Go to [http://localhost:3000/checkout](http://localhost:3000/checkout)
3. Go to [http://localhost:4242/checkout.html](http://localhost:4242/checkout.html)
1. Run the server
~~~
go run server.go
~~~
2. Build the client app
~~~
npm install
~~~
3. Run the client app
~~~
npm start
~~~
4. Go to [http://localhost:3000/checkout](http://localhost:3000/checkout)
1. Run the server
~~~
go run server.go
~~~
2. Go to [http://localhost:4242/checkout.html](http://localhost:4242/checkout.html)
1. Build the application
~~~
npm install
~~~
2. Run the application
~~~
npm start
~~~
3. Go to [http://localhost:3000/checkout](http://localhost:3000/checkout)
1. Build the server
~~~
npm install
~~~
2. Run the server
~~~
npm start
~~~
3. Go to [http://localhost:4242/checkout.html](http://localhost:4242/checkout.html)
\### Development
1. Build the application
~~~shell
$ npm install
~~~
2. _Optional_: download and run the [Stripe CLI](https://stripe.com/docs/stripe-cli)
~~~shell
$ stripe listen --forward-to localhost:3000/api/webhooks
~~~
3. Run the application
~~~shell
$ STRIPE_WEBHOOK_SECRET=$(stripe listen --print-secret) npm run dev
~~~
4. Go to [localhost:3000](http://localhost:3000)
### Production
1. Build the application
~~~shell
$ npm install
$ npm build
~~~
2. Run the application
~~~shell
$ npm start
~~~
## Étapes suivantes
#### [Mettre à jour dynamiquement les postes de facture](https://docs.stripe.com/payments/checkout/dynamically-update-line-items.md)
Découvrez comment modifier dynamiquement des postes de votre session Checkout à mesure que les utilisateurs ajoutent, suppriment ou modifient des produits.
#### [Traiter les commandes](https://docs.stripe.com/checkout/fulfillment.md?payment-ui=embedded-components)
Configurez un webhook pour traiter les commandes dès que les paiements aboutissent. Les webhooks permettent de gérer de manière fiable les événements critiques.
#### [Recevoir des virements](https://docs.stripe.com/payouts.md)
Apprenez à transférer des fonds de votre compte Stripe vers votre compte bancaire.
#### [Remboursement et annulation des paiements](https://docs.stripe.com/refunds.md)
Traitez les demandes de remboursement en utilisant l’API Stripe ou le Dashboard.
#### [Gestion de la clientèle](https://docs.stripe.com/customer-management.md)
Offrez à vos clients la possibilité de gérer eux-mêmes leurs informations de paiement, leurs factures et leurs abonnements.
#### [Boutons de paiement en un clic](https://docs.stripe.com/elements/express-checkout-element/accept-a-payment.md?payment-ui=embedded-components#create-and-mount)
Utilisez l’Express Checkout Element pour accepter des paiements via des boutons de moyens de paiement en un clic.