# Save Bacs Direct Debit bank details Learn how to use Checkout to save payment method details for future Bacs Direct Debit payments. Use [Stripe Checkout](https://docs.stripe.com/payments/checkout.md) to collect Bacs Direct Debit payment details in advance, with the final amount or payment date determined later. This is useful for: - Saving payment methods to a wallet to streamline future purchases. - Collecting surcharges after fulfilling a service. - [Starting a free trial for a subscription](https://docs.stripe.com/billing/subscriptions/trials.md). ## Set up Stripe [Server-side] Pour commencer, vous devez créer un compte Stripe. [S’inscrire](https://dashboard.stripe.com/register). Utilisez nos bibliothèques officielles pour accéder à l’API Stripe depuis votre application : #### 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' ``` ## Create a Customer [Server-side] To reuse a Bacs Direct Debit payment method for future payments, you must attach it to a *Customer* (Customer objects represent customers of your business. They let you reuse payment methods and give you the ability to track multiple payments). Create a Customer object when someone creates an account with you and associate the ID of the Customer object with your own internal representation of a customer so you can use the stored payment method details later. If you have an existing Customer object, skip this step. ```curl curl -X POST https://api.stripe.com/v1/customers \ -u "<>:" ``` ## Create a Checkout Session [Client-side] [Server-side] [Stripe Checkout](https://docs.stripe.com/payments/checkout.md) provides a hosted payment page that is compliant with Bacs Direct Debit rules. If you would like to design your own Bacs Direct Debit form, please [contact](https://stripe.com/contact/sales) our sales team. Before you can accept Direct Debit payments, your customer must provide their bank account information and give permission to debit their account (also known as a [mandate](https://docs.stripe.com/payments/payment-methods/bacs-debit.md#mandates)) through Stripe Checkout. Add a checkout button to your website that calls a server-side endpoint to create a Checkout Session. ```html Checkout
``` Create a Checkout Session in `setup` mode to collect the required information. After creating the Checkout Session, redirect your customer to the [URL](https://docs.stripe.com/api/checkout/sessions/object.md#checkout_session_object-url) returned in the response. #### curl ```bash curl https://api.stripe.com/v1/checkout/sessions \ -u <>: \ -d "payment_method_types[]"="bacs_debit" \ -d mode=setup \ -d customer="{{CUSTOMER_ID}}" \ -d success_url="https://example.com/success?session_id={CHECKOUT_SESSION_ID}" \ ``` When your customer provides their payment method details, they’re redirected to the `success_url`, a page on your website that informs them that their payment method was saved successfully. Make the Session ID available on your success page by including the `{CHECKOUT_SESSION_ID}` template variable in the `success_url` as in the above example. > Don’t rely on the redirect to the `success_url` alone for detecting payment initiation, because: > > - Malicious users could directly access the `success_url` without paying and gain access to your goods or services. - After a successful payment, customers might close their browser tab before they’re redirected to the `success_url`. > The Bacs Direct Debit rules require that customers are sent an email notification when payment details are collected. By default, these emails are sent automatically by Stripe. You can also opt to [send your own Bacs notifications](https://docs.stripe.com/payments/payment-methods/bacs-debit.md#debit-notifications). ## Retrieve the payment method [Server-side] After a customer submits their payment details, retrieve the [PaymentMethod](https://docs.stripe.com/payments/payment-methods.md) object. A *PaymentMethod* (PaymentMethods represent your customer's payment instruments, used with the Payment Intents or Setup Intents APIs) stores the customer’s bank account information for future payments. You can retrieve the PaymentMethod synchronously using the `success_url` or asynchronously using *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 Handle `checkout.session.completed` webhooks, which contain a Session object. To learn more, see [setting up webhooks](https://docs.stripe.com/webhooks.md). The following example is a `checkout.session.completed` response. ```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" } ``` Note the value of the `setup_intent` key, which is the ID for the SetupIntent created with the Checkout Session. A [SetupIntent](https://docs.stripe.com/payments/setup-intents.md) is an object used to set up the customer bank account information for future payments. [Retrieve](https://docs.stripe.com/api/setup_intents/retrieve.md) the SetupIntent object with the ID. The returned object contains the `payment_method` ID. ```curl curl https://api.stripe.com/v1/setup_intents/seti_1EzVO3HssDVaQm2PJjXHmLlM \ -u "<>:" ``` #### Success URL Obtain the `session_id` from the URL when a user redirects back to your site and [retrieve](https://docs.stripe.com/api/checkout/sessions/retrieve.md) the Session object. ```curl curl -G https://api.stripe.com/v1/checkout/sessions/{{SESSION_ID}} \ -u "<>:" \ -d "expand[]=setup_intent" ``` > To ensure the `session_id` is available from the URL, include the `session_id={CHECKOUT_SESSION_ID}` template variable in the `success_url` when creating the Checkout Session. Note the SetupIntent created during the Checkout Session. A [SetupIntent](https://docs.stripe.com/payments/setup-intents.md) is an object used to set up the customer bank account information for future payments. The returned object contains the `payment_method` ID. ## Handle post-setup events [Server-side] Once the Checkout Session completes, payment details are submitted to the bank as a mandate. The mandate can change at any time after you’ve collected it. This might be the result of the customer instructing their bank to amend the mandate or because of a change in the bank itself (for example, the customer changes to a different one). Stripe sends the following events when the mandate changes: | Event name | Description | Can accept payments? | | -------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------- | | `mandate.updated` | Occurs whenever a mandate is rejected, canceled, or reactivated by the Bacs network. Check [mandate.status](https://docs.stripe.com/api/mandates/object.md#mandate_object-status) to determine if the mandate can continue to be used. | Yes, if the new status is `active` | | `payment_method.automatically_updated` | Occurs when a customer’s bank account details change. | Yes | 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. ## Test the integration Vous disposez de plusieurs [numéros de compte bancaire de test](https://docs.stripe.com/keys.md#test-live-modes) dans un *bac à sable* (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 vous assurer que votre intégration est opérationnelle. | Code guichet | Numéro de compte | Description | | ------------ | ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 108800 | 00012345 | Le paiement a été effectué et le PaymentIntent passe de `processing` à `succeeded`. | | 108800 | 90012345 | Le paiement a été effectué au bout de trois minutes et le PaymentIntent passe de `processing` à `succeeded`. | | 108800 | 33333335 | Le paiement est accepté, mais échoue immédiatement avec un code d’échec `debit_not_authorized` et le PaymentIntent passe de `processing` à `requires_payment_method`. Le mandat passe à `inactive` et le PaymentMethod ne peut plus être utilisé. | | 108800 | 93333335 | Le paiement échoue au bout de trois minutes avec un code d’échec `debit_not_authorized` et le PaymentIntent passe de `processing` à `requires_payment_method`. Le mandat passe à `inactive` et le PaymentMethod ne peut plus être utilisé. | | 108800 | 22222227 | Le paiement échoue avec un code d’échec `insufficient_funds` et la facture passe de `processing` à `requires_payment_method`. Le mandat demeure `active` et le PaymentMethod peut être utilisé à nouveau. | | 108800 | 92222227 | Le paiement échoue au bout de trois minutes avec un code d’échec `insufficient_funds` et le PaymentIntent passe de `processing` à `requires_payment_method`. Le mandat demeure `active` et le PaymentMethod peut être utilisé à nouveau. | | 108800 | 55555559 | Le paiement réussit au bout de trois minutes et PaymentIntent passe de `processing` à `succeeded`, mais un litige est immédiatement créé. | | 108800 | 00033333 | La création du moyen de paiement a été effectuée, mais le mandat est refusé par l’institution financière du client et devient immédiatement inactif. | | 108800 | 00044444 | La demande de mise en place d’un prélèvement automatique Bacs échoue immédiatement en raison d’un numéro de compte non valide et le client est invité à mettre à niveau ses informations avant de soumettre sa demande. Les informations sur le paiement ne sont pas collectées. | | 108800 | 34343434 | Le paiement échoue avec un code d’erreur `charge_exceeds_source_limit`, car le montant du paiement a entraîné un dépassement de la limite hebdomadaire de volume de paiement du compte. | | 108800 | 12121212 | Le paiement échoue avec un code d’erreur `charge_exceeds_weekly_limit`, car le montant du paiement dépasse la limite du volume de transactions du compte. | Pour vos tests, vous pouvez utiliser l’un quelconque des numéros de compte fournis ci-dessus. Cependant, dans la mesure où le traitement des paiements par prélèvement 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 [courriels](https://docs.stripe.com/payments/payment-methods/bacs-debit.md#debit-notifications) au client lors de la collecte initiale de ses données de paiement et chaque fois qu’un débit est ensuite effectué sur son compte. Ces notifications ne sont pas envoyées dans les bacs à sable. ## Use the payment method for future payments [Server-side] After you set up a *PaymentMethod* (PaymentMethods represent your customer's payment instruments, used with the Payment Intents or Setup Intents APIs), you can accept future Bacs Direct Debit payments by creating and confirming a [PaymentIntent](https://docs.stripe.com/payments/payment-intents.md). #### curl ```bash curl https://api.stripe.com/v1/payment_intents \ -u <>: \ -d "payment_method_types[]"="bacs_debit" \ -d payment_method="{{PAYMENT_METHOD_ID}}" \ -d customer="{{CUSTOMER_ID}}" \ -d confirm=true \ -d amount=100 \ -d currency=gbp ```