Comment ajouter des paiements à votre application : paiement, abonnements et webhooks
La façon la plus simple d'ajouter des paiements à votre app est Stripe : utilisez un lien de paiement si vous avez seulement besoin d'un bouton « Acheter » et que vous pouvez gérer les commandes manuellement; utilisez Stripe Checkout si votre app doit savoir qui a payé et réagir automatiquement; et utilisez Checkout en mode abonnement, avec le portail client de Stripe, pour la facturation récurrente. Dans tous les cas sauf le plus simple, vous avez aussi besoin d'un webhook — un point de terminaison sur votre serveur que Stripe appelle lorsqu'un paiement réussit — et vous devriez tout tester avec les clés de test et les cartes de test de Stripe avant de passer aux clés de production.
Ce guide explique chaque option, la partie webhook que la plupart des tutoriels passent sous silence, et ce qu'il faut vérifier avant d'encaisser de vrais paiements. Les détails sur Stripe proviennent de la documentation de Stripe en date de septembre 2026.
Pourquoi utiliser un fournisseur de paiement
Ne recueillez jamais les numéros de carte dans vos propres formulaires. Manipuler des données de carte brutes vous soumet aux exigences de la norme PCI DSS (la norme de sécurité de l'industrie des cartes de paiement) et constitue une responsabilité sérieuse. Un fournisseur de paiement comme Stripe héberge le formulaire de paiement, conserve la carte, gère l'authentification bancaire et indique à votre app le résultat. Votre app ne voit jamais que « le client X a payé pour Y ».
Ce guide utilise Stripe parce qu'il est très répandu, bien documenté et pris en charge par la plupart des outils de création d'apps par IA. D'autres fournisseurs existent, et certains agissent comme « marchand enregistré » : ils assument la gestion de la taxe de vente à votre place. Si la conformité fiscale vous préoccupe, ce modèle mérite d'être comparé.
Les trois façons d'accepter des paiements avec Stripe
| Option | Code requis | Votre app sait qui a payé? | Idéal pour |
|---|---|---|---|
| Liens de paiement | Aucun | Seulement si vous ajoutez un webhook | Vendre quelques produits fixes, dons, tester la demande |
| Checkout (paiement unique) | Code serveur pour créer une session | Oui, via webhook | Boutiques, téléchargements payants, achats ponctuels |
| Checkout (abonnement) | Code serveur et gestion des webhooks | Oui, via webhook | SaaS, adhésions, tout ce qui est récurrent |
Liens de paiement
Un lien de paiement est une page de paiement hébergée par Stripe que vous créez dans le tableau de bord de Stripe, sans code. Vous obtenez une URL que vous pouvez placer derrière un bouton de votre app, partager dans un courriel ou afficher sous forme de code QR. Selon la documentation de Stripe, les liens de paiement peuvent vendre un produit, un abonnement ou recevoir un don, et vous pouvez laisser le client choisir ce qu'il paie ou limiter le nombre d'achats.
Le hic : votre app ne sait pas automatiquement qu'un utilisateur connecté précis a payé. Pour une page de dons ou une petite boutique où vous traitez les commandes à la main à partir des courriels de notification de Stripe, c'est suffisant. Pour « payer pour débloquer les fonctionnalités Pro », ce ne l'est pas.
Stripe Checkout
Checkout est une page de paiement que votre serveur crée à la demande pour un achat précis. Votre serveur indique à Stripe ce qui est acheté (et, facultativement, quel client achète), Stripe renvoie une URL, et vous y envoyez le client. Selon la documentation de Stripe, Checkout prend en charge les paiements uniques et les abonnements, sous forme de page entièrement hébergée par Stripe, de page intégrée à votre site ou de formulaire intégré.
Le fonctionnement :
- Le client clique sur Acheter dans votre app.
- Votre serveur crée une session Checkout avec votre clé secrète, en incluant un identifiant qui la relie à votre utilisateur ou à votre commande.
- Le client est redirigé vers Stripe et paie.
- Stripe le redirige vers votre page de confirmation.
- Stripe envoie un événement
checkout.session.completedà votre webhook, et votre serveur marque la commande comme payée ou débloque l'accès.
L'étape 2 doit se dérouler sur le serveur, car elle utilise votre clé secrète. C'est la principale raison pour laquelle Checkout nécessite un backend.
Abonnements
Les abonnements utilisent Checkout en mode abonnement avec un prix récurrent que vous avez configuré dans Stripe. Le premier paiement fonctionne comme le parcours ci-dessus. Ensuite, les renouvellements, les cartes refusées, les changements de forfait en cours de cycle et les résiliations se produisent au fil du temps — souvent lorsque le client n'est plus dans votre app. Votre app n'en est donc informée que par les webhooks.
Pour permettre aux clients de gérer leur propre abonnement, Stripe offre un portail client hébergé. Selon la documentation de Stripe, les clients peuvent y mettre à jour leur mode de paiement et leurs coordonnées de facturation, changer ou résilier leur abonnement, et consulter et télécharger leurs factures. Vous le configurez dans le tableau de bord de Stripe et ajoutez un bouton « Gérer la facturation » qui envoie le client vers ce portail. Vous évitez ainsi de créer vous-même ces écrans.
Webhooks : l'élément qu'on ne peut pas sauter
Un webhook est une requête HTTP que Stripe envoie à votre serveur lorsqu'il se passe quelque chose. (Consultez ce qu'est un webhook pour l'idée générale.) Le guide de traitement de Stripe est explicite : vous ne pouvez pas vous fier uniquement à la page de confirmation pour exécuter les commandes, car un client peut payer puis perdre sa connexion avant le chargement de cette page. Pour les abonnements et les modes de paiement différés, les webhooks sont obligatoires.
Événements à gérer
| Événement | Ce qu'il signifie | Ce que fait votre app |
|---|---|---|
checkout.session.completed | Checkout est terminé | Marquer la commande comme payée ou ouvrir l'accès |
checkout.session.async_payment_succeeded | Un mode de paiement différé (comme un prélèvement bancaire) a été confirmé plus tard | Exécuter la commande maintenant |
checkout.session.async_payment_failed | Ce paiement différé a échoué | Informer le client; ne pas exécuter la commande |
invoice.paid | Un paiement d'abonnement a réussi, y compris les renouvellements | Prolonger l'accès |
invoice.payment_failed | Un renouvellement a échoué | Avertir l'utilisateur; Stripe peut réessayer |
customer.subscription.updated | Le forfait a changé, ou une résiliation est prévue | Mettre à jour le forfait de l'utilisateur |
customer.subscription.deleted | L'abonnement a pris fin | Retirer l'accès payant |
Règles pour un gestionnaire de webhook correct
Ces règles viennent directement de la documentation de Stripe sur les webhooks, et les gestionnaires générés par l'IA en oublient parfois une :
- Vérifiez la signature. Chaque événement comprend un en-tête
Stripe-Signature. Votre gestionnaire la vérifie avec le secret de signature du point de terminaison (il commence parwhsec_). Sans cela, n'importe qui pourrait envoyer un faux « paiement réussi » à votre serveur. - Utilisez le corps brut de la requête. La vérification de la signature échoue si votre cadre de travail analyse ou modifie le corps au préalable.
- Renvoyez rapidement une réponse 2xx, puis effectuez les tâches plus lentes. Les délais d'attente comptent comme des échecs.
- Gérez les doublons. Stripe peut livrer le même événement plus d'une fois. Enregistrez les identifiants d'événements traités, ou rendez l'exécution des commandes sans danger même si elle a lieu deux fois.
- Ne présumez pas de l'ordre. Stripe ne garantit pas que les événements arrivent dans l'ordre où ils se sont produits.
- Prévoyez les nouvelles tentatives. En mode production, Stripe réessaie les livraisons échouées pendant jusqu'à trois jours : une courte panne ne fait donc pas perdre de paiements, mais votre gestionnaire doit pouvoir traiter les événements en retard.
Les webhooks ont besoin d'une adresse HTTPS publique : ils ne fonctionnent donc en général qu'une fois votre app publiée (l'outil CLI de Stripe peut transmettre les événements à un ordinateur local pour les développeurs).
Une requête qui couvre tout le parcours
Ajoute un achat unique avec Stripe Checkout pour le « Pack Pro » (identifiant de prix dans STRIPE_PRICE_ID). Crée la session Checkout côté serveur avec STRIPE_SECRET_KEY depuis les secrets, et inclus l'identifiant de l'utilisateur connecté dans la session. Ajoute un point de terminaison POST /api/stripe/webhook qui vérifie la signature Stripe avec STRIPE_WEBHOOK_SECRET à partir du corps brut de la requête, gère checkout.session.completed et marque cet utilisateur comme ayant le Pack Pro. Assure-toi que le traitement reste sûr si le même événement arrive deux fois. Ajoute des pages de réussite et d'annulation. N'expose jamais la clé secrète au navigateur.
Pour les abonnements, ajoute : « Utilise le mode abonnement avec STRIPE_PRICE_ID. Gère invoice.paid, invoice.payment_failed, customer.subscription.updated et customer.subscription.deleted. Ajoute un bouton Gérer la facturation qui ouvre le portail client Stripe. »
Mode test
Stripe propose des environnements séparés de test (sandbox) et de production, avec des clés distinctes. Les clés de test commencent par pk_test_, sk_test_ ou rk_test_; les clés de production commencent par pk_live_, sk_live_ ou rk_live_. Les transactions de test ne déplacent aucun argent.
Cartes de test utiles tirées de la documentation de test de Stripe (n'importe quelle date d'expiration future, n'importe quel CVC à trois chiffres) :
| Numéro de carte | Résultat |
|---|---|
4242 4242 4242 4242 | Le paiement réussit |
4000 0000 0000 0002 | La carte est refusée |
4000 0000 0000 3220 | Authentification 3D Secure requise, puis réussite |
Testez au minimum :
- Un paiement réussi débloque la bonne chose pour le bon utilisateur
- Une carte refusée affiche un message clair et ne débloque rien
- Fermer l'onglet du navigateur juste après le paiement donne quand même accès (cela prouve que le webhook fonctionne, pas seulement la page de confirmation)
- Annuler sur la page de Stripe ramène l'utilisateur dans votre app sans rien facturer
- Pour les abonnements : résiliez dans le portail client et confirmez que l'accès prend fin au moment prévu
Mise en production
- Activez votre compte Stripe avec les renseignements de votre entreprise et de votre compte bancaire.
- Remplacez les clés de test par les clés de production dans les secrets de votre app. Stripe recommande des clés restreintes, avec seulement les autorisations dont votre intégration a besoin, plutôt qu'une clé secrète sans restriction.
- Créez un point de terminaison webhook de production qui pointe vers votre app publiée. Il a son propre secret de signature, différent de celui de test : mettez-le à jour.
- Recréez les produits et les prix en mode production : les identifiants du mode test n'existent pas là-bas.
- Effectuez un petit achat réel et remboursez-le.
Conservez chaque clé dans les secrets de votre projet, jamais dans le code ni dans le clavardage. Notre liste de contrôle de sécurité couvre plus en détail les clés et la vérification des webhooks.
Taxes, remboursements et formalités
Les paiements entraînent des obligations que le code ne règle pas. Ceci n'est pas un avis fiscal; consultez un comptable.
- Taxe de vente, TVA et TPS/TVQ. Selon l'endroit où vous et vos clients se trouvez, vous devrez peut-être vous inscrire, percevoir la taxe et la déclarer. Stripe Tax peut calculer et percevoir la taxe à la caisse, surveiller les endroits où vos ventes pourraient créer une obligation, et vous aider pour les inscriptions et les déclarations, mais la responsabilité vous revient. Les fournisseurs de type marchand enregistré sont une autre option, qui prend en charge une plus grande partie de ces tâches.
- Remboursements et litiges. Définissez votre politique de remboursement avant le lancement et publiez-la sur votre site. Les litiges (rétrofacturations) arrivent; conservez des dossiers de ce qui a été acheté et livré.
- Reçus et factures. Stripe peut envoyer les reçus par courriel; les entreprises peuvent avoir besoin de véritables factures.
- Frais. Chaque fournisseur facture des frais par transaction. Consultez la page de tarification actuelle du fournisseur plutôt que de vous fier aux chiffres des articles.
Quelle configuration convient à votre app
- Dons ou quelques produits : liens de paiement. Voir comment créer un site de dons pour un organisme sans but lucratif.
- Une boutique avec panier : Checkout avec articles et webhook. Voir comment créer une boutique en ligne.
- SaaS ou adhésions : Checkout en mode abonnement, webhooks et portail client. Voir comment créer un MVP SaaS et comment fixer le prix d'un produit SaaS.
- Une place de marché qui verse des sommes aux vendeurs : une configuration différente, plus encadrée (Stripe Connect ou équivalent). Prévoyez-la séparément.
Ajouter des paiements dans Mythex
Les paiements dans les apps que vous créez sur Mythex utilisent votre propre compte Stripe et vos propres clés; il n'existe pas de connexion Stripe en un clic pour votre app. Le déroulement habituel :
- Obtenez les clés de test de Stripe.
- Ajoutez
STRIPE_SECRET_KEY(et plus tard le secret du webhook) aux secrets du projet — par/secrets, dans les paramètres du projet, ou dans la carte des secrets que l'agent affiche lorsqu'il a besoin d'une clé. - Demandez à l'agent de créer Checkout avec une requête semblable à celle ci-dessus.
- Testez dans l'aperçu avec les cartes de test. Publiez avant d'enregistrer le webhook, puisqu'il a besoin de votre URL publique.
- Après être passé aux clés de production, publiez de nouveau pour que l'app en production les prenne en compte.
Consultez Accepter des paiements avec Stripe et Gérer les webhooks dans votre backend dans la documentation.
Questions
Quel est le moyen le plus simple d'accepter des paiements dans une app?
Un lien de paiement Stripe ne demande aucun code : vous le créez dans le tableau de bord Stripe et y menez un lien depuis votre app. Si votre app doit savoir qui a payé et débloquer quelque chose automatiquement, utilisez plutôt Stripe Checkout avec un webhook.
Ai-je besoin d'un webhook pour accepter des paiements?
Si votre app doit réagir à un paiement, par exemple débloquer un compte, marquer une commande comme payée ou gérer un renouvellement, oui. La documentation de Stripe précise qu'on ne peut pas se fier uniquement à la page de confirmation, car un client peut payer sans jamais l'atteindre. Les webhooks sont aussi obligatoires pour les abonnements.
Comment tester les paiements sans vraie somme d'argent?
Utilisez les clés d'API de test (sandbox) de Stripe et ses numéros de carte de test, comme 4242 4242 4242 4242 avec n'importe quelle date d'expiration future et n'importe quel CVC à trois chiffres. Les transactions de test ne déplacent aucun argent réel.
Stripe gère-t-il la TPS, la TVQ et la TVA à ma place?
Stripe Tax peut calculer et percevoir les taxes à la caisse et surveiller les endroits où vous pourriez devoir vous inscrire, mais vous restez responsable de vos obligations fiscales. Consultez un comptable pour votre situation.