# Enregistrer les coordonnées bancaires de prélèvement automatique Bacs

Découvrez comment utiliser Checkout pour enregistrer les informations du moyen de paiement de vos clients pour leurs paiements futurs par prélèvement automatique Bacs.

Utilisez [Stripe Checkout](https://docs.stripe.com/payments/checkout.md) pour collecter les informations du moyen de paiement par prélèvement automatique Bacs en amont, en vue d’un paiement dont la date et le montant seront déterminés ultérieurement. Ceci est utile aux fins suivantes&nbsp;:

- Enregistrement des moyens de paiement dans un portefeuille pour faciliter les achats ultérieurs.
- Encaissement de suppléments de facturation après la fourniture d’un service.
- [Démarrer un essai gratuit pour un abonnement](https://docs.stripe.com/billing/subscriptions/trials/free-trials.md).

## Configurer Stripe [Côté serveur]

Pour commencer, il vous faut un compte Stripe. [Inscrivez-vous](https://dashboard.stripe.com/register).

Utilisez nos bibliothèques officielles pour accéder à l’API Stripe depuis votre application&nbsp;:

#### Ruby

```bash
# Available as a gem
sudo gem install stripe
```

```ruby
# If you use bundler, you can add this line to your Gemfile
gem 'stripe'
```

## Créer ou récupérer un objet Customer [Côté serveur]

Pour réutiliser un moyen de paiement par prélèvement automatique Bacs pour de futurs paiements, associez-le à un objet représentant votre client.

> #### Utiliser l’API Accounts v2 pour représenter les clients
> 
> L’API Accounts&nbsp;v2 est généralement disponible pour les utilisateurs de Connect et en aperçu public pour les autres utilisateurs de Stripe. Si vous avez accès à l’aperçu Accounts&nbsp;v2, vous devez spécifier une [version d’aperçu](https://docs.stripe.com/api-v2-overview.md#sdk-and-api-versioning) dans votre code.
> 
> Pour accéder à l’aperçu Accounts&nbsp;v2, rendez-vous sur [aperçus et fonctionnalités de Account](https://dashboard.stripe.com/settings/previews) dans votre Dashboard et activez **Moyens de paiement réutilisables pour les virements internationaux**.
> 
> Dans la plupart des cas d’usage, nous vous recommandons de [modéliser vos clients en tant qu’objets Account configurés par le client](https://docs.stripe.com/accounts-v2/use-accounts-as-customers.md), plutôt que d’utiliser des objets [Customer](https://docs.stripe.com/api/customers.md).

Créez un [Account](https://docs.stripe.com/api/v2/core/accounts/create.md#v2_create_accounts-configuration-customer) ou un [Customer](https://docs.stripe.com/api/customers/create.md) configuré par le client lorsque votre client crée un compte auprès de votre entreprise, ou lors de l’enregistrement d’un moyen de paiement. Associez l’ID de l’objet à votre propre représentation interne d’un client.

Créez un nouveau client ou récupérez un client existant pour l’associer à ce paiement.

#### Accounts&nbsp;v2

Définissez `configuration.customer` sur un objet vide pour activer la configuration client sur ce compte.

```curl
curl -X POST https://api.stripe.com/v2/core/accounts \
  -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-10-28.preview" \
  --json '{
    "contact_email": "jenny.rosen@example.com",
    "display_name": "Jenny Rosen",
    "configuration": {
        "customer": {}
    },
    "include": [
        "configuration.customer"
    ]
  }'
```

#### Customers&nbsp;v1

```curl
curl https://api.stripe.com/v1/customers \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d "name=Jenny Rosen" \
  --data-urlencode "email=jenny.rosen@example.com"
```

## Créer une session Checkout [Côté client] [Côté serveur]

[Stripe Checkout](https://docs.stripe.com/payments/checkout.md) propose une page de paiement hébergée qui satisfait aux exigences applicables aux prélèvements automatiques Bacs.

Si vous souhaitez créer votre propre formulaire de prélèvement automatique Bacs, veuillez [contacter](https://stripe.com/contact/sales) notre équipe commerciale.

Avant de pouvoir accepter les paiements par prélèvement automatique, votre client doit fournir ses coordonnées bancaires et autoriser le débit de son compte (également appelé [mandat](https://docs.stripe.com/payments/bacs-debit.md#mandates)) via Stripe Checkout.

Ajoutez sur votre site Web un bouton de paiement qui appelle un endpoint côté serveur afin de créer une session Checkout.

```html
<html>
  <head>
    <title>Checkout</title>
  </head>
  <body>
    <form action="/create-checkout-session" method="POST">
      <button type="submit">Checkout</button>
    </form>
  </body>
</html>
```

Créez une Checkout Session en mode `setup` pour collecter les informations requises. Après avoir créé la Checkout Session, 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. [Activez le moyen de paiement](https://dashboard.stripe.com/settings/payment_methods) dans votre Dashboard. Stripe affiche automatiquement les moyens de paiement admissibles.

#### Accounts&nbsp;v2

```curl
curl https://api.stripe.com/v1/checkout/sessions \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d "customer_account={{CUSTOMERACCOUNT_ID}}" \
  -d mode=setup \
  --data-urlencode "success_url=https://example.com/success?session_id={CHECKOUT_SESSION_ID}"
```

#### Customers&nbsp;v1

```curl
curl https://api.stripe.com/v1/checkout/sessions \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d "customer={{CUSTOMER_ID}}" \
  -d mode=setup \
  --data-urlencode "success_url=https://example.com/success?session_id={CHECKOUT_SESSION_ID}"
```

Quand votre client fournit les informations de son moyen de paiement, il est redirigé vers l’URL `success_url`, une page de votre site Web qui l’informe que son moyen de paiement a bien été enregistré. Mettez l’ID de session à disposition sur votre page de confirmation de paiement en incluant la variable de modèle `{CHECKOUT_SESSION_ID}` dans l’URL `success_url`, comme illustré ci-dessus.

> Ne vous fiez pas uniquement à la redirection vers `success_url` pour détecter l’initiation d’un paiement, car&nbsp;:
> 
> - Des utilisateurs malveillants pourraient accéder directement au `success_url` sans payer et obtenir l’accès à vos biens ou à vos services.
> - Après un paiement réussi, les clients peuvent fermer l’onglet de leur navigateur avant d’être redirigés vers `success_url`.

Vous devez aussi tenir compte des exigences de notification propres au prélèvement automatique Bacs.

> Les règles du prélèvement automatique Bacs exigent que les clients reçoivent une notification par e-mail lors de la collecte des informations de paiement. Par défaut, ces e-mails sont envoyés automatiquement par Stripe. Vous pouvez également choisir d’[envoyer vos propres notifications Bacs](https://docs.stripe.com/payments/bacs-debit.md#debit-notifications).

## Récupérer le moyen de paiement [Côté serveur]

Une fois que le client a soumis ses informations de paiement, récupérez l’objet [PaymentMethod](https://docs.stripe.com/payments/payment-methods.md). Un *PaymentMethod* (PaymentMethods represent your customer's payment instruments, used with the Payment Intents or Setup Intents APIs) stocke les informations bank account du client pour ses paiements ultérieurs. Vous pouvez récupérer cet objet de manière synchrone en utilisant la `success_url` ou de manière asynchrone au moyen de *webhooks* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests).

La décision de récupérer l’objet PaymentMethod de manière synchrone ou asynchrone dépend de votre tolérance aux abandons de paiement. En effet, il peut arriver que le client n’aboutisse pas au `success_url` à l’issue de son paiement (il peut par exemple lui arriver de fermer l’onglet de son navigateur avant que la redirection n’intervienne). L’utilisation de webhooks vous permet d’éviter que votre intégration ne subisse ce type d’abandon.

#### Webhooks

Gérez des webhooks `checkout.session.completed`, qui contiennent un objet Session. Pour en savoir plus, consultez la page sur la [configuration de webhooks](https://docs.stripe.com/webhooks.md). Voici un exemple de réponse `checkout.session.completed`&nbsp;:

```json
{
  "id": "evt_1Ep24XHssDVaQm2PpwS19Yt0",
  "object": "event",
  "api_version": "2019-03-14",
  "created": 1561420781,
  "data": {
    "object": {
      "id": "cs_test_MlZAaTXUMHjWZ7DcXjusJnDU4MxPalbtL5eYrmS2GKxqscDtpJq8QM0k",
      "object": "checkout.session",
      "billing_address_collection": null,
      "client_reference_id": null,
      "customer": null,
      "customer_email": null,
      "display_items": [],
      "mode": "setup",
      "setup_intent": "seti_1EzVO3HssDVaQm2PJjXHmLlM",
      "submit_type": null,
      "subscription": null,
      "success_url": "https://example.com/success"
    }
  },
  "livemode": false,
  "pending_webhooks": 1,
  "request": {
    "id": null,
    "idempotency_key": null
  },
  "type": "checkout.session.completed"
}
```

Notez la valeur de la clé `setup_intent`, qui est l’identifiant du SetupIntent créé avec la Checkout Session. Un [SetupIntent](https://docs.stripe.com/payments/setup-intents.md) est un objet utilisé pour configurer les informations du client bank account pour les futurs paiements. [Récupérez](https://docs.stripe.com/api/setup_intents/retrieve.md) l’objet SetupIntent avec l’ID. L’objet renvoyé contient l’identifiant `payment_method`.

```curl
curl https://api.stripe.com/v1/setup_intents/{{SETUPINTENT_ID}} \
  -u "<<YOUR_SECRET_KEY>>:"
```

#### URL après paiement réussi

Récupération du `session_id` depuis l’URL lorsque l’utilisateur est redirigé vers votre site et [récupération](https://docs.stripe.com/api/checkout/sessions/retrieve.md) de l’objet Session.

```curl
curl -G https://api.stripe.com/v1/checkout/sessions/{{SESSION_ID}} \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d "expand[]=setup_intent"
```

> Pour que le `session_id` soit disponible dans l’URL, incluez la variable de modèle `session_id={CHECKOUT_SESSION_ID}` dans la `success_url` lors de la création de la session Checkout.

Notez le SetupIntent créé pendant la Checkout Session. Un [SetupIntent](https://docs.stripe.com/payments/setup-intents.md) est un objet utilisé pour configurer les informations du client bank account pour les futurs paiements. L’objet renvoyé contient l’identifiant `payment_method`.

## Gérer les événements post-configuration [Côté serveur]

Une fois la session Checkout terminée, les informations de paiement sont transmises à la banque sous forme de mandat.

Un mandat peut changer à tout moment après avoir été collecté. Par exemple, le client peut demander à sa banque de le modifier ou peut changer de banque. Lorsqu’un mandat est modifié, Stripe envoie les événements suivants&nbsp;:

| Nom de l’événement | Description | Peut accepter les paiements&nbsp;? |
| --- | --- | --- |
| `mandate.updated` | Déclenché lorsque le mandat est rejeté, annulé ou réactivé par le réseau Bacs. Consultez le [mandate.status](https://docs.stripe.com/api/mandates/object.md#mandate_object-status) pour déterminer si le mandat peut continuer à être utilisé. | Oui, si le nouvel état est `active` |
| `payment_method.automatically_updated` | Déclenché lorsque les coordonnées bancaires du client changent. | Oui |

These events are available in the [Dashboard](https://dashboard.stripe.com/events), but you can set up a *webhook* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests) to handle these programmatically.

## Tester l'intégration

Il existe plusieurs [numéros de compte bancaire de test](https://docs.stripe.com/keys.md#test-live-modes) que vous pouvez utiliser dans un *environnement de test* (A sandbox is an isolated test environment that allows you to test Stripe functionality in your account without affecting your live integration. Use sandboxes to safely experiment with new features and changes) pour vérifier que cette intégration est prête. Vous pouvez également utiliser le token correspondant pour éviter la saisie manuelle des informations du compte.

| Code guichet | Numéro de compte | Token | Description |
| --- | --- | --- | --- |
| `108800` | `00012345` | `pm_bacsDebit_success` | Le paiement aboutit et l’état du PaymentIntent passe de `processing` à `succeeded`. |
| `108800` | `90012345` | `pm_bacsDebit_successDelayed` | Le paiement aboutit au bout de trois&nbsp;minutes et l’état du PaymentIntent passe de `processing` à `succeeded`. |
| `108800` | `33333335` | `pm_bacsDebit_debitNotAuthorized` | Le paiement est accepté, puis échoue immédiatement avec le code d’échec `debit_not_authorized`, et le PaymentIntent passe de l’état `processing` à l’état `requires_payment_method`. Le mandat devient `inactive` et le PaymentMethod ne peut plus être réutilisé. |
| `108800` | `93333335` | `pm_bacsDebit_debitNotAuthorizedDelayed` | Le paiement échoue après trois minutes avec le code d’échec `debit_not_authorized`, et le PaymentIntent passe de l’état `processing` à l’état `requires_payment_method`. Le mandat devient `inactive` et le PaymentMethod ne peut plus être utilisé. |
| `108800` | `22222227` | `pm_bacsDebit_insufficientFunds` | Le paiement échoue avec un code d’échec `insufficient_funds` et le PaymentIntent bascule de `processing` à `requires_payment_method`. Le mandate reste `active` et le PaymentMethod peut à nouveau être utilisé. |
| `108800` | `92222227` | `pm_bacsDebit_insufficientFundsDelayed` | Le paiement échoue au bout de trois&nbsp;minutes avec un code d’échec `insufficient_funds` et le PaymentIntent bascule de `processing` à `requires_payment_method`. Le mandate reste `active` et le PaymentMethod peut à nouveau être utilisé. |
| `108800` | `55555559` | `pm_bacsDebit_dispute` | Le paiement aboutit au bout de trois&nbsp;minutes et l’état du PaymentIntent passe de `processing` à `succeeded`, mais un litige est immédiatement créé. |
| `108800` | `00033333` | `pm_bacsDebit_mandateRefused` | La création du moyen de paiement aboutit, mais le mandat est refusé par la banque du client et passe immédiatement à l’état `inactive`. |
| `108800` | `00044444` | — | La demande de configuration du prélèvement automatique Bacs échoue immédiatement en raison d’un numéro de compte invalide, et le client est invité à mettre à jour ses informations avant de soumettre à nouveau. Aucune donnée de paiement n’est collectée, donc aucun token synthétique ne correspond à ce scénario. |
| `108800` | `34343434` | `pm_bacsDebit_exceedsWeeklyLimit` | Le paiement échoue avec un code d’erreur `charge_exceeds_source_limit`, car le montant du paiement entraîne un dépassement de la limite hebdomadaire de volume de paiement du compte. |
| `108800` | `12121212` | `pm_bacsDebit_exceedsTransactionLimit` | Le paiement échoue avec le code d’échec `charge_exceeds_transaction_limit` en raison d’un montant supérieur à la limite de volume de transactions du compte. |

Pour vos tests, vous pouvez utiliser l’un des numéros de compte fournis ci-dessus. Cependant, dans la mesure où le traitement des paiements par prélèvement automatique Bacs prend plusieurs jours, privilégiez les numéros de compte de test qui fonctionnent avec un délai de trois minutes, de manière à mieux simuler le comportement en situation réelle.

> Par défaut, Stripe envoie automatiquement des [e-mails](https://docs.stripe.com/payments/bacs-debit.md#debit-notifications) au client lors de la collecte initiale des informations de paiement et chaque fois qu’un débit sera effectué sur son compte. Ces notifications ne sont pas envoyées dans les environnements de test.

## Utiliser le moyen de paiement pour les paiements ultérieurs [Côté serveur]

Une fois le *PaymentMethod* (PaymentMethods represent your customer's payment instruments, used with the Payment Intents or Setup Intents APIs) configuré, vous pouvez accepter les paiements ultérieurs par prélèvement automatique Bacs en créant et confirmant un [PaymentIntent](https://docs.stripe.com/payments/payment-intents.md).

#### Accounts&nbsp;v2

```curl
curl https://api.stripe.com/v1/payment_intents \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d "automatic_payment_methods[enabled]=true" \
  -d "payment_method={{PAYMENTMETHOD_ID}}" \
  -d "customer_account={{CUSTOMERACCOUNT_ID}}" \
  --data-urlencode "return_url=https://example.com/return" \
  -d confirm=true \
  -d amount=100 \
  -d currency=gbp
```

#### Customers&nbsp;v1

```curl
curl https://api.stripe.com/v1/payment_intents \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d "automatic_payment_methods[enabled]=true" \
  -d "payment_method={{PAYMENTMETHOD_ID}}" \
  -d "customer={{CUSTOMER_ID}}" \
  --data-urlencode "return_url=https://example.com/return" \
  -d confirm=true \
  -d amount=100 \
  -d currency=gbp
```
