Créer une intégration pour les abonnements
Créez et gérez des abonnements pour les paiements récurrents.
Personnalisez votre intégration avec l’API Appearance.
Vous souhaitez utiliser Stripe Billing ?
Nous développons une intégration du Payment Element qui permet de gérer les fonctions d’abonnement, y compris les essais gratuits, les ancres de cycle de facturation et la proratisation. Lisez le guide Construire une page de paiement pour en savoir plus.
Suivez ce guide pour savoir comment mettre en place des abonnements à tarif fixe. Vous apprendrez à utiliser le Payment Element pour créer un formulaire de paiement personnalisé que vous intégrerez à votre application.
Si vous ne souhaitez pas créer de formulaire de paiement personnalisé, vous pouvez intégrer Checkout. Pour une version plus immersive de ce guide d’intégration de bout en bout, accédez au guide de démarrage rapide de Billing.
Si vous ne souhaitez pas coder une intégration, vous pouvez configurer des abonnements de base manuellement dans le Dashboard ou utiliser Payment Links pour configurer des abonnements sans avoir à rédiger une seule ligne de code. Nous vous conseillons également de vous documenter sur la façon de concevoir votre intégration afin de vous aider dans votre prise de décision.
Ce que vous allez créer
Ce guide vous explique comment :
- Modéliser votre offre en créant un catalogue de produits.
- Développer un processus d’inscription qui crée un client.
- Créer des abonnements et collecter les informations de paiement de vos clients.
- Tester et surveiller l’état des paiements et de l’abonnement.
- Permettre aux clients de modifier leur plan ou d’annuler l’abonnement.
Comment modéliser un abonnement dans Stripe
Les abonnements facilitent votre facturation en créant automatiquement des factures et des PaymentIntents. Afin de créer et d’activer un abonnement, vous devez d’abord créer un objet Product pour modéliser ce que vous vendez, ainsi qu’un objet Price, qui détermine la fréquence et le montant de la facturation. Vous avez également besoin d’un objet Customer pour enregistrer les PaymentMethods utilisés dans le cadre des paiements récurrents.
Définitions des objets API
Configurer Stripe
Installez le client Stripe de votre choix :
Installez ensuite l’interface de ligne de commande Stripe. Cette dernière vous permet d’exécuter les tests webhook dont vous avez besoin, et de faire des appels à l’API vers Stripe. Ce guide vous explique dans une section ultérieure comment utiliser la CLI pour définir un modèle tarifaire.
Pour davantage d’options d’installation, consultez la page consacrée à l’interface de ligne de commande Stripe.
Créer le modèle tarifaireCLI Stripe ou Dashboard
Créez vos produits et leurs tarifs dans le Dashboard ou via l’interface de ligne de commande Stripe.
Cet exemple utilise un service à tarif fixe avec deux options de niveau de service différentes : Basic et Premium. Pour chaque option de niveau de service, vous devez créer un produit et un tarif récurrent. (Si vous souhaitez ajouter un paiement ponctuel, par exemple des frais d’installation, créez un troisième produit avec un tarif unique. Par souci de simplicité, cet exemple n’inclut pas de paiement ponctuels.)
Dans cet exemple, chaque produit est facturé mensuellement. Le tarif du produit de base est de 5 USD. Celui du produit premium est de 15 USD.
Créer l'objet CustomerClient et serveur
Stripe a besoin d’un objet Customer pour chaque abonnement. Sur le front-end de votre application, collectez toutes les informations nécessaires sur vos utilisateurs et transmettez-les à votre back-end.
Si vous avez besoin de recueillir une adresse, le composant Address Element vous permet de recueillir l’adresse de livraison ou de facturation de vos clients. Pour plus d’informations sur ce composant, consultez la page consacrée à Address Element.
<form id="signup-form"> <label> Email <input id="email" type="email" placeholder="Email address" value="test@example.com" required /> </label> <button type="submit"> Register </button> </form>
const emailInput = document.querySelector('#email'); fetch('/create-customer', { method: 'post', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ email: emailInput.value, }), }).then(r => r.json());
Sur le serveur, créez l’objet Customer Stripe.
Créer l'objet SubscriptionClient et serveur
Note
Si vous souhaitez afficher le Payment Element sans créer d’abonnement au préalable, consultez la page Collecter les détails du paiement avant de créer une intention.
Laissez votre nouveau client choisir une offre, puis créez l’abonnement. Dans ce guide, le client a le choix entre l’option de base et l’option Premium.
Sur votre front-end, transmettez l’ID du tarif sélectionné et l’ID de l’enregistrement client à votre back-end.
fetch('/create-subscription', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ priceId: priceId, customerId: customerId, }), })
Sur votre back-end, créez l’abonnement à l’état incomplete
à l’aide de payment_
. Renvoyez ensuite le client_
du premier PaymentIntent de l’abonnement vers votre front-end pour finaliser le paiement.
Définissez save_default_payment_method on_
pour enregistrer le moyen de paiement comme moyen de paiement par défaut pour un abonnement lorsqu’un paiement est effectué avec succès. L’enregistrement d’un moyen de paiement par défaut augmente le taux de réussite des futurs paiements d’abonnement.
Note
Si vous utilisez un tarif multidevise, utilisez le paramètre currency pour indiquer à l’abonnement quelle devise utiliser. (Si vous omettez le paramètre currency
, l’abonnement utilise la devise par défaut associée au tarif.)
À ce stade, l’objet Subscription est inactive
et en attente de paiement. Voici un exemple de réponse. Les champs à sauvegarder impérativement sont en surbrillance, mais vous devez également sauvegarder tous les éléments auxquels votre application accède fréquemment.
{ "id": "sub_JgRjFjhKbtD2qz", "object": "subscription", "application_fee_percent": null, "automatic_tax": { "enabled": false }, "billing": "charge_automatically", "billing_cycle_anchor": 1623873347, "billing_thresholds": null,
Collecter les informations de paiementClient
Utilisez Stripe Elements pour collecter les données de paiement du client et activer son abonnement. Vous pouvez personnaliser Elements aux couleurs de votre application.
Note
Si vous construisez une intégration avec Stripe Elements, Link vous permet de créer des paiements sans friction pour vos clients. Ils peuvent enregistrer, modifier et gérer tous leurs détails de paiement dans Link sans que votre intégration n’en soit affectée. Pendant ce temps, au fur et à mesure que Stripe ajoute la prise en charge de nouveaux moyens de paiement à Link, votre intégration peut les accepter automatiquement, sans que vous ayez à modifier vos paramètres de moyens de paiement.
Le Payment Element recueille en toute sécurité toutes les données nécessaires pour un large éventail de moyens de paiement. Les moyens de paiement actuellement prises en charge par l’élément de paiement et les abonnements sont les cartes de crédit, Link, le prélèvement SEPA et le prélèvement BECS.
Configurer Stripe Elements
Le composant Element Payment est automatiquement disponible en tant que fonctionnalité de Stripe.js. Intégrez le script Stripe.js à votre page de paiement en l’ajoutant entre les balises head
de votre fichier HTML. Chargez toujours Stripe.js directement à partir de js.stripe.com pour maintenir votre conformité PCI. Vous ne devez pas inclure le script dans un lot ni en héberger de copie.
<head> <title>Checkout</title> <script src="https://js.stripe.com/v3/"></script> </head> <body> <!-- content here --> </body>
Créez une instance de Stripe 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'
Ajouter le composant Element Payment à votre page
Le composant Element Payment doit avoir un emplacement dédié sur votre page de paiement. Créez un nœud DOM (conteneur) vide avec un ID unique dans votre formulaire de paiement.
<form id="payment-form"> <div id="payment-element"> <!-- Elements will create form elements here --> </div> <button id="submit">Subscribe</button> <div id="error-message"> <!-- Display error message to your customers here --> </div> </form>
Une fois le formulaire ci-dessus chargé, créez une instance de l’Element Payment et montez-la sur le nœud DOM conteneur. À l’étape de création de l’abonnement, vous avez transmis la valeur client_
à votre front-end. Transmettez cette valeur en tant qu’option lors de la création de l’instance de l’Element.
const options = { clientSecret: '{{CLIENT_SECRET}}', // Fully customizable with appearance API. appearance: {/*...*/}, }; // Set up Stripe.js and Elements to use in checkout form, passing the client secret obtained in step 5 const elements = stripe.elements(options); const paymentElementOptions = { layout: "tabs", }; // Create and mount the Payment Element const paymentElement = elements.create('payment', paymentElementOptions); paymentElement.mount('#payment-element');
Le composant Payment Element affiche un formulaire dynamique qui permet à votre client de sélectionner un moyen de paiement. Le formulaire collecte automatiquement toutes les informations de paiement nécessaires pour le moyen de paiement sélectionné.
Configurations facultatives du Payment Element
- Adaptez le Payment Element au design de votre site en transmettant l’objet Appearance dans les
options
lors de la création d’une instance d’Elements. - Configurez l’interface Apple Pay afin de renvoyer un token de marchand pour prendre en charge les paiements récurrents, les paiements différés et les paiements par rechargement automatique.
Mener à bien le paiement
Utilisez stripe.
pour mener à bien le paiement à l’aide des informations de le composant Element Payment et activer l’abonnement. Un PaymentMethod est alors créé et le premier PaymentIntent de l’abonnement incomplet est confirmé, ce qui déclenche le processus de paiement. Si une authentication forte du client (SCA) est requise pour le paiement, le composant Element Payment gère le processus d’authentification avant de confirmer le PaymentIntent.
Ajoutez une URL return_url à cette fonction pour indiquer la page vers laquelle Stripe doit rediriger l’utilisateur une fois le paiement effectué. Votre utilisateur peut être d’abord redirigé vers un site intermédiaire, comme une page d’autorisation bancaire, avant d’être redirigé vers l’URL return_
. Les paiements par carte sont immédiatement redirigés vers l’URL return_
à la réussite du paiement.
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`. } });
Lorsque votre client effectue un paiement, Stripe le redirige vers l’URL return_
et inclut les paramètres de requête d’URL suivants. La page de redirection peut utiliser ces paramètres pour récupérer l’état du PaymentIntent et ainsi afficher l’état du paiement pour le client.
Lorsque vous spécifiez une URL return_
, vous pouvez également ajouter vos propres paramètres de requête à utiliser sur la page de redirection.
Paramètre | Description |
---|---|
payment_ | Identifiant unique du PaymentIntent . |
payment_ | La clé secrète du client de l’objet PaymentIntent . |
Lorsque le client est redirigé vers votre site, vous pouvez utiliser le payment_
pour interroger le PaymentIntent et communiquer l’état de la transaction à votre client.
Mise en garde
Si vous disposez d’outils qui assurent le suivi de la session navigateur du client, vous devrez peut-être ajouter le domaine stripe.
à 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 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_
; ils seront conservés tout au long du processus de redirection.
// 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; } });'pk_test_TYooMQauvdEDq54NiTphI7jx'
Écouter les webhooksServeur
Afin de compléter votre intégration, vous devez traiter les webhooks envoyés par Stripe. Les webhooks sont des événements qui se déclenchent lorsqu’un état change dans Stripe, par exemple lorsque des abonnements créent de nouvelles factures. Dans votre application, il vous faut pour cela configurer un gestionnaire HTTP de sorte qu’il accepte les requêtes POST contenant l’événement webhook et vérifier la signature de l’événement :
Pendant le développement, utilisez l’interface de ligne de commande de Stripe pour observer les webhooks et les transférer vers votre application. Exécutez la commande suivante dans un nouveau terminal pendant que votre application de développement est en cours d’exécution :
stripe listen --forward-to localhost:4242/webhook
Pour le mode production, définissez une URL d’endpoint de webhook dans le Dashboard, ou utilisez l’API Webhook Endpoints.
Les étapes restantes de ce guide vont vous amener à écouter quelques événements. Pour plus d’informations sur les webhooks spécifiques aux abonnements, consultez notre documentation consacrée aux événements Subscription.
Fournir l'accès à votre serviceClient et serveur
Maintenant que l’abonnement est actif, fournissez à votre client l’accès à votre service. Pour ce faire, écoutez les événements customer.
, customer.
et customer.
. Ces événements transmettent un objet Subscription, dans lequel un champ status
indique si l’abonnement est actif, en retard de paiement ou annulé. Consultez la documentation consacrée au cycle de vie des abonnements pour prendre connaissance de la liste complète des états.
Dans votre gestionnaire de webhooks :
- Vérifiez l’état de l’abonnement. S’il affiche
active
, cela signifie que votre client a payé son abonnement. - Vérifiez le produit auquel le client s’est abonné et fournissez l’accès à votre service. Le fait de vérifier le produit plutôt que le tarif vous assure une plus grande souplesse si vous devez modifier la tarification ou la fréquence de facturation.
- Sauvegardez les
product.
,id subscription.
etid subscription.
dans votre base de données avec lestatus customer.
déjà stocké. Vérifiez cet enregistrement au moment de décider des fonctionnalités à activer pour l’utilisateur dans votre application.id
L’état d’un abonnement peut changer à tout moment de son cycle de vie, même si votre application n’appelle pas directement Stripe. Par exemple, un renouvellement peut échouer en raison d’une carte expirée, ce qui fait passer l’abonnement à l’état « past due ». Ou, si vous implémentez le portail client, un utilisateur peut choisir d’annuler son abonnement sans accéder directement à votre application. L’implémentation correcte de votre gestionnaire permet de synchroniser l’état de votre application avec celui de Stripe.
Annuler l'abonnementClient et serveur
Il est courant de laisser aux clients la possibilité d’annuler leur abonnement. Cet exemple vous explique comment ajouter une option d’annulation sur la page des paramètres du compte.
Paramètres d’un compte ayant la possibilité d’annuler son abonnement
function cancelSubscription(subscriptionId) { return fetch('/cancel-subscription', { method: 'post', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ subscriptionId: subscriptionId, }), }) .then(response => { return response.json(); }) .then(cancelSubscriptionResponse => { // Display to the user that the subscription has been canceled. }); }
Sur votre back-end, définissez l’endpoint que votre front-end appellera.
Votre application reçoit un événement customer.
.
Après l’annulation de l’abonnement, mettez à jour votre base de données pour supprimer l’ID de l’abonnement Stripe précédemment sauvegardé, et limitez l’accès à votre service.
Une fois un abonnement annulé, il ne peut plus être réactivé. Vous devez dès lors collecter de nouveau les informations de facturation de votre client, mettre à jour son moyen de paiement par défaut et créer un nouvel abonnement à partir de l’enregistrement client existant.
Tester votre intégration
Tester les moyens de paiement
Utilisez le tableau suivant pour tester différents scénarios et moyens de paiement.
Moyen de paiement | Scénario | Méthode de test |
---|---|---|
Prélèvement automatique BECS | Le montant dû est réglé par prélèvement automatique BECS. | Remplissez le formulaire à l’aide du numéro de compte 900123456 et du BSB 000-000 . Le PaymentIntent confirmé passe d’abord à l’état processing , puis à l’état succeeded trois minutes plus tard. |
Prélèvement automatique BECS | Le paiement de votre client échoue avec un code d’erreur account_ . | Remplissez le formulaire à l’aide du numéro de compte 111111113 et du BSB 000-000 . |
Carte bancaire | Le paiement par carte bancaire aboutit et ne nécessite pas d’authentification. | Remplissez le formulaire de paiement par carte bancaire en saisissant le numéro de carte 4242 4242 4242 4242 ainsi que la date d’expiration, le CVC et le code postal de votre choix. |
Carte bancaire | Le paiement par carte bancaire requiert une authentification. | Remplissez le formulaire de paiement par carte bancaire en saisissant le numéro de carte 4000 0025 0000 3155 ainsi que la date d’expiration, le CVC et le code postal de votre choix. |
Carte bancaire | La carte est refusée avec un code de refus de type insufficient_ . | Remplissez le formulaire de paiement par carte bancaire en saisissant le numéro 4000 0000 0000 9995 ainsi que la date d’expiration, le CVC et le code postal de votre choix… |
Prélèvement automatique SEPA | Le montant dû est réglé par prélèvement automatique SEPA. | Remplissez le formulaire à l’aide du numéro de compte AT321904300235473204 . Le PaymentIntent confirmé passe d’abord à l’état processing, puis à l’état succeeded trois minutes plus tard. |
Prélèvement automatique SEPA | Le PaymentIntent de votre client passe de l’état processing à l’état requires_ . | Remplissez le formulaire à l’aide du numéro de compte AT861904300235473202 . |
Écouter des événements
Configurez des webhooks afin qu’ils écoutent les événements de modification d’abonnement, tels que les mises à niveau et les annulations. En savoir plus sur les webhooks d’abonnement. Vous pouvez afficher les événements dans le Dashboard ou via l’interface de ligne de commande Stripe.
Pour en savoir plus, consultez la page Tester votre intégration Billing.
Mentionner le fonctionnement de Stripe à vos clients
Stripe recueille des informations sur les interactions des clients avec Elements afin de vous fournir des services, de prévenir la fraude et d’améliorer ses services. Cela inclut l’utilisation de cookies et d’adresses IP pour identifier les Elements qu’un client a vus au cours d’une même session Checkout. Vous êtes responsable de la divulgation et de l’obtention de tous les droits et consentements nécessaires pour que Stripe puisse utiliser les données à cette fin. Pour en savoir plus, visitez notre Centre de confidentialité.