Enregistrer les informations pour les futurs paiements par prélèvement automatique ACH
Comment enregistrer les informations relatives au moyens de paiement pour les paiements futurs par prélèvement automatique ACH.
Vous pouvez utiliser l’API Setup Intents pour collecter à l’avance les informations relatives au moyen de paiement, en vue d’un paiement dont la date et le montant seront déterminés ultérieurement. Cette méthode est utile pour :
- Enregistrement des moyens de paiement dans un wallet afin de faciliter les futurs achats
- Encaissement de suppléments de facturation après la fourniture d’un service
- Démarrage d’une période d’essai gratuit dans le cadre d’un abonnement
Remarque
Le prélèvement automatique ACH est un moyen de paiement à notification différée, ce qui signifie que les fonds ne sont pas immédiatement disponibles après le paiement. Il faut généralement compter 4 jours ouvrables pour qu’un paiement arrive sur votre compte.
Créer ou récupérer un objet CustomerRecommandéCôté serveur
Créez un objet Customer lorsque votre client crée un compte auprès de votre entreprise, ou récupérez l’objet Customer existant associé à cet utilisateur. L’association de l’ID de l’objet Customer à votre propre représentation interne d’un client vous permet de récupérer et d’utiliser ultérieurement les informations de paiement enregistrées. Ajoutez une adresse e-mail à l’objet Customer pour activer l’optimisation des utilisateurs connus de Financial Connections.
Créer un SetupIntentCôté serveur
Un SetupIntent est un objet qui représente votre intention de configurer le moyen de paiement d’un client en vue de futurs paiements. Le SetupIntent
suit les étapes de ce processus de configuration.
Créez un SetupIntent sur votre serveur en définissant payment_method_types sur us_bank_account, et indiquez l’id du client.
Par défaut, lors de la collecte des coordonnées bancaires, Financial Connections est utilisé pour vérifier instantanément le compte de votre client. Une option de secours comprenant la saisie manuelle du numéro de compte et la vérification par microversement peut être utilisée. Consultez la documentation relative à Financial Connections pour savoir comment configurer Financial Connections et accéder à des données de compte supplémentaires de façon à optimiser votre intégration ACH. Par exemple, vous pouvez utiliser Financial Connections pour consulter le solde d’un compte avant d’initier le paiement ACH.
Remarque
Pour accéder à des données supplémentaires après qu’un client a authentifié son compte, celui-ci doit associer de nouveau son compte avec des autorisations étendues.
Récupérer la clé secrète du client
Le SetupIntent contient une clé secrète à utiliser côté client pour finaliser le processus de paiement en toute sécurité. Vous pouvez adopter différentes approches pour transmettre cette clé secrète côté client.
Collecter les informations du moyen de paiementCôté client
Lorsqu’un client clique pour payer avec ACH Direct Debit, nous vous recommandons d’utiliser Stripe.js pour soumettre le paiement à Stripe. Stripe.js est notre bibliothèque JavaScript de base pour créer les tunnels de paiement : elle gère automatiquement les opérations complexes d’intégration et vous permettra de facilement étendre votre intégration à d’autres moyens de paiement par la suite.
Intégrez le script Stripe.js à votre page de paiement en l’ajoutant entre les balises head
de votre fichier HTML.
<head> <title>Checkout</title> <script src="https://js.stripe.com/basil/stripe.js"></script> </head>
Créez une instance de Stripe.js avec le code JavaScript suivant sur votre page de paiement.
// 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'
Plutôt que d’envoyer la totalité de l’objet SetupIntent au client, utilisez sa clé secrète provenant de l’étape précédente. Il ne s’agit pas de vos clés API qui authentifient les requêtes de l’API de Stripe.
Utilisez la clé secrète du client avec prudence, car elle peut servir à finaliser le processus de configuration de l’objet Payment Method. Ne l’enregistrez pas, ne l’intégrez pas dans des URL et ne la dévoilez à personne d’autre que votre client.
Utilisez stripe.collectBankAccountForSetup pour collecter les coordonnées bancaires avec Financial Connections, créer un objet PaymentMethod et l’associer au SetupIntent. Pour créer un PaymentMethod par prélèvement automatique ACH, vous devez obligatoirement inclure le nom du titulaire du compte dans le paramètre billing_
.
// 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.collectBankAccountForSetup({ clientSecret: clientSecret, params: { payment_method_type: 'us_bank_account', payment_method_data: { billing_details: { name: accountHolderNameField.value, email: emailField.value, }, }, }, expand: ['payment_method'], }) .then(({setupIntent, error}) => { if (error) { console.error(error.message); // PaymentMethod collection failed for some reason. } else if (setupIntent.status === 'requires_payment_method') { // Customer canceled the hosted verification modal. Present them with other // payment method type options. } else if (setupIntent.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(); } }); });
Le flux d’authentification de Financial Connections gère automatiquement la collecte et la vérification des informations de compte bancaire. Lorsque votre client termine le flux d’authentification, le PaymentMethod est automatiquement associé au SetupIntent, et créée un compte Financial Connections.
Erreur fréquente
Les comptes bancaires que vos clients associent par saisie manuelle ou par le biais de microversements ne fourniront pas d’accès à certaines données supplémentaires comme le solde, le propriétaire et les transactions.
Afin de proposer une expérience utilisateur optimale quel que soit l’appareil utilisé, définissez le paramètre minimum-scale
de la fenêtre d’affichage de votre page sur 1 à l’aide de la balise meta
.
<meta name="viewport" content="width=device-width, minimum-scale=1" />
Collecter et envoyer l'accusé de réception du mandatCôté client
Avant de pouvoir terminer le SetupIntent et sauvegarder les informations du moyen de paiement pour le client, vous devez obtenir l’autorisation de paiement en affichant les conditions du mandat pour que le client les accepte.
Pour vous conformer aux règles de la Nacha, vous devez obtenir l’autorisation d’initier le paiement auprès de votre client. Pour ce faire, présentez-lui les conditions du mandat et demandez-lui de les accepter. Pour en savoir plus, consultez la page sur les mandats.
Lorsque le client accepte les conditions du mandat, vous devez confirmer le SetupIntent. Utilisez stripe.confirmUsBankAccountSetup pour mener à bien le paiement une fois que le client a soumis le formulaire.
confirmationForm.addEventListener('submit', (ev) => { ev.preventDefault(); stripe.confirmUsBankAccountSetup(clientSecret) .then(({setupIntent, error}) => { if (error) { console.error(error.message); // The payment failed for some reason. } else if (setupIntent.status === "requires_payment_method") { // Confirmation failed. Attempt again with a different payment method. } else if (setupIntent.status === "succeeded") { // Confirmation succeeded! The account is now saved. // Display a message to customer. } else if (setupIntent.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
L’exécution de stripe.confirmUsBankAccountSetup peut prendre plusieurs secondes. Pendant ce temps, désactivez la possibilité de soumettre à nouveau votre formulaire et affichez un indicateur d’attente (une boucle de progression, par exemple). Si vous recevez une erreur, montrez-la au client, réactivez le formulaire et masquez l’indicateur d’attente.
Sauf échec de l’opération, Stripe renvoie un objet SetupIntent présentant l’un des états suivants :
Statut | Description | Étapes suivantes |
---|---|---|
succeeded | Le compte bancaire a été vérifié instantanément ou la vérification n’était pas nécessaire. | Aucune action requise |
requires_ | Une action supplémentaire est requise pour mener à bien la vérification du compte bancaire. | Étape 6 : Vérification des comptes bancaires à l’aide de microversements |
Après avoir confirmé le SetupIntent, un e-mail de confirmation du mandat et les coordonnées bancaires recueillies doivent être envoyés à votre client. Par défaut, Stripe gère cette étape, mais vous pouvez choisir d’envoyer des notifications personnalisées si vous préférez.
Vérifier le compte bancaire à l'aide de microversementsCôté client
Tous les clients ne peuvent pas vérifier instantanément le compte bancaire. Cette étape ne s’applique que si votre client a choisi de se désinscrire du flux de vérification instantanée dans l’étape précédente.
Dans ce cas, Stripe envoie un microversement descriptor_
ou amount
si un problème survient au cours de la vérification du compte bancaire. Ces microversements apparaissent sur le relevé en ligne du client sous 1 à 2 jours ouvrables.
- Code de libellé : Stripe envoie un microversement unique de 0,01 USD sur le compte bancaire du client avec un
descriptor_
unique à 6 chiffres qui commence par SM. Votre client utilise cette chaîne pour vérifier son compte bancaire.code - Montant : Stripe envoie deux microversements distincts sur le compte bancaire du client avec un code de libellé indiquant
ACCTVERIFY
. Votre client utilise les montants de ces versements pour vérifier son compte bancaire.
L’appel stripe.confirmUsBankAccountSetup effectué à l’étape précédente renvoie un SetupIntent avec l’état requires_
. Le champ next_
du SetupIntent contient des informations utiles à la vérification.
next_action: { type: "verify_with_microdeposits", verify_with_microdeposits: { arrival_date: 1647586800, hosted_verification_url: "https://payments.stripe.com/…", microdeposit_type: "descriptor_code" } }
Si vous avez fourni une adresse e-mail de facturation, Stripe utilise cette dernière pour notifier votre client de la date d’arrivée prévue des versements. L’e-mail envoyé inclut un lien vers la page de vérification hébergée par Stripe, sur laquelle il peut confirmer les montants des versements et effectuer la vérification.
Avertissement
Les tentatives de vérification sont limitées à dix pour les microversements basés sur des libellés et à trois pour ceux basés sur des montants. Si vous atteignez cette limite, nous ne pouvons plus vérifier le compte bancaire. En outre, les vérifications à l’aide de microversements expirent au bout de 10 jours. Si vous ne vérifiez pas les microversements pendant ce laps de temps, le SetupIntent réitère sa demande d’informations sur le moyen de paiement. En informant clairement vos clients sur le fonctionnement de ces microversements, vous évitez d’éventuels problèmes liés à la vérification.
Facultatif : Envoi de notifications personnalisées par e-mail
Si vous le souhaitez, vous pouvez envoyer des notifications personnalisées par e-mail à votre client. Après avoir configuré les e-mails personnalisés, vous devez préciser comment le client doit répondre à l’e-mail de vérification. Pour ce faire, choisissez une des options suivantes :
Utilisez la page de vérification hébergée par Stripe. Pour ce faire, utilisez l’URL
verify_
de l’objet next_action pour diriger votre client vers la procédure de vérification.with_ microdeposits[hosted_ verification_ url] Si vous préférez ne pas utiliser la page de vérification hébergée par Stripe, créez un formulaire sur votre site. Vos clients pourront ensuite utiliser ce formulaire pour vous transmettre les montants des microversements et vérifier le compte bancaire à l’aide de Stripe.js.
- Configurez au moins le formulaire pour qu’il gère le paramètre
descriptor code
, qui comporte une chaîne à 6 chiffres à des fins de vérification. - Stripe vous recommande également de configurer votre formulaire pour qu’il gère le paramètre
amounts
, car certaines banques utilisées par vos clients peuvent l’exiger.
Les intégrations transmettent uniquement le code de libellé,
descriptor_
, ou les montants,code amounts
. Pour savoir quel paramètre votre intégration utilise, vérifiez la valeur deverify_
dans l’objetwith_ microdeposits[microdeposit_ type] next_
.action - Configurez au moins le formulaire pour qu’il gère le paramètre
stripe.verifyMicrodepositsForSetup(clientSecret, { // Provide either a descriptor_code OR amounts, not both descriptor_code: `SMT86W`, amounts: [32, 45], });
Lorsque le compte bancaire est vérifié avec succès, Stripe renvoie l’objet SetupIntent avec l’état status
défini sur succeeded
, et envoie un événement webhook setup_intent.succeeded.
La vérification peut échouer pour plusieurs raisons. L’échec peut survenir de manière synchrone en tant que réponse d’erreur directe, ou de manière asynchrone via un événement webhook setup_intent.setup_failed (voir les exemples suivants).
Code d’erreur | Synchrone ou asynchrone | Message | Changement d’état |
---|---|---|---|
payment_ | De façon synchrone ou asynchrone via un événement de webhook | Les microversements ont échoué. Veuillez vérifier la validité des numéros de compte, de l’établissement et de transit fournis. | status est à l’état requires_ et le paramètre last_ est défini. |
payment_ | De façon synchrone | Les montants fournis ne correspondent pas à ceux envoyés au compte bancaire. Il vous reste {attempts_remaining} tentatives de vérification du compte. | Inchangé |
payment_ | De façon synchrone ou asynchrone via un événement de webhook | Dépassement du nombre de tentatives de vérification autorisé | status est à l’état requires_ et le paramètre last_ est défini. |
payment_ | De façon asynchrone via un événement de webhook | Expiration du microversement. Le client n’a pas vérifié son compte bancaire dans le délai de 10 jours prévu. | status est à l’état requires_ et le paramètre last_ est défini. |
Tester votre intégration
Découvrez comment tester des scénarios avec des vérifications instantanées à l’aide de Financial Connections.
Envoyer des e-mails de transaction dans un environnement de test
Une fois que vous avez collecté les coordonnées bancaires et accepté un mandat, envoyez les courriels de confirmation du mandat et de vérification du microversement dans un environnement de bac à sable.
Si votre domaine est {domain} et que votre nom d’utilisateur est {username}, utilisez le format d’e-mail suivant pour envoyer des e-mails de transaction de 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 e-mails sont acheminés correctement. Si vous n’incluez pas le suffixe +test_email, nous n’enverrons pas l’e-mail.
Erreur fréquente
Pour déclencher ces e-mails 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 tokens 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 compte | Token | Numéro de routage | Comportement |
---|---|---|---|
000123456789 | pm_ | 110000000 | Le paiement aboutit. |
000111111113 | pm_ | 110000000 | Le paiement échoue parce que le compte est clôturé. |
000000004954 | pm_ | 110000000 | Le paiement est bloqué par Radar en raison d’un risque élevé de fraude. |
000111111116 | pm_ | 110000000 | Le paiement échoue car aucun compte n’est trouvé. |
000222222227 | pm_ | 110000000 | Le paiement échoue en raison de fonds insuffisants. |
000333333335 | pm_ | 110000000 | Le paiement échoue parce que les débits ne sont pas autorisés. |
000444444440 | pm_ | 110000000 | Le paiement échoue en raison d’une devise non valide. |
000666666661 | pm_ | 110000000 | Le paiement ne parvient pas à envoyer les microversements. |
000555555559 | pm_ | 110000000 | Le paiement déclenche un litige. |
000000000009 | pm_ | 110000000 | Le paiement reste en cours de traitement pour une durée indéterminée. Cela est utile pour tester l’annulation d’un PaymentIntent. |
000777777771 | pm_ | 110000000 | Le paiement échoue, car son montant entraîne un dépassement de la limite hebdomadaire de volume de paiement du compte. |
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 codes de libellé ou les montants de microversements de test ci-dessous.
Tester des codes de libellé et des montants de microversements
Pour simuler différents scénarios, utilisez ces montants de microversements ou ces codes de libellé 0.01.
Valeurs de microversement | Valeurs de code de libellé 0.01 | Scénario |
---|---|---|
32 et 45 | SM11AA | Simule la vérification du compte. |
10 et 11 | SM33CC | Simule le dépassement du nombre de tentatives de vérification autorisé. |
40 et 41 | SM44DD | Simule l’expiration du délai de validité d’un microversement. |
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 être réglées dans votre solde disponible.
Acceptation des futurs paiementsCôté serveur
Lorsque le SetupIntent aboutit, un nouvel objet PaymentMethod est créé et associé à un objet Customer. Ils peuvent être utilisés pour effectuer des paiements futurs sans devoir demander au client d’indiquer à nouveau son compte bancaire.