Accéder directement au contenu
Créez un compte ou connectez-vous
Le logo de la documentation Stripe
/
Demander à l’IA
Créer un compteConnectez-vous
Commencer
Paiements
Revenus
Plateformes et places de marché
Gestion des fonds
Ressources de développement
API et trousse SDKAide
AperçuAccepter un paiementMettre votre intégration à niveau
Paiements en ligne
AperçuTrouver votre cas d'usage
Utiliser Payment Links
Utiliser une page de paiement préconfiguré
Créer une intégration personnalisée avec Elements
Développer une intégration dans l'application
Utiliser Managed Payments
Paiements récurrents
Paiements en personne
Terminal
Moyens de paiement
Ajout de moyens de paiement
    Aperçu
    Options d’intégration de mode de paiement
    Gérer les moyens de paiement par défaut dans le Dashboard
    Types de moyens de paiement
    Cartes
    Payer avec le solde Stripe
    Paiements en cryptomonnaie stable
    Prélèvements bancaires
      Prélèvement automatique ACH
        Accepter un paiement
        Enregistrer les coordonnées bancaires
        Migrating to new ACH Direct Debit APIs
        Migrer à partir d'un autre prestataire de services de paiement
        Comptes bancaires bloqués
        Codes SEC
        Règles de la Nacha pour les achats en ligne effectués par les consommateurs
      Prélèvement automatique Bacs
      Prélèvement préautorisé au Canada
      Prélèvement automatique BECS en Australie
      Prélèvement automatique BECS en Nouvelle-Zélande
      Prélèvement SEPA
    Redirection vers l'institution financière
    Virements bancaires
    Virements (Sources)
    Achetez maintenant, payez plus tard
    Paiements en temps réel
    Coupons
    Portefeuilles numériques
    Activer des moyens de paiement locaux par pays
    Moyens de paiement personnalisés
Gérer les moyens de paiement
Payer plus rapidement avec Link
Opérations de paiement
Analyses
Soldes et délai de règlement
Conformité et sécurité
Devises
Refus de paiement
Litiges
Prévention de la fraude
Radar pour la protection contre la fraude
Virements
ReçusRemboursements et annulations
Intégrations avancées
Flux de paiement personnalisés
Acquisition flexible
Paiements hors session
Orchestration multiprestataires
Au-delà des paiements
Constituer son entreprise
Cryptomonnaie
Commerce agentique
Paiements automatiques
Financial Connections
Climate
Vérifier l'identité
États-Unis
Français (Canada)
AccueilPaiementsAdd payment methodsBank debitsACH Direct Debit

Accept an ACH Direct Debit payment

Build a custom payment form or use Stripe Checkout to accept payments with ACH Direct Debit.

Accepting ACH Direct Debit payments on your website consists of:

  • Creating an object to track a payment
  • Collecting payment method information with instant verifications enabled by Stripe Financial Connections
  • Submitting the payment to Stripe for processing
  • Verifying your customer’s bank account

Remarque

ACH Direct Debit is a delayed notification payment method, which means that funds aren’t immediately available after payment. A payment typically takes 4 business days to arrive in your account.

Stripe uses the payment object, the Payment Intent, to track and handle all the states of the payment until the payment completes.

Set up Stripe
Server-side

First, you need a Stripe account. Register now.

Use our official libraries for access to the Stripe API from your application:

Command Line
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
# Available as a gem sudo gem install stripe
Gemfile
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
# If you use bundler, you can add this line to your Gemfile gem 'stripe'

Create or retrieve a customer
RecommendedServer-side

Comparer les références Customers v1 et Accounts v2

Si votre plateforme Connect utilise des comptes configurés par le client, utilisez notre guide pour remplacer le Client et des références d’événements dans votre code avec les références équivalentes de l’API Accounts v2.

Create a Customer object when your user creates an account with your business, or retrieve an existing Customer associated with this user. Associating the ID of the Customer object with your own internal representation of a customer enables you to retrieve and use the stored payment method details later. Include an email address on the Customer to enable Financial Connections’ return user optimization.

Command Line
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
curl https://api.stripe.com/v1/customers \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -d email={{CUSTOMER_EMAIL}}

Create a PaymentIntent
Server-side

A PaymentIntent is an object that represents your intent to collect payment from a customer and tracks the lifecycle of the payment process through each stage.

Create a PaymentIntent on your server and specify the amount to collect and the usd currency. If you already have an integration using the Payment Intents API, add us_bank_account to the list of payment method types for your PaymentIntent. Specify the id of the Customer.

If you want to reuse the payment method in the future, provide the setup_future_usage parameter with the value of off_session.

For more information on Financial Connections fees, see pricing details.

By default, collecting bank account payment information uses Financial Connections to instantly verify your customer’s account, with a fallback option of manual account number entry and microdeposit verification. See the Financial Connections docs to learn how to configure Financial Connections and access additional account data to optimize your ACH integration. For example, you can use Financial Connections to check an account’s balance before initiating the ACH payment.

Remarque

To expand access to additional data after a customer authenticates their account, they must re-link their account with expanded permissions.

Command Line
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
curl https://api.stripe.com/v1/payment_intents \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -d amount=1099 \ -d currency=usd \ -d setup_future_usage=off_session \ -d customer={{CUSTOMER_ID}} \ -d "payment_method_types[]"=us_bank_account

Récupérer la clé secrète du client

L’objet PaymentIntent comprend une clé secrète du client utilisée côté client pour effectuer le processus de paiement en toute sécurité. Vous pouvez utiliser différentes approches pour transmettre cette clé au côté client.

Récupérez la clé secrète du client à partir d’un point de terminaison sur votre serveur, en utilisant la fonction fetch du navigateur. Cette approche est préférable si votre côté client est une application d’une page, en particulier si celle-ci a été créée avec un cadre d’application frontal récent comme React. Créez le point de terminaison du serveur pour récupérer la clé secrète du client :

main.rb
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
get '/secret' do intent = # ... Create or retrieve the PaymentIntent {client_secret: intent.client_secret}.to_json end

Ensuite, récupérez la clé secrète du client avec JavaScript côté client:

(async () => { const response = await fetch('/secret'); const {client_secret: clientSecret} = await response.json(); // Render the form using the clientSecret })();

Collect payment method details
Client-side

When a customer clicks to pay with ACH Direct Debit, we recommend you use Stripe.js to submit the payment to Stripe. Stripe.js is our foundational JavaScript library for building payment flows. It will automatically handle integration complexities, and enables you to easily extend your integration to other payment methods in the future.

Include the Stripe.js script on your checkout page by adding it to the head of your HTML file.

checkout.html
<head> <title>Checkout</title> <script src="https://js.stripe.com/clover/stripe.js"></script> </head>

Create an instance of Stripe.js with the following JavaScript on your checkout page.

client.js
// 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(
'pk_test_TYooMQauvdEDq54NiTphI7jx'
);

Rather than sending the entire PaymentIntent object to the client, use its client secret from the previous step. This is different from your API keys that authenticate Stripe API requests.

Handle the client secret carefully because it can complete the charge. Don’t log it, embed it in URLs, or expose it to anyone but the customer.

Use stripe.collectBankAccountForPayment to collect bank account details with Financial Connections, create a PaymentMethod, and attach that PaymentMethod to the PaymentIntent. Including the account holder’s name in the billing_details parameter is required to create an ACH Direct Debit PaymentMethod.

script.js
// Use the form that already exists on the web page. const paymentMethodForm = document.getElementById('payment-method-form'); const confirmationForm = document.getElementById('confirmation-form'); paymentMethodForm.addEventListener('submit', (ev) => { ev.preventDefault(); const accountHolderNameField = document.getElementById('account-holder-name-field'); const emailField = document.getElementById('email-field'); // Calling this method will open the instant verification dialog. stripe.collectBankAccountForPayment({ clientSecret: clientSecret, params: { payment_method_type: 'us_bank_account', payment_method_data: { billing_details: { name: accountHolderNameField.value, email: emailField.value, }, }, }, expand: ['payment_method'], }) .then(({paymentIntent, error}) => { if (error) { console.error(error.message); // PaymentMethod collection failed for some reason. } else if (paymentIntent.status === 'requires_payment_method') { // Customer canceled the hosted verification modal. Present them with other // payment method type options. } else if (paymentIntent.status === 'requires_confirmation') { // We collected an account - possibly instantly verified, but possibly // manually-entered. Display payment method details and mandate text // to the customer and confirm the intent once they accept // the mandate. confirmationForm.show(); } }); });

The Financial Connections authentication flow automatically handles bank account details collection and verification. When your customer completes the authentication flow, the PaymentMethod automatically attaches to the PaymentIntent, and creates a Financial Connections Account.

Erreur fréquente

Bank accounts that your customers link through manual entry and microdeposits won’t have access to additional bank account data like balances, ownership, and transactions.

To provide the best user experience on all devices, set the viewport minimum-scale for your page to 1 using the viewport meta tag.

<meta name="viewport" content="width=device-width, minimum-scale=1" />

FacultatifAccess data on a Financial Connections bank account
Server-side

You can only access Financial Connections data if you request additional data permissions when you create your PaymentIntent .

After your customer successfully completes the Stripe Financial Connections authentication flow, the us_bank_account PaymentMethod returned includes a financial_connections_account ID that points to a Financial Connections Account. Use this ID to access account data.

Erreur fréquente

Bank accounts that your customers link through manual entry and microdeposits don’t have a financial_connections_account ID on the Payment Method.

To determine the Financial Connections account ID, retrieve the PaymentIntent and expand the payment_method attribute:

Command Line
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
curl -G https://api.stripe.com/v1/payment_intents/
{{PAYMENT_INTENT_ID}}
\ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -d "expand[]"=payment_method
{ "id": "{{PAYMENT_INTENT_ID}}", "object": "payment_intent", // ... "payment_method": { "id": "{{PAYMENT_METHOD_ID}}", // ... "type": "us_bank_account" "us_bank_account": { "account_holder_type": "individual", "account_type": "checking", "bank_name": "TEST BANK", "financial_connections_account": "{{FINANCIAL_CONNECTIONS_ACCOUNT_ID}}", "fingerprint": "q9qchffggRjlX2tb", "last4": "6789", "routing_number": "110000000" } } // ... }

If you opted to receive balances permissions, we recommend checking a balance at this stage to verify sufficient funds before confirming a payment.

Learn more about using additional account data to optimize your ACH integration with Financial Connections.

Collect mandate acknowledgement and submit the payment
Client-side

Before you can initiate the payment, you must obtain authorization from your customer by displaying mandate terms for them to accept.

To be compliant with Nacha rules, you must obtain authorization from your customer before you can initiate payment by displaying mandate terms for them to accept. For more information on mandates, see Mandates.

When the customer accepts the mandate terms, you must confirm the PaymentIntent. Use stripe.confirmUsBankAccountPayment to complete the payment when the customer submits the form.

script.js
confirmationForm.addEventListener('submit', (ev) => { ev.preventDefault(); stripe.confirmUsBankAccountPayment(clientSecret) .then(({paymentIntent, error}) => { if (error) { console.error(error.message); // The payment failed for some reason. } else if (paymentIntent.status === "requires_payment_method") { // Confirmation failed. Attempt again with a different payment method. } else if (paymentIntent.status === "processing") { // Confirmation succeeded! The account will be debited. // Display a message to customer. } else if (paymentIntent.next_action?.type === "verify_with_microdeposits") { // The account needs to be verified through microdeposits. // Display a message to consumer with next steps (consumer waits for // microdeposits, then enters a statement descriptor code on a page sent to them through email). } }); });

Remarque

stripe.confirmUsBankAccountPayment may take several seconds to complete. During that time, disable resubmittals of your form and show a waiting indicator (for example, a spinner). If you receive an error, show it to the customer, re-enable the form, and hide the waiting indicator.

If successful, Stripe returns a PaymentIntent object, with one of the following possible statuses:

ÉtatDescriptionÉtapes suivantes
requires_actionFurther action is needed to complete bank account verification.Step 6: Verifying bank accounts with microdeposits
processingThe bank account was instantly verified or verification isn’t necessary.Step 7: Confirm the PaymentIntent succeeded

After successfully confirming the PaymentIntent, an email confirmation of the mandate and collected bank account details must be sent to your customer. Stripe handles these by default, but you can choose to send custom notifications if you prefer.

Verify bank account with microdeposits
Client-side

Not all customers can verify the bank account instantly. This step only applies if your customer has elected to opt out of the instant verification flow in the previous step.

In these cases, Stripe sends a descriptor_code microdeposit and might fall back to an amount microdeposit if any further issues arise with verifying the bank account. These deposits take 1-2 business days to appear on the customer’s online statement.

  • Descriptor code. Stripe sends a single, 0.01 USD microdeposit to the customer’s bank account with a unique, 6-digit descriptor_code that starts with SM. Your customer uses this string to verify their bank account.
  • Amount. Stripe sends two, non-unique microdeposits to the customer’s bank account, with a statement descriptor that reads ACCTVERIFY. Your customer uses the deposit amounts to verify their bank account.

The result of the stripe.confirmUsBankAccountPayment method call in the previous step is a PaymentIntent in the requires_action state. The PaymentIntent contains a next_action field that contains some useful information for completing the verification.

next_action: { type: "verify_with_microdeposits", verify_with_microdeposits: { arrival_date: 1647586800, hosted_verification_url: "https://payments.stripe.com/…", microdeposit_type: "descriptor_code" } }

If you supplied a billing email, Stripe notifies your customer through this email when the deposits are expected to arrive. The email includes a link to a Stripe-hosted verification page where they can confirm the amounts of the deposits and complete verification.

Avertissement

Verification attempts have a limit of ten failures for descriptor-based microdeposits and three for amount-based ones. If you exceed this limit, we can no longer verify the bank account. In addition, microdeposit verifications have a timeout of 10 days. If you can’t verify microdeposits in that time, the PaymentIntent reverts to requiring new payment method details. Clear messaging about what these microdeposits are and how you use them can help your customers avoid verification issues.

Optional: Send custom email notifications

Optionally, you can send custom email notifications to your customer. After you set up custom emails, you need to specify how the customer responds to the verification email. To do so, choose one of the following:

  • Use the Stripe-hosted verification page. To do this, use the verify_with_microdeposits[hosted_verification_url] URL in the next_action object to direct your customer to complete the verification process.

  • If you prefer not to use the Stripe-hosted verification page, create a form on your site. Your customers then use this form to relay microdeposit amounts to you and verify the bank account using Stripe.js.

    • At minimum, set up the form to handle the descriptor code parameter, which is a 6-digit string for verification purposes.
    • Stripe also recommends that you set your form to handle the amounts parameter, as some banks your customers use may require it.

    Integrations only pass in the descriptor_code or amounts. To determine which one your integration uses, check the value for verify_with_microdeposits[microdeposit_type] in the next_action object.

stripe.verifyMicrodepositsForPayment(clientSecret, { // Provide either a descriptor_code OR amounts, not both descriptor_code: 'SMT86W', amounts: [32, 45], });

When the bank account is successfully verified, Stripe returns the PaymentIntent object with a status of processing, and sends a payment_intent.processing webhook event.

Verification can fail for several reasons. The failure may happen synchronously as a direct error response, or asynchronously through a payment_intent.payment_failed webhook event (shown in the following examples).

{ "error": { "code": "payment_method_microdeposit_verification_amounts_mismatch", "message": "The amounts provided do not match the amounts that were sent to the bank account. You have {attempts_remaining} verification attempts remaining.", "type": "invalid_request_error" } }
Error CodeSynchronous or AsynchronousMessageStatus change
payment_method_microdeposit_failedSynchronously, or asynchronously through webhook eventMicrodeposits failed. Please check the account, institution and transit numbers providedstatus is requires_payment_method, and last_payment_error is set.
payment_method_microdeposit_verification_amounts_mismatchSynchronouslyThe amounts provided do not match the amounts that were sent to the bank account. You have {attempts_remaining} verification attempts remaining.Unchanged
payment_method_microdeposit_verification_attempts_exceededSynchronously, or asynchronously through webhook eventExceeded number of allowed verification attemptsstatus is requires_payment_method, and last_payment_error is set.
payment_method_microdeposit_verification_timeoutAsynchronously through webhook eventMicrodeposit timeout. Customer hasn’t verified their bank account within the required 10 day period.status is requires_payment_method, and last_payment_error is set.

Confirm the PaymentIntent succeeded
Server-side

ACH Direct Debit is a delayed notification payment method. This means that it can take up to four business days to receive notification of the success or failure of a payment after you initiate a debit from your customer’s account.

The PaymentIntent you create initially has a status of processing. After the payment has succeeded, the PaymentIntent status is updated from processing to succeeded.

We recommend using webhooks to confirm the charge has succeeded and to notify the customer that the payment is complete. You can also view events on the Stripe Dashboard.

Les événements suivants sont envoyés lorsque le PaymentIntent change d’état :

ÉvénementDescriptionNext Step
payment_intent.processingThe customer’s payment was submitted to Stripe successfully.Attendez que le paiement effectué réussisse ou échoue.
payment_intent.succeededLe paiement du client a réussi.Fulfill the goods or services that were purchased.
payment_intent.payment_failedThe customer’s payment was declined. This can also apply to a failed microdeposit verification.Contact the customer through email or push notification and request another payment method. If the webhook was sent due to a failed microdeposit verification, the user needs to enter in their bank account details again and a new set of microdeposits will be deposited in their account.

Test your integration

Découvrez comment tester des scénarios avec des vérifications instantanées à l’aide de Financial Connections.

Envoyer des courriels de transaction dans un bac à sable

Une fois que vous avez recueilli les coordonnées bancaires et accepté un mandat, envoyez les courriels de confirmation du mandat et de vérification du microversement dans un bac à sable.

Si votre domaine est {domain} et votre nom d’utilisateur est {username}, utilisez le format de courriel suivant pour envoyer des courriels de transaction test : {username}+test_email@{domain}.

Par exemple, si votre domaine est example.com et que votre nom d’utilisateur est info, utilisez le format info+test_email@example.com pour tester les paiements ACH Direct Debit. Ce format garantit que les courriels sont acheminés correctement. Si vous n’incluez pas le suffixe +test_email, nous n’enverrons pas le courriel.

Erreur fréquente

Pour déclencher ces courriels pendant le test, vous devez d’abord activer votre compte Stripe.

Numéros de comptes de test

Stripe fournit plusieurs numéros de compte de test et les jetons correspondants que vous pouvez utiliser pour vous assurer que votre intégration pour les comptes bancaires saisis manuellement est prête à passer en mode production.

Numéro de compteJetonNuméro d’acheminementComportement
000123456789pm_usBankAccount_success110000000Réussite du paiement.
000111111113pm_usBankAccount_accountClosed110000000Échec du paiement, car le compte est fermé.
000000004954pm_usBankAccount_riskLevelHighest110000000Le paiement est bloqué par Radar en raison d’un risque élevé de fraude.
000111111116pm_usBankAccount_noAccount110000000Échec du paiement en raison de débits non autorisés.
000222222227pm_usBankAccount_insufficientFunds110000000Échec du paiement en raison de fonds insuffisants.
000333333335pm_usBankAccount_debitNotAuthorized110000000Échec du paiement en raison des débits non autorisés.
000444444440pm_usBankAccount_invalidCurrency110000000Échec du paiement en raison d’une devise non valide.
000666666661pm_usBankAccount_failMicrodeposits110000000Le paiement ne parvient pas à envoyer les micro-versements.
000555555559pm_usBankAccount_dispute110000000Le paiement déclenche un litige.
000000000009pm_usBankAccount_processing110000000Le paiement reste en cours de traitement pour une durée indéterminée. Utile pour tester Expiration de Checkout SessionAnnulation de PaymentIntent cancel.

000777777771pm_usBankAccount_weeklyLimitExceeded110000000Le paiement échoue, car le montant du paiement a entraîné un dépassement de la limite hebdomadaire de volume de paiement du compte.
000888888885110000000Le paiement échoue en raison d’un numéro de compte jetonisé désactivé.

Avant d’effectuer les transactions de test, vous devez vérifier tous les comptes de test pour lesquels le paiement aboutit ou échoue automatiquement. Pour ce faire, utilisez les montants de micro-versement de test ou les codes de libellé ci-dessous.

Tester des montants de micro-versements et des codes de libellé

Pour simuler différents scénarios, utilisez ces montants de micro-versements ou ces code de libellé 0.01.

Valeurs de micro-versements0.01 Valeurs du code de libelléScénario
32 et 45SM11AASimule la vérification du compte.
10 et 11SM33CCSimule le dépassement du nombre de tentatives de vérification autorisé.
40 et 41SM44DDSimule l’expiration du délai de validité d’un micro-versement.

Comportement de règlement des tests

Les transactions de test sont réglées instantanément et ajoutées à votre solde de test disponible. Ce comportement diffère de celui du mode production, où les transactions peuvent prendre plusieurs jours pour apparaître dans votre solde disponible.

FacultatifInstant only verification
Server-side

By default, US bank account payments allows your customers to use instant bank account verification or microdeposits. You can optionally require instant bank account verification only, using the verification_method parameter when you create the PaymentIntent.

Command Line
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
curl https://api.stripe.com/v1/payment_intents \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -d amount=1099 \ -d currency=usd \ -d setup_future_usage=off_session \ -d customer=
"{{CUSTOMER_ID}}"
\ -d "payment_method_types[]"=us_bank_account \ -d "payment_method_options[us_bank_account][verification_method]"=instant \ -d "payment_method_options[us_bank_account][financial_connections][permissions][]"=payment_method \ -d "payment_method_options[us_bank_account][financial_connections][permissions][]"=balances

This ensures that you don’t need to handle microdeposit verification. However, if instant verification fails, the PaymentIntent’s status is requires_payment_method, indicating a failure to instantly verify a bank account for your customer.

FacultatifMicrodeposit only verification
Server-side

By default, US bank account payments allow your customers to use instant bank account verification or microdeposits. You can optionally require microdeposit verification only using the verification_method parameter when you create the PaymentIntent.

Avertissement

If using a custom payment form, you must build your own UI to collect bank account details. If you disable Stripe microdeposit emails, you must build your own UI for your customer to confirm the microdeposit code or amount.

Command Line
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
curl https://api.stripe.com/v1/payment_intents \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -d amount=1099 \ -d currency=usd \ -d setup_future_usage=off_session \ -d customer=
"{{CUSTOMER_ID}}"
\ -d "payment_method_types[]"=us_bank_account \ -d "payment_method_options[us_bank_account][verification_method]"=microdeposits

You must then collect your customer’s bank account with your own form and call stripe.confirmUsBankAccountPayment with those details to complete the PaymentIntent.

script.js
var form = document.getElementById('payment-form'); var accountholderName = document.getElementById('accountholder-name'); var email = document.getElementById('email'); var accountNumber = document.getElementById('account-number'); var routingNumber = document.getElementById('routing-number'); var accountHolderType= document.getElementById('account-holder-type'); var submitButton = document.getElementById('submit-button'); var clientSecret = submitButton.dataset.secret; form.addEventListener('submit', function(event) { event.preventDefault(); stripe.confirmUsBankAccountPayment(clientSecret, { payment_method: { billing_details: { name: accountholderName.value, email: email.value, }, us_bank_account: { account_number: accountNumber.value, routing_number: routingNumber.value, account_holder_type: accountHolderType.value, // 'individual' or 'company' }, }, }) .then(({paymentIntent, error}) => { if (error) { // Inform the customer that there was an error. console.log(error.message); } else { // Handle next step based on the intent's status. console.log("PaymentIntent ID: " + paymentIntent.id); console.log("PaymentIntent status: " + paymentIntent.status); } }); });

FacultatifResolve disputes
Server-side

Customers can generally dispute an ACH Direct Debit payment through their bank for up to 60 calendar days after a debit on a personal account, or up to 2 business days for a business account. In rare instances, a customer might be able to successfully dispute a debit payment outside these standard dispute timelines.

When a customer disputes a payment, Stripe sends a charge.dispute.closed webhook event, and the PaymentMethod authorization is revoked.

In rare situations, Stripe might receive an ACH failure from the bank after a PaymentIntent has transitioned to succeeded. If this happens, Stripe creates a dispute with a reason of:

  • insufficient_funds
  • incorrect_account_details
  • bank_can't_process

Stripe charges a failure fee in this situation.

Future payments reusing this PaymentMethod return the following error:

{ "error": { "message": "This PaymentIntent requires a mandate, but no existing mandate was found. Collect mandate acceptance from the customer and try again, providing acceptance data in the mandate_data parameter.", "payment_intent": { ... } "type": "invalid_request_error" } }

This error contains a PaymentIntent in the requires_confirmation state. To continue with the payment, you must:

  1. Resolve the dispute with the customer to ensure future payments will not be disputed.
  2. Confirm authorization from your customer again.

To confirm authorization for the payment, you can collect mandate acknowledgement from your customer online with Stripe.js or confirm authorization with your customer offline using the Stripe API.

Avertissement

If a customer disputes more than one payment from the same bank account, Stripe blocks their bank account. Contact Stripe Support for further resolution.

Command Line
cURL
No results
curl https://api.stripe.com/v1/payment_intents/{{PAYMENT_INTENT_ID}}/confirm \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -d "mandate_data[customer_acceptance][type]"=offline

FacultatifRéférence du paiement

The payment reference number is a bank-generated value that allows the bank account owner to use their bank to locate funds. When the payment succeeds, Stripe provides the payment reference number in the Dashboard and inside the Charge object.

Charge StatePayment Reference Value
En attenteNon disponible
ÉchouésNon disponible
RéussiAvailable (for example, 091000015001234)

In addition, when you receive the charge.succeeded webhook, view the content of payment_method_details to locate the payment_reference.

The following example event shows the rendering of a successful ACH payment with a payment reference number.

{ "id": "{{EVENT_ID}}", "object": "event", // omitted some fields in the example "type": "charge.succeeded", "data": { "object": { "id": "{{PAYMENT_ID}}", "object": "charge", //... "paid": true, "payment_intent": "{{PAYMENT_INTENT_ID}}", "payment_method": "{{PAYMENT_METHOD_ID}}", "payment_method_details": { "type": "us_bank_account", "us_bank_account": { "account_holder_type": "individual", "account_type": "checking", "bank_name": "TEST BANK", "fingerprint": "Ih3foEnRvLXShyfB", "last4": "1000", "payment_reference": "091000015001234", "routing_number": "110000000" } } // ... } } }

View the contents of the destination_details to locate the refund reference associated with the refunded ACH payments.

The following example event shows the rendering of a successful ACH refund with a refund reference number. Learn more about refunds.

{ "id": "{{EVENT_ID}}", "object": "event", "type": "charge.refund.updated", "data": { "object": { "id": "{{REFUND_ID}}", "object": "refund", //... "payment_intent": "{{PAYMENT_INTENT_ID}}", "destination_details": { "type": "us_bank_transfer", "us_bank_transfer": { "reference": "091000015001111", "reference_status": "available" } } // ... } } }

FacultatifConfigurer la date de prélèvement du client
Server-side

You can control the date that Stripe debits a customer’s bank account using the target date. The target date must be at least three days in the future and no more than 15 days from the current date.

The target date schedules money to leave the customer’s account on the target date. You can cancel a PaymentIntent created with a target date up to three business days before the configured date.

Target dates that meet one of the following criteria delay the debit until next available business day:

  • Target date falls on a weekend, a bank holiday, or other non-business day.
  • Target date is fewer than three business days in the future.

This parameter operates on a best-effort basis. Each customer’s bank might process debits on different dates, depending on local bank holidays or other reasons.

Voir aussi

  • Save ACH Direct Debit pre-authorized debit details for future payments
Cette page vous a-t-elle été utile?
OuiNon
  • Besoin d'aide? Contactez le service d'assistance.
  • Consultez notre journal des modifications.
  • Des questions? Contactez l'équipe commerciale.
  • GML? Lire llms.txt.
  • Optimisé par Markdoc