# Paiements pour les clients existants
Découvrez comment débiter un moyen de paiement existant pendant une session.
# Page hébergée par Stripe
> This is a Page hébergée par Stripe for when platform is web and ui is stripe-hosted. View the full page at https://docs.stripe.com/payments/existing-customers?platform=web&ui=stripe-hosted.
Une session Checkout permet à vos clients de saisir leurs informations de paiement. S’il s’agit d’un client existant, vous pouvez configurer la session pour que ses informations soient préremplies avec l’une de ses [cartes bancaires enregistrées](https://docs.stripe.com/payments/save-and-reuse.md?platform=web&ui=stripe-hosted). La session Checkout affiche jusqu’à 50 cartes bancaires enregistrées avec lesquelles un client peut choisir de payer.
> #### Utiliser l’API Accounts v2 pour représenter des clients
>
> Si votre intégration utilise des [Accounts configurés par le client](https://docs.stripe.com/api/v2/core/accounts/create.md#v2_create_accounts-configuration-customer), remplacez les références `Customer` et événement dans les exemples de code par les références équivalentes de l’API Accounts v2. Pour plus d’informations, consultez la page [Représenter des clients avec des objets Account](https://docs.stripe.com/connect/use-accounts-as-customers.md).

## Créer une session Checkout [Côté client] [Côté serveur]
Ajoutez à votre site Web un bouton de paiement qui appelle un endpoint côté serveur afin de créer une session Checkout.
```html
Checkout
```
Checkout prend en charge la réutilisation d’objets Customer existants avec le [paramètre](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-customer) `customer`. Lors de la réutilisation de clients existants, tous les objets créés par Checkout, tels que les PaymentIntents et les Subscriptions, sont associés à cet objet Customer.
Associez la variable de modèle `{CHECKOUT_SESSION_ID}` à l’URL `success_url` pour accéder à l’ID de session une fois que votre client termine sa session Checkout. Après avoir créé la session Checkout, redirigez votre client vers l’[URL](https://docs.stripe.com/api/checkout/sessions/object.md#checkout_session_object-url) renvoyée dans la réponse.
```curl
curl https://api.stripe.com/v1/checkout/sessions \
-u "<>:" \
-d mode=payment \
-d "line_items[0][price]={{PRICE_ID}}" \
-d "line_items[0][quantity]=1" \
-d "customer={{CUSTOMER_ID}}" \
--data-urlencode "success_url=https://example.com/success?session_id={CHECKOUT_SESSION_ID}"
```
## Optional: Afficher les moyens de paiement enregistrés supplémentaires [Côté serveur]
> #### Conformité
>
> Lorsque vous enregistrez les informations de paiement d’un client, vous êtes responsable du respect de l’ensemble des lois, réglementations et règles du réseau en vigueur. Lorsque vous offrez à un client la possibilité d’utiliser d’anciens moyens de paiement en vue d’achats futurs, assurez-vous d’avoir obtenu le consentement de vos clients à l’enregistrement des informations de paiement aux fins d’un futur achat.
Par défaut, nous affichons uniquement les moyens de paiement configurés pour [permettre toujours le réaffichage](https://docs.stripe.com/api/payment_methods/object.md#payment_method_object-allow_redisplay).
Vous ne pouvez pas réutiliser Apple Pay et Google Pay au cours d’une même session de paiement. Par conséquent, ces moyens de paiement n’apparaissent pas dans la liste des options enregistrées. Vous devez afficher l’interface utilisateur de Google Pay et d’Apple Pay, ainsi que le bouton de demande de paiement, chaque fois que la session de paiement est active.
Vous pouvez afficher d’autres moyens de paiement précédemment enregistrés en incluant d’autres valeurs de réaffichage dans la session de paiement ou en mettant à jour le paramètre `allow_redisplay` d’un moyen de paiement sur `always`.
- Utilisez le [paramètre](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-saved_payment_method_options-allow_redisplay_filters) `allow_redisplay_filters` pour spécifier les moyens de paiement enregistrés à afficher dans Checkout. Vous pouvez définir n’importe laquelle des valeurs valides : `limited`, `unspecified` et `always`.
Si vous spécifiez le filtrage de réaffichage dans votre session Checkout, il remplace le comportement par défaut. Vous devez donc inclure la valeur `always` pour voir les moyens de paiement enregistrés.
```curl
curl https://api.stripe.com/v1/checkout/sessions \
-u "<>:" \
-d mode=payment \
-d "line_items[0][price]={{PRICE_ID}}" \
-d "line_items[0][quantity]=1" \
-d "customer={{CUSTOMER_ID}}" \
--data-urlencode "success_url=https://example.com/success?session_id={CHECKOUT_SESSION_ID}" \
-d "saved_payment_method_options[allow_redisplay_filters][0]=always" \
-d "saved_payment_method_options[allow_redisplay_filters][1]=limited" \
-d "saved_payment_method_options[allow_redisplay_filters][2]=unspecified"
```
- [Mettez à jour le moyen de paiement](https://docs.stripe.com/api/payment_methods/update.md) pour définir la valeur `allow_redisplay` des moyens de paiement individuels.
```curl
curl https://api.stripe.com/v1/payment_methods/{{PAYMENTMETHOD_ID}} \
-u "<>:" \
-d allow_redisplay=always
```
## Préremplir les champs sur la page de paiement
Si toutes les conditions suivantes sont remplies, Checkout remplit les champs **e-mail**, **nom**, **carte bancaire** et **adresse de facturation** de la page de paiement en utilisant les données de la carte bancaire enregistrée par le client :
- Checkout est en mode `payment` ou `subscription`. Le mode `setup` ne prend pas en charge le remplissage automatique des champs.
- Le client dispose d’une carte enregistrée. Checkout prend uniquement en charge le préremplissage des moyens de paiement par carte.
- La carte enregistrée a `allow_redisplay` défini sur `always` ou vous avez ajusté le [paramètre d’affichage par défaut](https://docs.stripe.com/payments/existing-customers.md#display-additional-saved-payment-methods).
- Le moyen de paiement comprend l’attribut [`billing_details`](https://docs.stripe.com/api/payment_methods/object.md#payment_method_object-billing_details) requis par la valeur [`billing_address_collection`](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-billing_address_collection) de la session Checkout :
- `auto` requiert des valeurs pour `email`, `name` et `address[country]`. Les adresses de facturation aux États-Unis, au Canada et au Royaume-Uni nécessitent également l’attribut `address[postal_code]`.
- `required` requiert des valeurs pour `email`, `name` et tous les champs `address`.
Si votre client a enregistré plusieurs cartes bancaires, Checkout préremplit les informations de la carte bancaire correspondant à l’ordre de priorité suivant :
- En mode `payment`, Stripe préremplit les champs en utilisant la dernière carte bancaire enregistrée du client.
- En mode `subscription`, Stripe préremplit le moyen de paiement par défaut du client s’il s’agit d’une carte bancaire. Sinon, la carte bancaire enregistrée la plus récente est préremplie.
Lorsque Checkout [collecte une adresse de livraison](https://docs.stripe.com/payments/collect-addresses.md), les champs de cette dernière sont préremplis si l’adresse de livraison du client figure dans l’un des [pays pris en charge](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-shipping_address_collection-allowed_countries) par la Checkout Session.
Pour permettre à vos clients de supprimer les cartes bancaires enregistrées pendant une session Checkout, définissez [save_payment_method_options[payment_method_remove]](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-saved_payment_method_options-payment_method_remove) sur `enabmed`.
> #### Expiration du préremplissage
>
> Le moyen de paiement prérempli s’affiche pendant 30 minutes après la création de la session Checkout. Après son expiration, le chargement de la même session Checkout ne préremplit plus le moyen de paiement pour des raisons de sécurité.
## Gérer les événements post-paiement [Côté serveur]
Stripe envoie un événement [checkout.session.completed](https://docs.stripe.com/api/events/types.md#event_types-checkout.session.completed) lorsqu’un client effectue un paiement par session Checkout. Utilisez l’[outil de webhook Dashboard](https://dashboard.stripe.com/webhooks) ou suivez le [guide consacré aux webhooks](https://docs.stripe.com/webhooks/quickstart.md) pour recevoir et gérer ces événements. Ceux-ci peuvent vous conduire à :
- Envoyez un e-mail de confirmation de commande à votre client.
- Enregistrez la vente dans une base de données.
- Démarrez un flux de travail d’expédition.
Écoutez ces événements plutôt que d’attendre que votre client soit redirigé vers votre site Web. Le déclenchement du traitement uniquement à partir de votre page de renvoi Checkout n’est pas fiable. En configurant votre intégration de manière à ce qu’elle écoute les événements asynchrones, vous pourrez accepter [plusieurs types de moyens de paiement](https://stripe.com/payments/payment-methods-guide) avec une seule intégration.
Pour en savoir plus, consultez notre [guide de traitement des commandes avec Checkout](https://docs.stripe.com/checkout/fulfillment.md).
Gérez les événements suivants lors de la collecte de paiements avec Checkout :
| Événement | Description | Action |
| -------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| [checkout.session.completed](https://docs.stripe.com/api/events/types.md#event_types-checkout.session.completed) | Envoyé lorsqu’un client termine une session Checkout. | Envoyez au client une confirmation de commande et *traitez* (Fulfillment is the process of providing the goods or services purchased by a customer, typically after payment is collected) sa commande. |
| [checkout.session.async_payment_succeeded](https://docs.stripe.com/api/events/types.md#event_types-checkout.session.async_payment_succeeded) | Envoyé lorsqu’un paiement effectué avec un moyen de paiement différé (par exemple, un prélèvement automatique ACH) aboutit. | Envoyez au client une confirmation de commande et *traitez* (Fulfillment is the process of providing the goods or services purchased by a customer, typically after payment is collected) sa commande. |
| [checkout.session.async_payment_failed](https://docs.stripe.com/api/events/types.md#event_types-checkout.session.async_payment_failed) | Envoyé lorsqu’un paiement effectué avec un moyen de paiement différé (par exemple, un prélèvement automatique ACH) échoue. | Informez le client de l’échec et redirigez-le vers la session pour tenter à nouveau de payer. |
# Formulaire intégré
> This is a Formulaire intégré for when platform is web and ui is embedded-form. View the full page at https://docs.stripe.com/payments/existing-customers?platform=web&ui=embedded-form.
Une session Checkout permet à vos clients de saisir leurs informations de paiement. S’il s’agit d’un client existant, vous pouvez configurer la session pour que ses informations soient préremplies avec l’une de ses [cartes bancaires enregistrées](https://docs.stripe.com/payments/save-and-reuse.md?platform=web&ui=embedded-form). La session Checkout affiche jusqu’à 50 cartes bancaires enregistrées avec lesquelles un client peut choisir de payer.
> #### Utiliser l’API Accounts v2 pour représenter des clients
>
> Si votre intégration utilise des [Accounts configurés par le client](https://docs.stripe.com/api/v2/core/accounts/create.md#v2_create_accounts-configuration-customer), remplacez les références `Customer` et événement dans les exemples de code par les références équivalentes de l’API Accounts v2. Pour plus d’informations, consultez la page [Représenter des clients avec des objets Account](https://docs.stripe.com/connect/use-accounts-as-customers.md).

## Créer une session Checkout [Côté serveur]
Checkout prend en charge la réutilisation d’objets Customer existants avec le [paramètre](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-customer) `customer`. Lors de la réutilisation de clients existants, tous les objets créés par Checkout, tels que les `PaymentIntents` et les `Subscriptions`, sont associés à cet objet `customer`.
Depuis votre serveur, créez 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)
et définissez [ui_mode](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-ui_mode) sur `embedded_page`.
Pour rediriger vos clients vers une page personnalisée hébergée sur votre site Web, spécifiez l’URL de cette page dans le paramètre [return_url](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-return_url). Incluez la variable de modèle `{CHECKOUT_SESSION_ID}` dans l’URL pour récupérer l’état de la session sur la page de retour. Checkout remplace automatiquement la variable par l’ID de session Checkout avant la redirection.
En savoir plus sur la [configuration de la page](https://docs.stripe.com/payments/accept-a-payment.md?payment-ui=checkout&ui=embedded-form#return-page) de retour et d’autres options pour [personnaliser le comportement](https://docs.stripe.com/payments/checkout/custom-success-page.md?payment-ui=embedded-form) de redirection.
Après avoir créé la session Checkout, utilisez la `client_secret` renvoyée dans la réponse pour [monter Checkout](https://docs.stripe.com/payments/existing-customers.md#mount-checkout).
```curl
curl https://api.stripe.com/v1/checkout/sessions \
-u "<>:" \
-d mode=payment \
-d "line_items[0][price]={{PRICE_ID}}" \
-d "line_items[0][quantity]=1" \
-d "customer={{CUSTOMER_ID}}" \
-d ui_mode=embedded_page \
--data-urlencode "return_url=https://example.com/success?session_id={CHECKOUT_SESSION_ID}"
```
## Optional: Afficher les moyens de paiement enregistrés supplémentaires [Côté serveur]
> #### Conformité
>
> Lorsque vous enregistrez les informations de paiement d’un client, vous êtes responsable du respect de l’ensemble des lois, réglementations et règles du réseau en vigueur. Lorsque vous offrez à un client la possibilité d’utiliser d’anciens moyens de paiement en vue d’achats futurs, assurez-vous d’avoir obtenu le consentement de vos clients à l’enregistrement des informations de paiement aux fins d’un futur achat.
Par défaut, nous affichons uniquement les moyens de paiement configurés pour [permettre toujours le réaffichage](https://docs.stripe.com/api/payment_methods/object.md#payment_method_object-allow_redisplay).
Vous ne pouvez pas réutiliser Apple Pay et Google Pay au cours d’une même session de paiement. Par conséquent, ces moyens de paiement n’apparaissent pas dans la liste des options enregistrées. Vous devez afficher l’interface utilisateur de Google Pay et d’Apple Pay, ainsi que le bouton de demande de paiement, chaque fois que la session de paiement est active.
Vous pouvez afficher d’autres moyens de paiement précédemment enregistrés en incluant d’autres valeurs de réaffichage dans la session de paiement ou en mettant à jour le paramètre `allow_redisplay` d’un moyen de paiement sur `always`.
- Utilisez le [paramètre](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-saved_payment_method_options-allow_redisplay_filters) `allow_redisplay_filters` pour spécifier les moyens de paiement enregistrés à afficher dans Checkout. Vous pouvez définir n’importe laquelle des valeurs valides : `limited`, `unspecified` et `always`.
Si vous spécifiez le filtrage de réaffichage dans votre session Checkout, il remplace le comportement par défaut. Vous devez donc inclure la valeur `always` pour voir les moyens de paiement enregistrés.
```curl
curl https://api.stripe.com/v1/checkout/sessions \
-u "<>:" \
-d mode=payment \
-d ui_mode=embedded_page \
-d "line_items[0][price]={{PRICE_ID}}" \
-d "line_items[0][quantity]=1" \
-d "customer={{CUSTOMER_ID}}" \
--data-urlencode "return_url=https://example.com/return?session_id={CHECKOUT_SESSION_ID}" \
-d "saved_payment_method_options[allow_redisplay_filters][0]=always" \
-d "saved_payment_method_options[allow_redisplay_filters][1]=limited" \
-d "saved_payment_method_options[allow_redisplay_filters][2]=unspecified"
```
- [Mettez à jour le moyen de paiement](https://docs.stripe.com/api/payment_methods/update.md) pour définir la valeur `allow_redisplay` des moyens de paiement individuels.
```curl
curl https://api.stripe.com/v1/payment_methods/{{PAYMENTMETHOD_ID}} \
-u "<>:" \
-d allow_redisplay=always
```
## Monter Checkout [Côté client]
#### HTML + JS
Checkout est disponible dans [Stripe.js](https://docs.stripe.com/js.md). Intégrez le script Stripe.js à votre page en l’ajoutant à l’en-tête de votre fichier HTML. Ensuite, créez un nœud DOM vide (conteneur) à utiliser pour le montage.
```html
```
Initialisez Stripe.js avec votre clé API publique.
Créez une fonction `fetchClientSecret` asynchrone qui demande à votre serveur de créer la session Checkout et de récupérer la clé secrète du client. Transmettez cette fonction dans la propriété `options` lorsque vous créez l’instance Checkout :
```javascript
// Initialize Stripe.js
const stripe = Stripe('<>');
initialize();
// Fetch Checkout Session and retrieve the client secret
async function initialize() {
const fetchClientSecret = async () => {
const response = await fetch("/create-checkout-session", {
method: "POST",
});
const { clientSecret } = await response.json();
return clientSecret;
};
// Initialize Checkout
const checkout = await stripe.createEmbeddedCheckoutPage({
fetchClientSecret,
});
// Mount Checkout
checkout.mount('#checkout');
}
```
#### React
Installez [react-stripe-js](https://docs.stripe.com/sdks/stripejs-react.md) et le chargeur Stripe.js à partir de npm :
```bash
npm install --save @stripe/react-stripe-js @stripe/stripe-js
```
Pour utiliser le composant Checkout intégré, créez un `EmbeddedCheckoutProvider`. Appelez `loadStripe` avec votre clé API publique et transmettez la valeur `Promise` au prestataire.
Créez une fonction `fetchClientSecret` asynchrone qui demande à votre serveur de créer la session Checkout et de récupérer la clé secrète du client. Transmettez cette fonction dans la propriété `options` acceptée par le prestataire.
```jsx
import * as React from 'react';
import {loadStripe} from '@stripe/stripe-js';
import {
EmbeddedCheckoutProvider,
EmbeddedCheckout
} from '@stripe/react-stripe-js';
// Make sure to call `loadStripe` outside of a component’s render to avoid
// recreating the `Stripe` object on every render.
const stripePromise = loadStripe('pk_test_123');
const App = () => {
const fetchClientSecret = React.useCallback(() => {
// Create a Checkout Session
return fetch("/create-checkout-session", {
method: "POST",
})
.then((res) => res.json())
.then((data) => data.clientSecret);
}, []);
const options = {fetchClientSecret};
return (
)
}
```
Checkout s’affiche dans un iframe qui envoie de manière sécurisée les informations de paiement à Stripe via une connexion HTTPS.
> Évitez de placer Checkout dans un autre iframe, car certains moyens de paiement nécessitent une redirection vers une autre page pour la confirmation du paiement.
### Personnaliser l’apparence
Personnalisez Checkout pour qu’il corresponde au design de votre site en définissant la couleur d’arrière-plan, la couleur des boutons, le rayon de la bordure et les polices dans les [paramètres de marque](https://dashboard.stripe.com/settings/branding) de votre compte.
Par défaut, Checkout s’affiche sans espacement externe ni marge. Nous vous recommandons d’utiliser un élément de conteneur tel qu’un espace div pour appliquer la marge souhaitée (par exemple, 16 px sur tous les côtés).
## Préremplir les champs sur la page de paiement
Si toutes les conditions suivantes sont remplies, Checkout remplit les champs **e-mail**, **nom**, **carte bancaire** et **adresse de facturation** de la page de paiement en utilisant les données de la carte bancaire enregistrée par le client :
- Checkout est en mode `payment` ou `subscription`. Le mode `setup` ne prend pas en charge le remplissage automatique des champs.
- Le client dispose d’une carte enregistrée. Checkout prend uniquement en charge le préremplissage des moyens de paiement par carte.
- La carte enregistrée a `allow_redisplay` défini sur `always` ou vous avez ajusté le [paramètre d’affichage par défaut](https://docs.stripe.com/payments/existing-customers.md#display-additional-saved-payment-methods).
- Le moyen de paiement comprend l’attribut [`billing_details`](https://docs.stripe.com/api/payment_methods/object.md#payment_method_object-billing_details) requis par la valeur [`billing_address_collection`](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-billing_address_collection) de la session Checkout :
- `auto` requiert des valeurs pour `email`, `name` et `address[country]`. Les adresses de facturation aux États-Unis, au Canada et au Royaume-Uni nécessitent également l’attribut `address[postal_code]`.
- `required` requiert des valeurs pour `email`, `name` et tous les champs `address`.
Si votre client a enregistré plusieurs cartes bancaires, Checkout préremplit les informations de la carte bancaire correspondant à l’ordre de priorité suivant :
- En mode `payment`, Stripe préremplit les champs en utilisant la dernière carte bancaire enregistrée du client.
- En mode `subscription`, Stripe préremplit le moyen de paiement par défaut du client s’il s’agit d’une carte bancaire. Sinon, la carte bancaire enregistrée la plus récente est préremplie.
Lorsque Checkout [collecte une adresse de livraison](https://docs.stripe.com/payments/collect-addresses.md), les champs de cette dernière sont préremplis si l’adresse de livraison du client figure dans l’un des [pays pris en charge](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-shipping_address_collection-allowed_countries) par la Checkout Session.
Pour permettre à vos clients de supprimer les cartes bancaires enregistrées pendant une session Checkout, définissez [save_payment_method_options[payment_method_remove]](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-saved_payment_method_options-payment_method_remove) sur `enabmed`.
> #### Expiration du préremplissage
>
> Le moyen de paiement prérempli s’affiche pendant 30 minutes après la création de la session Checkout. Après son expiration, le chargement de la même session Checkout ne préremplit plus le moyen de paiement pour des raisons de sécurité.
## Gérer les événements post-paiement [Côté serveur]
Stripe envoie un événement [checkout.session.completed](https://docs.stripe.com/api/events/types.md#event_types-checkout.session.completed) lorsqu’un client effectue un paiement par session Checkout. Utilisez l’[outil de webhook Dashboard](https://dashboard.stripe.com/webhooks) ou suivez le [guide consacré aux webhooks](https://docs.stripe.com/webhooks/quickstart.md) pour recevoir et gérer ces événements. Ceux-ci peuvent vous conduire à :
- Envoyez un e-mail de confirmation de commande à votre client.
- Enregistrez la vente dans une base de données.
- Démarrez un flux de travail d’expédition.
Écoutez ces événements plutôt que d’attendre que votre client soit redirigé vers votre site Web. Le déclenchement du traitement uniquement à partir de votre page de renvoi Checkout n’est pas fiable. En configurant votre intégration de manière à ce qu’elle écoute les événements asynchrones, vous pourrez accepter [plusieurs types de moyens de paiement](https://stripe.com/payments/payment-methods-guide) avec une seule intégration.
Pour en savoir plus, consultez notre [guide de traitement des commandes avec Checkout](https://docs.stripe.com/checkout/fulfillment.md).
Gérez les événements suivants lors de la collecte de paiements avec Checkout :
| Événement | Description | Action |
| -------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| [checkout.session.completed](https://docs.stripe.com/api/events/types.md#event_types-checkout.session.completed) | Envoyé lorsqu’un client termine une session Checkout. | Envoyez au client une confirmation de commande et *traitez* (Fulfillment is the process of providing the goods or services purchased by a customer, typically after payment is collected) sa commande. |
| [checkout.session.async_payment_succeeded](https://docs.stripe.com/api/events/types.md#event_types-checkout.session.async_payment_succeeded) | Envoyé lorsqu’un paiement effectué avec un moyen de paiement différé (par exemple, un prélèvement automatique ACH) aboutit. | Envoyez au client une confirmation de commande et *traitez* (Fulfillment is the process of providing the goods or services purchased by a customer, typically after payment is collected) sa commande. |
| [checkout.session.async_payment_failed](https://docs.stripe.com/api/events/types.md#event_types-checkout.session.async_payment_failed) | Envoyé lorsqu’un paiement effectué avec un moyen de paiement différé (par exemple, un prélèvement automatique ACH) échoue. | Informez le client de l’échec et redirigez-le vers la session pour tenter à nouveau de payer. |
# Composants intégrés
> This is a Composants intégrés for when platform is web and ui is embedded-components. View the full page at https://docs.stripe.com/payments/existing-customers?platform=web&ui=embedded-components.
Une session Checkout permet à vos clients de saisir leurs informations de paiement. S’il s’agit d’un client existant, vous pouvez configurer la session pour que ses informations soient préremplies avec l’une de ses [cartes bancaires enregistrées](https://docs.stripe.com/payments/checkout/save-during-payment.md?payment-ui=embedded-components). La session Checkout affiche jusqu’à 50 cartes bancaires enregistrées avec lesquelles un client peut choisir de payer.
> #### Utiliser l’API Accounts v2 pour représenter des clients
>
> Si votre intégration utilise des [Accounts configurés par le client](https://docs.stripe.com/api/v2/core/accounts/create.md#v2_create_accounts-configuration-customer), remplacez les références `Customer` et événement dans les exemples de code par les références équivalentes de l’API Accounts v2. Pour plus d’informations, consultez la page [Représenter des clients avec des objets Account](https://docs.stripe.com/connect/use-accounts-as-customers.md).

## Créer une session Checkout [Côté client] [Côté serveur]
Checkout Sessions prend en charge la réutilisation d’objets `Customer` existants avec le [paramètre](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-customer) `Customer`. Lors de la réutilisation de clients existants, tous les objets créés par Checkout, tels que les `PaymentIntents` et les `Subscriptions`, sont associés à cet objet `Customer`.
```curl
curl https://api.stripe.com/v1/checkout/sessions \
-u "<>:" \
-d mode=payment \
-d ui_mode=elements \
-d "line_items[0][price]={{PRICE_ID}}" \
-d "line_items[0][quantity]=1" \
-d "customer={{CUSTOMER_ID}}" \
--data-urlencode "return_url=https://example.com/return?session_id={CHECKOUT_SESSION_ID}"
```
## Optional: Afficher les moyens de paiement enregistrés supplémentaires [Côté serveur]
> #### Conformité
>
> Lorsque vous enregistrez les informations de paiement d’un client, vous êtes responsable du respect de l’ensemble des lois, réglementations et règles du réseau en vigueur. Lorsque vous offrez à un client la possibilité d’utiliser d’anciens moyens de paiement en vue d’achats futurs, assurez-vous d’avoir obtenu le consentement de vos clients à l’enregistrement des informations de paiement aux fins d’un futur achat.
Par défaut, nous affichons uniquement les moyens de paiement configurés pour [permettre toujours le réaffichage](https://docs.stripe.com/api/payment_methods/object.md#payment_method_object-allow_redisplay).
Vous ne pouvez pas réutiliser Apple Pay et Google Pay au cours d’une même session de paiement. Par conséquent, ces moyens de paiement n’apparaissent pas dans la liste des options enregistrées. Vous devez afficher l’interface utilisateur de Google Pay et d’Apple Pay, ainsi que le bouton de demande de paiement, chaque fois que la session de paiement est active.
Vous pouvez afficher d’autres moyens de paiement précédemment enregistrés en incluant d’autres valeurs de réaffichage dans la session de paiement ou en mettant à jour le paramètre `allow_redisplay` d’un moyen de paiement sur `always`.
- Utilisez le [paramètre](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-saved_payment_method_options-allow_redisplay_filters) `allow_redisplay_filters` pour spécifier les moyens de paiement enregistrés à afficher dans Checkout. Vous pouvez définir n’importe laquelle des valeurs valides : `limited`, `unspecified` et `always`.
Si vous spécifiez le filtrage de réaffichage dans votre session Checkout, il remplace le comportement par défaut. Vous devez donc inclure la valeur `always` pour voir les moyens de paiement enregistrés.
```curl
curl https://api.stripe.com/v1/checkout/sessions \
-u "<>:" \
-d mode=payment \
-d ui_mode=elements \
-d "line_items[0][price]={{PRICE_ID}}" \
-d "line_items[0][quantity]=1" \
-d "customer={{CUSTOMER_ID}}" \
--data-urlencode "return_url=https://example.com/return?session_id={CHECKOUT_SESSION_ID}" \
-d "saved_payment_method_options[allow_redisplay_filters][0]=always" \
-d "saved_payment_method_options[allow_redisplay_filters][1]=limited" \
-d "saved_payment_method_options[allow_redisplay_filters][2]=unspecified"
```
- [Mettez à jour le moyen de paiement](https://docs.stripe.com/api/payment_methods/update.md) pour définir la valeur `allow_redisplay` des moyens de paiement individuels.
```curl
curl https://api.stripe.com/v1/payment_methods/{{PAYMENTMETHOD_ID}} \
-u "<>:" \
-d allow_redisplay=always
```
## Afficher le Payment Element [Côté client]
#### HTML + JS
### Configurer Stripe.js
Incluez le script Stripe .js sur votre page de paiement en l’ajoutant dans le champ `head` de votre fichier HTML. Chargez toujours Stripe.js directement à partir de js.stripe.com pour rester en conformité avec la norme PCI. N’incluez pas le script dans un lot et n’en hébergez pas de copie vous-même.
```html
Checkout
```
Créez une instance de Stripe avec le code JavaScript suivant sur votre page de paiement :
```javascript
// Set your publishable key: remember to change this to your live publishable key in production
// See your keys here: https://dashboard.stripe.com/apikeys
const stripe = Stripe('<>');
```
### Ajouter l’Element Payment à votre page de paiement
Le composant Element Payment doit avoir un emplacement dédié dans votre page de paiement. Créez un nœud DOM (conteneur) vide doté d’un ID unique dans votre formulaire de paiement :
```html
```
Récupérez la session de paiement `client_secret` de l’étape précédente pour initialiser l’objet `Checkout`. Ensuite, créez et montez l’élément de paiement.
```javascript
const promise = fetch("/create-checkout-session", {
method: "POST",
headers: { "Content-Type": "application/json" },
})
.then((r) => r.json())
.then((r) => r.clientSecret);
// Initialize Checkout
const checkout = stripe.initCheckoutElementsSdk({
clientSecret: promise,
});
// Create and mount the Payment Element
const paymentElement = checkout.createPaymentElement();
paymentElement.mount('#payment-element');
```
#### React
### Configurer Stripe.js
Installez [React Stripe.js](https://www.npmjs.com/package/@stripe/react-stripe-js) et le [chargeur Stripe.js](https://www.npmjs.com/package/@stripe/stripe-js) à partir du registre public npm :
```bash
npm install --save @stripe/react-stripe-js @stripe/stripe-js
```
### Ajoutez et configurez le CheckoutElementsProvider sur votre page de paiement
Récupérez le `client_secret` de la session Checkout à l’étape précédente afin d’initialiser le [CheckoutElementsProvider](https://docs.stripe.com/js/react_stripe_js/checkout/checkout_provider). Ensuite, affichez le composant `CheckoutForm` qui contient le formulaire de paiement.
```jsx
import React, {useMemo} from 'react';
import ReactDOM from 'react-dom';
import {CheckoutElementsProvider} from '@stripe/react-stripe-js/checkout';
import {loadStripe} from '@stripe/stripe-js';
import CheckoutForm from './CheckoutForm';
// Make sure to call `loadStripe` outside of a component's render to avoid
// recreating the `Stripe` object on every render.
const stripePromise = loadStripe('<>');
function App() {
const promise = useMemo(() => {
return fetch('/create-checkout-session', {
method: 'POST',
})
.then((res) => res.json())
.then((data) => data.clientSecret);
}, []);
return (
);
};
ReactDOM.render(, document.getElementById('root'));
```
### Ajouter le composant Payment Element
Utilisez le composant `PaymentElement` pour afficher le formulaire de paiement.
```jsx
import React from 'react';
import {PaymentElement} from '@stripe/react-stripe-js/checkout';
const CheckoutForm = () => {
return (
);
};
export default CheckoutForm;
```
## Préremplir les champs sur la page de paiement
Si l’ensemble des conditions suivantes sont satisfaites, l’[objet Session](https://docs.stripe.com/js/custom_checkout/session_object) contient l’**e-mail**, le **nom**, la **carte bancaire** et l’**adresse de facturation** issus de la carte enregistrée du client pour que vous puissiez les afficher sur votre page de paiement, et le Payment Element permet d’afficher la carte enregistrée :
- Checkout est en mode `payment` ou `subscription`. Le mode `setup` ne prend pas en charge le remplissage automatique des champs.
- Le client dispose d’une carte enregistrée. Checkout prend uniquement en charge le préremplissage des moyens de paiement par carte.
- La carte enregistrée a `allow_redisplay` défini sur `always` ou vous avez ajusté le [paramètre d’affichage par défaut](https://docs.stripe.com/payments/existing-customers.md#display-additional-saved-payment-methods).
- Le moyen de paiement comprend l’attribut [`billing_details`](https://docs.stripe.com/api/payment_methods/object.md#payment_method_object-billing_details) requis par la valeur [`billing_address_collection`](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-billing_address_collection) de la session Checkout :
- `auto` requiert des valeurs pour `email`, `name` et `address[country]`. Les adresses de facturation aux États-Unis, au Canada et au Royaume-Uni nécessitent également l’attribut `address[postal_code]`.
- `required` requiert des valeurs pour `email`, `name` et tous les champs `address`.
Si votre client a enregistré plusieurs cartes bancaires, le Payment Element affiche la carte enregistrée qui correspond à l’ordre de priorité suivant :
- En mode `payment`, Stripe préremplit les champs en utilisant la dernière carte bancaire enregistrée du client.
- En mode `subscription`, Stripe préremplit le moyen de paiement par défaut du client s’il s’agit d’une carte bancaire. Sinon, la carte bancaire enregistrée la plus récente est préremplie.
Lors de la [collecte d’une adresse de livraison](https://docs.stripe.com/payments/collect-addresses.md), l’[objet de session](https://docs.stripe.com/js/custom_checkout/session_object) contient les champs de l’adresse de livraison si l’[adresse.de.livraison](https://docs.stripe.com/api/customers/object.md#customer_object-shipping-address) du client correspond aux [pays pris en charge](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-shipping_address_collection-allowed_countries) de la session de paiement.
Pour permettre à vos clients de supprimer les cartes bancaires enregistrées pendant une session Checkout, définissez [save_payment_method_options[payment_method_remove]](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-saved_payment_method_options-payment_method_remove) sur `enabmed`.
> #### Expiration du préremplissage
>
> Le moyen de paiement prérempli s’affiche pendant 30 minutes après la création de la session Checkout. Après son expiration, le chargement de la même session Checkout ne préremplit plus le moyen de paiement pour des raisons de sécurité.
## Envoyer le paiement à Stripe [Côté client]
#### HTML + JS
Affichez un bouton **Payer** qui appelle [confirm](https://docs.stripe.com/js/custom_checkout/confirm) depuis l’instance `Checkout` pour soumettre le paiement.
```html
```
```js
const checkout = stripe.initCheckoutElementsSdk({clientSecret});
checkout.on('change', (session) => {
document.getElementById('pay-button').disabled = !session.canConfirm;
});
const loadActionsResult = await checkout.loadActions();
if (loadActionsResult.type === 'success') {
const {actions} = loadActionsResult;
const button = document.getElementById('pay-button');
const errors = document.getElementById('confirm-errors');
button.addEventListener('click', () => {
// Clear any validation errors
errors.textContent = '';
actions.confirm().then((result) => {
if (result.type === 'error') {
errors.textContent = result.error.message;
}
});
});
}
```
#### React
Affichez un bouton **Payer** qui appelle [confirm](https://docs.stripe.com/js/custom_checkout/confirm) depuis [useCheckout](https://docs.stripe.com/js/react_stripe_js/checkout/use_checkout) pour soumettre le paiement.
```jsx
import React from 'react';
import {useCheckout} from '@stripe/react-stripe-js/checkout';
const PayButton = () => {
const checkoutState = useCheckout();
const [loading, setLoading] = React.useState(false);
const [error, setError] = React.useState(null);
if (checkoutState.type !== "success") {
return null;
}
const handleClick = () => {
setLoading(true);checkoutState.checkout.confirm().then((result) => {
if (result.type === 'error') {
setError(result.error)
}
setLoading(false);
})
};
return (
{error &&
{error.message}
}
)
};
export default PayButton;
```
## Gérer les événements post-paiement [Côté serveur]
Stripe envoie un événement [checkout.session.completed](https://docs.stripe.com/api/events/types.md#event_types-checkout.session.completed) lorsqu’un client effectue un paiement par session Checkout. Utilisez l’[outil de webhook Dashboard](https://dashboard.stripe.com/webhooks) ou suivez le [guide consacré aux webhooks](https://docs.stripe.com/webhooks/quickstart.md) pour recevoir et gérer ces événements. Ceux-ci peuvent vous conduire à :
- Envoyez un e-mail de confirmation de commande à votre client.
- Enregistrez la vente dans une base de données.
- Démarrez un flux de travail d’expédition.
Écoutez ces événements plutôt que d’attendre que votre client soit redirigé vers votre site Web. Le déclenchement du traitement uniquement à partir de votre page de renvoi Checkout n’est pas fiable. En configurant votre intégration de manière à ce qu’elle écoute les événements asynchrones, vous pourrez accepter [plusieurs types de moyens de paiement](https://stripe.com/payments/payment-methods-guide) avec une seule intégration.
Pour en savoir plus, consultez notre [guide de traitement des commandes avec Checkout](https://docs.stripe.com/checkout/fulfillment.md).
Gérez les événements suivants lors de la collecte de paiements avec Checkout :
| Événement | Description | Action |
| -------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| [checkout.session.completed](https://docs.stripe.com/api/events/types.md#event_types-checkout.session.completed) | Envoyé lorsqu’un client termine une session Checkout. | Envoyez au client une confirmation de commande et *traitez* (Fulfillment is the process of providing the goods or services purchased by a customer, typically after payment is collected) sa commande. |
| [checkout.session.async_payment_succeeded](https://docs.stripe.com/api/events/types.md#event_types-checkout.session.async_payment_succeeded) | Envoyé lorsqu’un paiement effectué avec un moyen de paiement différé (par exemple, un prélèvement automatique ACH) aboutit. | Envoyez au client une confirmation de commande et *traitez* (Fulfillment is the process of providing the goods or services purchased by a customer, typically after payment is collected) sa commande. |
| [checkout.session.async_payment_failed](https://docs.stripe.com/api/events/types.md#event_types-checkout.session.async_payment_failed) | Envoyé lorsqu’un paiement effectué avec un moyen de paiement différé (par exemple, un prélèvement automatique ACH) échoue. | Informez le client de l’échec et redirigez-le vers la session pour tenter à nouveau de payer. |
# Flux personnalisé
> This is a Flux personnalisé for when platform is web and ui is elements. View the full page at https://docs.stripe.com/payments/existing-customers?platform=web&ui=elements.
Le composant Payment Element permet à vos clients de saisir leurs informations de paiement. S’il s’agit d’un client existant, vous pouvez configurer une session Checkout dans le Payment Element pour afficher les [moyens de paiement existants](https://docs.stripe.com/payments/save-and-reuse.md?platform=web&ui=elements) du client.
> #### Utiliser l’API Accounts v2 pour représenter des clients
>
> Si votre intégration utilise des [Accounts configurés par le client](https://docs.stripe.com/api/v2/core/accounts/create.md#v2_create_accounts-configuration-customer), remplacez les références `Customer` et événement dans les exemples de code par les références équivalentes de l’API Accounts v2. Pour plus d’informations, consultez la page [Représenter des clients avec des objets Account](https://docs.stripe.com/connect/use-accounts-as-customers.md).

Le composant Payment Element peut uniquement afficher les types de moyens de paiement enregistrés suivants :
- `card`
- `link`
- `us_bank_account`
- `acss_debit`
- `sepa_debit`
- `bacs_debit`
- `au_becs_debit`
- `nz_bank_account`
- `ideal`
- `sofort`
- `bancontact`
## Créer un PaymentIntent et une CustomerSession [Côté serveur]
Créez un [PaymentIntent](https://docs.stripe.com/api/payment_intents/create.md) et une [CustomerSession](https://docs.stripe.com/api/customer_sessions/create.md). Veillez à transmettre l’ID existant du client et à activer la fonctionnalité `payment_method_redisplay`.
#### Accounts v2
#### Ruby
```ruby
# Don't put any keys in code. See https://docs.stripe.com/keys-best-practices.
# Find your keys at https://dashboard.stripe.com/apikeys.
Stripe.api_key = '<>'
post '/create-intent-and-customer-session' do
intent = Stripe::PaymentIntent.create({
amount: 1099,
currency: 'usd',
automatic_payment_methods: {enabled: true},
customer_account: {{CUSTOMER_ACCOUNT_ID}},
})
customer_session = Stripe::CustomerSession.create({
customer_account: {{CUSTOMER_ACCOUNT_ID}},
components: {
payment_element: {
enabled: true,
features: {
payment_method_redisplay: 'enabled',
},
},
},
})
{
client_secret: intent.client_secret,
customer_session_client_secret: customer_session.client_secret
}.to_json
end
```
#### Customers v1
#### Ruby
```ruby
# Don't put any keys in code. See https://docs.stripe.com/keys-best-practices.
# Find your keys at https://dashboard.stripe.com/apikeys.
Stripe.api_key = '<>'
post '/create-intent-and-customer-session' do
intent = Stripe::PaymentIntent.create({
amount: 1099,
currency: 'usd',
# In the latest version of the API, specifying the `automatic_payment_methods` parameter
# is optional because Stripe enables its functionality by default.
automatic_payment_methods: {enabled: true},
customer: {{CUSTOMER_ID}},
})
customer_session = Stripe::CustomerSession.create({
customer: {{CUSTOMER_ID}},
components: {
payment_element: {
enabled: true,
features: {
payment_method_redisplay: 'enabled',
},
},
},
})
{
client_secret: intent.client_secret,
customer_session_client_secret: customer_session.client_secret
}.to_json
end
```
## Optional: Afficher les moyens de paiement enregistrés supplémentaires [Côté serveur]
> #### Conformité
>
> Lorsque vous enregistrez les informations de paiement d’un client, vous êtes responsable du respect de l’ensemble des lois, réglementations et règles du réseau en vigueur. Lorsque vous offrez à un client la possibilité d’utiliser d’anciens moyens de paiement en vue d’achats futurs, assurez-vous d’avoir obtenu le consentement de vos clients à l’enregistrement des informations de paiement aux fins d’un futur achat.
Par défaut, nous affichons uniquement les moyens de paiement configurés pour [permettre toujours le réaffichage](https://docs.stripe.com/api/payment_methods/object.md#payment_method_object-allow_redisplay).
Vous ne pouvez pas réutiliser Apple Pay et Google Pay au cours d’une même session de paiement. Par conséquent, ces moyens de paiement n’apparaissent pas dans la liste des options enregistrées. Vous devez afficher l’interface utilisateur de Google Pay et d’Apple Pay, ainsi que le bouton de demande de paiement, chaque fois que la session de paiement est active.
Vous pouvez afficher d’autres moyens de paiement précédemment enregistrés en incluant d’autres valeurs de réaffichage dans la session de paiement ou en mettant à jour le paramètre `allow_redisplay` d’un moyen de paiement sur `always`.
- Utilisez le [paramètre](https://docs.stripe.com/api/customer_sessions/create.md#create_customer_session-components-payment_element-features-payment_method_allow_redisplay_filters) `payment_method_allow_redisplay_filters` pour spécifier les moyens de paiement enregistrés à afficher dans le Payment Element. Vous pouvez définir n’importe laquelle des valeurs valides : `limited`, `unspecified` et `always`.
```curl
curl https://api.stripe.com/v1/customer_sessions \
-u "<>:" \
-d "customer={{CUSTOMER_ID}}" \
-d "components[payment_element][enabled]=true" \
-d "components[payment_element][features][payment_method_redisplay]=enabled" \
-d "components[payment_element][features][payment_method_allow_redisplay_filters][]=always" \
-d "components[payment_element][features][payment_method_allow_redisplay_filters][]=limited" \
-d "components[payment_element][features][payment_method_allow_redisplay_filters][]=unspecified"
```
- [Mettez à jour le moyen de paiement](https://docs.stripe.com/api/payment_methods/update.md) pour définir la valeur `allow_redisplay` des moyens de paiement individuels.
```curl
curl https://api.stripe.com/v1/payment_methods/{{PAYMENTMETHOD_ID}} \
-u "<>:" \
-d allow_redisplay=always
```
## Afficher le Payment Element [Côté client]
#### HTML + JS
### Configurer Stripe.js
Incluez le script Stripe .js sur votre page de paiement en l’ajoutant dans le champ `head` de votre fichier HTML. Chargez toujours Stripe.js directement à partir de js.stripe.com pour rester en conformité avec la norme PCI. N’incluez pas le script dans un lot et n’en hébergez pas de copie vous-même.
```html
Checkout
```
Créez une instance de Stripe avec le code JavaScript suivant sur votre page de paiement :
```javascript
// Set your publishable key: remember to change this to your live publishable key in production
// See your keys here: https://dashboard.stripe.com/apikeys
const stripe = Stripe('<>');
```
### Ajouter l’Element Payment à votre page de paiement
Le composant Element Payment doit avoir un emplacement dédié dans votre page de paiement. Créez un nœud DOM (conteneur) vide doté d’un ID unique dans votre formulaire de paiement :
```html
```
Récupérez les deux `clients_secret` de l’étape précédente pour initialiser l’Element. Ensuite, créez et montez le Payment Element.
```javascript
// Fetch the two `client_secret`
const response = await fetch('/create-intent-and-customer-session', { method: "POST" });
const { client_secret, customer_session_client_secret } = await response.json();
// Initialize Elements
const elements = stripe.elements({
clientSecret: client_secret,
customerSessionClientSecret: customer_session_client_secret,
});
// Create and mount the Payment Element
const paymentElementOptions = { layout: 'accordion'};
const paymentElement = elements.create('payment', paymentElementOptions);
paymentElement.mount('#payment-element');
```
#### React
### Configurer Stripe.js
Installez [React Stripe.js](https://www.npmjs.com/package/@stripe/react-stripe-js) et le [chargeur Stripe.js](https://www.npmjs.com/package/@stripe/stripe-js) à partir du registre public npm :
```bash
npm install --save @stripe/react-stripe-js @stripe/stripe-js
```
### Ajouter et configurer le fournisseur Elements sur votre page de paiement
Récupérez les deux `clients_secret` de l’étape précédente pour initialiser le [fournisseur d’Elements](https://docs.stripe.com/sdks/stripejs-react.md#elements-provider). Affichez ensuite le composant CheckoutForm qui contient le formulaire de paiement.
```jsx
import React from 'react';
import ReactDOM from 'react-dom';
import {Elements} from '@stripe/react-stripe-js';
import {loadStripe} from '@stripe/stripe-js';
import CheckoutForm from './CheckoutForm';
// Make sure to call `loadStripe` outside of a component's render to avoid
// recreating the `Stripe` object on every render.
const stripePromise = loadStripe('<>');
function App() {
const [clientSecret, setClientSecret] = useState("");
const [customerSessionClientSecret, setCustomerSessionClientSecret] = useState("");
// Fetch the two `client_secret`
useEffect(() => {
fetch("/create-intent-and-customer-session", { method: "POST" })
.then((res) => res.json())
.then((data) => {
setClientSecret(data.client_secret);
setCustomerSessionClientSecret(data.customer_session_client_secret);
});
}, []);
// Initialize the Element provider once we we received the two `client_secret`
// And render the CheckoutForm
return (
);
};
ReactDOM.render(, document.getElementById('root'));
```
### Ajouter le composant Payment Element
Utilisez le composant `PaymentElement` pour afficher le formulaire de paiement.
```jsx
import React from 'react';
import {PaymentElement} from '@stripe/react-stripe-js';
const CheckoutForm = () => {
return (
);
};
export default CheckoutForm;
```
## Envoyer le paiement à Stripe [Côté client]
Utilisez [stripe.confirmPayment](https://docs.stripe.com/js/payment_intents/confirm_payment) pour effectuer le paiement à l’aide des informations du composant Payment Element. Ajoutez un paramètre [return_url](https://docs.stripe.com/api/payment_intents/create.md#create_payment_intent-return_url) à cette fonction pour indiquer la page vers laquelle Stripe doit rediriger l’utilisateur à l’issue du paiement. Votre utilisateur peut être redirigé en premier lieu vers un site intermédiaire, comme une page d’autorisation bancaire, avant d’être redirigé vers la page spécifiée par le paramètre `return_url`. L’utilisateur sera immédiatement redirigé vers la page `return_url` après un paiement réussi par carte.
Si vous ne souhaitez pas effectuer de redirection à la fin des paiements par carte, vous pouvez assigner au paramètre [redirect](https://docs.stripe.com/js/payment_intents/confirm_payment#confirm_payment_intent-options-redirect) la valeur `if_required`. De cette manière, seuls les clients qui choisissent un moyen de paiement avec redirection seront redirigés.
#### HTML + JS
```javascript
const form = document.getElementById('payment-form');
form.addEventListener('submit', async (event) => {
event.preventDefault();
const {error} = await stripe.confirmPayment({
//`Elements` instance that was used to create the Payment Element
elements,
confirmParams: {
return_url: 'https://example.com/order/123/complete',
},
});
if (error) {
// This point will only be reached if there is an immediate error when
// confirming the payment. Show error to your customer (for example, payment
// details incomplete)
const messageContainer = document.querySelector('#error-message');
messageContainer.textContent = error.message;
} else {
// 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`.
}
});
```
#### React
Pour appeler [stripe.confirmPayment](https://docs.stripe.com/js/payment_intents/confirm_payment) depuis votre composant de formulaire de paiement, utilisez les hooks [useStripe](https://docs.stripe.com/sdks/stripejs-react.md#usestripe-hook) et [useElements](https://docs.stripe.com/sdks/stripejs-react.md#useelements-hook).
Si vous préférez les composants de classe traditionnels aux hooks, vous pouvez utiliser un [ElementsConsumer](https://docs.stripe.com/sdks/stripejs-react.md#elements-consumer).
```jsx
import React, {useState} from 'react';
import {useStripe, useElements, PaymentElement} from '@stripe/react-stripe-js';
const CheckoutForm = () => {
const stripe = useStripe();
const elements = useElements();
const [errorMessage, setErrorMessage] = useState(null);
const handleSubmit = async (event) => {
// We don't want to let default form submission happen here,
// which would refresh the page.
event.preventDefault();
if (!stripe || !elements) {
// Stripe.js hasn't yet loaded.
// Make sure to disable form submission until Stripe.js has loaded.
return;
}
const {error} = await stripe.confirmPayment({
//`Elements` instance that was used to create the Payment Element
elements,
confirmParams: {
return_url: 'https://example.com/order/123/complete',
},
});
if (error) {
// This point will only be reached if there is an immediate error when
// confirming the payment. Show error to your customer (for example, payment
// details incomplete)
setErrorMessage(error.message);
} else {
// 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`.
}
};
return (
);
};
export default CheckoutForm;
```
Veillez à ce que le paramètre `return_url` corresponde à une page de votre site web qui indique l’état du paiement. Lorsque Stripe redirige le client vers la page `return_url`, nous fournissons les paramètres de requête d’URL suivants :
| Paramètre | Description |
| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------- |
| `payment_intent` | L’identifiant unique du `PaymentIntent`. |
| `payment_intent_client_secret` | La [clé secrète du client](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-client_secret) de l’objet `PaymentIntent`. |
> Si vous disposez d’outils qui assurent le suivi de la session navigateur du client, vous devrez peut-être ajouter le domaine `stripe.com` à la liste d’exclusion des sites référents. Les redirections font que certains outils créent de nouvelles sessions, ce qui empêche le suivi de la session dans son ensemble.
Utilisez l’un des paramètres de requête pour récupérer le PaymentIntent. Consultez l’[état du PaymentIntent](https://docs.stripe.com/payments/paymentintents/lifecycle.md) pour déterminer les informations à présenter à vos clients. Vous pouvez également ajouter vos propres paramètres de requête lorsque vous ajoutez l’URL `return_url` ; ils seront conservés tout au long du processus de redirection.
#### HTML + JS
```javascript
// Initialize Stripe.js using your publishable key
const stripe = Stripe('<>');
// Retrieve the "payment_intent_client_secret" query parameter appended to
// your return_url by Stripe.js
const clientSecret = new URLSearchParams(window.location.search).get(
'payment_intent_client_secret'
);
// Retrieve the PaymentIntent
stripe.retrievePaymentIntent(clientSecret).then(({paymentIntent}) => {
const message = document.querySelector('#message')
// Inspect the PaymentIntent `status` to indicate the status of the payment
// to your customer.
//
// Some payment methods will [immediately succeed or fail][0] upon
// confirmation, while others will first enter a `processing` state.
//
// [0]: https://stripe.com/docs/payments/payment-methods#payment-notification
switch (paymentIntent.status) {
case 'succeeded':
message.innerText = 'Success! Payment received.';
break;
case 'processing':
message.innerText = "Payment processing. We'll update you when payment is received.";
break;
case 'requires_payment_method':
message.innerText = 'Payment failed. Please try another payment method.';
// Redirect your user back to your payment page to attempt collecting
// payment again
break;
default:
message.innerText = 'Something went wrong.';
break;
}
});
```
#### React
```jsx
import React, {useState, useEffect} from 'react';
import {useStripe} from '@stripe/react-stripe-js';
const PaymentStatus = () => {
const stripe = useStripe();
const [message, setMessage] = useState(null);
useEffect(() => {
if (!stripe) {
return;
}
// Retrieve the "payment_intent_client_secret" query parameter appended to
// your return_url by Stripe.js
const clientSecret = new URLSearchParams(window.location.search).get(
'payment_intent_client_secret'
);
// Retrieve the PaymentIntent
stripe
.retrievePaymentIntent(clientSecret)
.then(({paymentIntent}) => {
// Inspect the PaymentIntent `status` to indicate the status of the payment
// to your customer.
//
// Some payment methods will [immediately succeed or fail][0] upon
// confirmation, while others will first enter a `processing` state.
//
// [0]: https://stripe.com/docs/payments/payment-methods#payment-notification
switch (paymentIntent.status) {
case 'succeeded':
setMessage('Success! Payment received.');
break;
case 'processing':
setMessage("Payment processing. We'll update you when payment is received.");
break;
case 'requires_payment_method':
// Redirect your user back to your payment page to attempt collecting
// payment again
setMessage('Payment failed. Please try another payment method.');
break;
default:
setMessage('Something went wrong.');
break;
}
});
}, [stripe]);
return message;
};
export default PaymentStatus;
```
## Gérer les événements post-paiement [Côté serveur]
Stripe envoie un événement [payment_intent.succeeded](https://docs.stripe.com/api/events/types.md#event_types-payment_intent.succeeded) à l’issue du paiement. Utilisez l’[outil de webhook du Dashboard](https://dashboard.stripe.com/webhooks) ou suivez le [guide consacré aux webhooks](https://docs.stripe.com/webhooks/quickstart.md) pour recevoir ces événements et exécuter des actions, comme envoyer une confirmation de commande par e-mail à votre client, enregistrer la vente dans une base de données ou lancer un flux de livraison.
Plutôt que d’attendre un rappel de votre client, écoutez ces événements. Côté client, il arrive en effet que l’utilisateur ferme la fenêtre de son navigateur ou quitte l’application avant l’exécution du rappel. Certains clients malintentionnés peuvent d’autre part tenter de manipuler la réponse. En configurant votre intégration de manière à ce qu’elle écoute les événements asynchrones, vous pourrez accepter [plusieurs types de moyens de paiement](https://stripe.com/payments/payment-methods-guide) avec une seule et même intégration.
En plus de l’événement `payment_intent.succeeded`, nous vous recommandons de gérer ces autres événements lorsque vous encaissez des paiements à l’aide de l’Element Payment :
| Événement | Description | Action |
| ------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [payment_intent.succeeded](https://docs.stripe.com/api/events/types.md?lang=php#event_types-payment_intent.succeeded) | Envoyé lorsqu’un client effectue un paiement avec succès. | Envoyez au client une confirmation de commande et *traitez* (Fulfillment is the process of providing the goods or services purchased by a customer, typically after payment is collected) sa commande. |
| [payment_intent.processing](https://docs.stripe.com/api/events/types.md?lang=php#event_types-payment_intent.processing) | Envoyé lorsqu’un client initie un paiement, mais qu’il ne l’a pas encore finalisé. Dans la plupart des cas, cet événement est envoyé lorsque le client initie un prélèvement bancaire. Il est suivi par un événement `payment_intent.succeeded` ou `payment_intent.payment_failed`. | Envoyez au client une confirmation de commande qui indique que son paiement est en attente. Pour des marchandises dématérialisées, vous pourrez traiter la commande sans attendre que le paiement soit effectué. |
| [payment_intent.payment_failed](https://docs.stripe.com/api/events/types.md?lang=php#event_types-payment_intent.payment_failed) | Envoyé lorsqu’un client effectue une tentative de paiement qui se solde par un échec. | Si un paiement passe de l’état `processing` à `payment_failed`, proposez au client de retenter le paiement. |
# API Direct
> This is a API Direct for when platform is web and ui is direct-api. View the full page at https://docs.stripe.com/payments/existing-customers?platform=web&ui=direct-api.
Pour contrôler totalement l’affichage des moyens de paiement existants, utilisez l’implémentation de l’API Direct.
> #### Utiliser l’API Accounts v2 pour représenter des clients
>
> Si votre intégration utilise des [Accounts configurés par le client](https://docs.stripe.com/api/v2/core/accounts/create.md#v2_create_accounts-configuration-customer), remplacez les références `Customer` et événement dans les exemples de code par les références équivalentes de l’API Accounts v2. Pour plus d’informations, consultez la page [Représenter des clients avec des objets Account](https://docs.stripe.com/connect/use-accounts-as-customers.md).
## Afficher les moyens de paiement [Côté client] [Côté serveur]
Appelez l’enpoint [list Payment Method](https://docs.stripe.com/api/payment_methods/customer_list.md) avec le paramètre `allow_redisplay` pour récupérer les moyens de paiement réutilisables d’un client.
```curl
curl -G https://api.stripe.com/v1/customers/{{CUSTOMER_ID}}/payment_methods \
-u "<>:" \
-d allow_redisplay=always
```
Utilisez les données de la réponse de l’API pour afficher les moyens de paiement dans votre propre interface utilisateur et laissez le client en sélectionner un.
## Optional: Afficher les moyens de paiement enregistrés supplémentaires [Côté serveur]
> #### Conformité
>
> Lorsque vous enregistrez les informations de paiement d’un client, vous êtes responsable du respect de l’ensemble des lois, réglementations et règles du réseau en vigueur. Lorsque vous offrez à un client la possibilité d’utiliser d’anciens moyens de paiement en vue d’achats futurs, assurez-vous d’avoir obtenu le consentement de vos clients à l’enregistrement des informations de paiement aux fins d’un futur achat.
Par défaut, nous affichons uniquement les moyens de paiement configurés pour [permettre toujours le réaffichage](https://docs.stripe.com/api/payment_methods/object.md#payment_method_object-allow_redisplay).
Vous ne pouvez pas réutiliser Apple Pay et Google Pay au cours d’une même session de paiement. Par conséquent, ces moyens de paiement n’apparaissent pas dans la liste des options enregistrées. Vous devez afficher l’interface utilisateur de Google Pay et d’Apple Pay, ainsi que le bouton de demande de paiement, chaque fois que la session de paiement est active.
Vous pouvez afficher d’autres moyens de paiement précédemment enregistrés en incluant d’autres valeurs de réaffichage dans la session de paiement ou en mettant à jour le paramètre `allow_redisplay` d’un moyen de paiement sur `always`.
- Utilisez le [paramètre](https://docs.stripe.com/api/payment_methods/customer_list.md#list_customer_payment_methods-allow_redisplay) `allow_redisplay` pour spécifier les moyens de paiement enregistrés à présenter au client. Vous pouvez définir n’importe laquelle des valeurs valides : `limited`, `unspecified` et `always`.
```curl
curl -G https://api.stripe.com/v1/customers/{{CUSTOMER_ID}}/payment_methods \
-u "<>:" \
-d allow_redisplay=unspecified
```
- [Mettez à jour le moyen de paiement](https://docs.stripe.com/api/payment_methods/update.md) pour définir la valeur `allow_redisplay` des moyens de paiement individuels.
```curl
curl https://api.stripe.com/v1/payment_methods/{{PAYMENTMETHOD_ID}} \
-u "<>:" \
-d allow_redisplay=always
```
## Créer un PaymentIntent [Côté serveur]
Créez un [PaymentIntent](https://docs.stripe.com/api/payment_intents/create.md) pour essayer de facturer le client avec le moyen de paiement qu’il a sélectionné.
```curl
curl https://api.stripe.com/v1/payment_intents \
-u "<>:" \
-d amount=1099 \
-d currency=usd \
-d customer={{CUSTOMER_ID}} \
-d payment_method={{PAYMENT_METHOD_ID}} \
-d confirm=true \
--data-urlencode "return_url=https://example.com/order/123/complete"
```
Si l’appel à l’API échoue et renvoie une erreur 402, cela signifie que le paiement a été refusé. Demandez au client de réessayer ou d’utiliser un autre moyen de paiement.
## Vérifier l'état du PaymentIntent [Côté client] [Côté serveur]
Si la création du PaymentIntent a bien abouti, vérifiez son `status` :
- `succeeded` indique que le client a été débité comme prévu. Affichez un message de réussite du paiement pour votre client.
- `requires_action` indique que vous devez demander une action supplémentaire, telle que l’authentification avec 3D Secure. Appelez [`handleNextAction`](https://docs.stripe.com/js/payment_intents/handle_next_action) dans le front-end pour déclencher l’action que le client doit effectuer.
```javascript
const { error, paymentIntent } = await stripe.handleNextAction({
clientSecret: "{{CLIENT_SECRET}}"
});
if (error) {
// Show error from Stripe.js
} else {
// Actions handled, show success message
}
```
## Gérer les événements post-paiement [Côté serveur]
Stripe envoie un événement [payment_intent.succeeded](https://docs.stripe.com/api/events/types.md#event_types-payment_intent.succeeded) à l’issue du paiement. Utilisez l’[outil de webhook du Dashboard](https://dashboard.stripe.com/webhooks) ou suivez le [guide consacré aux webhooks](https://docs.stripe.com/webhooks/quickstart.md) pour recevoir ces événements et exécuter des actions, comme envoyer une confirmation de commande par e-mail à votre client, enregistrer la vente dans une base de données ou lancer un flux de livraison.
Plutôt que d’attendre un rappel de votre client, écoutez ces événements. Côté client, il arrive en effet que l’utilisateur ferme la fenêtre de son navigateur ou quitte l’application avant l’exécution du rappel. Certains clients malintentionnés peuvent d’autre part tenter de manipuler la réponse. En configurant votre intégration de manière à ce qu’elle écoute les événements asynchrones, vous pourrez accepter [plusieurs types de moyens de paiement](https://stripe.com/payments/payment-methods-guide) avec une seule et même intégration.
En plus de l’événement `payment_intent.succeeded`, nous vous recommandons de gérer ces autres événements lorsque vous encaissez des paiements à l’aide de l’Element Payment :
| Événement | Description | Action |
| ------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [payment_intent.succeeded](https://docs.stripe.com/api/events/types.md?lang=php#event_types-payment_intent.succeeded) | Envoyé lorsqu’un client effectue un paiement avec succès. | Envoyez au client une confirmation de commande et *traitez* (Fulfillment is the process of providing the goods or services purchased by a customer, typically after payment is collected) sa commande. |
| [payment_intent.processing](https://docs.stripe.com/api/events/types.md?lang=php#event_types-payment_intent.processing) | Envoyé lorsqu’un client initie un paiement, mais qu’il ne l’a pas encore finalisé. Dans la plupart des cas, cet événement est envoyé lorsque le client initie un prélèvement bancaire. Il est suivi par un événement `payment_intent.succeeded` ou `payment_intent.payment_failed`. | Envoyez au client une confirmation de commande qui indique que son paiement est en attente. Pour des marchandises dématérialisées, vous pourrez traiter la commande sans attendre que le paiement soit effectué. |
| [payment_intent.payment_failed](https://docs.stripe.com/api/events/types.md?lang=php#event_types-payment_intent.payment_failed) | Envoyé lorsqu’un client effectue une tentative de paiement qui se solde par un échec. | Si un paiement passe de l’état `processing` à `payment_failed`, proposez au client de retenter le paiement. |