Octobre rose : le dépistage précoce du cancer du sein sauve des vies. En savoir plus
React

Intégration de Stripe dans React : Guide complet

Guide complet pour intégrer Stripe dans une application React : configuration, formulaire de paiement, webhooks et mise en production.

25 septembre 2026 14 min de lecture 93 vues 0 partages

Introduction

Avec une croissance annuelle de 34 % dans l'e-commerce mondial, intégrer un système de paiement sécurisé et fiable est devenu une priorité absolue pour les développeurs d'applications web. Parmi les solutions disponibles, Stripe se distingue par son API élégante, sa documentation exhaustive et ses fonctionnalités avancées qui couvrent l'ensemble du cycle de vie d'un paiement en ligne.

Aujourd’hui, la demande pour des intégrations de paiement simples, performantes et conformes aux normes de sécurité (PCI DSS) est plus forte que jamais. Les utilisateurs attendent une expérience de paiement fluide, sans friction, directement intégrée dans l'interface de l'application. C'est précisément ce que permet la combinaison de Stripe et de React.

Dans ce guide complet, nous allons parcourir chaque étape de l'intégration de Stripe dans une application React : de l'installation des dépendances à la mise en production, en passant par la création d'un formulaire de paiement, la gestion avancée des erreurs, la sécurisation du backend et l'utilisation des webhooks. Que vous soyez développeur junior ou confirmé, ce tutoriel vous fournira toutes les clés pour réussir votre intégration.

Prérequis et préparation de l'environnement

Avant de plonger dans le code, assurez-vous de disposer des éléments suivants pour travailler dans les meilleures conditions.

Outils et versions recommandées

  • Node.js version 18 ou supérieure (LTS recommandé)
  • npm ou yarn comme gestionnaire de paquets
  • Une application React initialisée (via Create React App, Vite ou Next.js)
  • Un compte Stripe actif avec accès au tableau de bord
  • Un éditeur de code comme VS Code avec l'extension ESLint configurée

Création du compte Stripe

Rendez-vous sur dashboard.stripe.com et créez votre compte. Une fois connecté, accédez à la section Développeurs > Clés API. Vous y trouverez deux paires de clés :

  • Clé publique (Publishable key) : utilisée côté client pour initialiser Stripe dans le navigateur.
  • Clé secrète (Secret key) : utilisée exclusivement côté serveur pour créer des PaymentIntents et gérer les transactions.

Stripe propose un mode test qui simule les transactions sans effectuer de vrais débits. Utilisez toujours ce mode pendant le développement pour éviter tout incident financier.

Architecture recommandée

Pour une intégration sécurisée et conforme aux bonnes pratiques, adoptez une architecture client-serveur :

  • Frontend (React) : affiche le formulaire de paiement et collecte les informations de carte via les composants Stripe Elements.
  • Backend (Node.js / Express) : crée les PaymentIntents, gère les webhooks et communique avec l'API Stripe en utilisant la clé secrète.

Cette séparation est fondamentale : la clé secrète ne doit jamais être exposée côté client.

Installation et configuration de Stripe

Passons maintenant à l'installation des bibliothèques nécessaires et à la configuration initiale de votre projet.

Installation des dépendances côté client

Ouvrez votre terminal à la racine de votre projet React et exécutez la commande suivante :

npm install @stripe/react-stripe-js @stripe/stripe-js

Ces deux paquets remplissent des rôles distincts :

  • @stripe/stripe-js : charge le SDK Stripe.js de manière asynchrone et sécurisée.
  • @stripe/react-stripe-js : fournit des composants React prêts à l'emploi (Elements, CardElement, PaymentElement) pour construire votre formulaire.

Installation des dépendances côté serveur

Si vous utilisez Node.js avec Express pour votre backend, installez le SDK serveur de Stripe :

npm install stripe express cors dotenv

Le paquet dotenv vous permettra de charger vos variables d'environnement depuis un fichier .env, tandis que cors autorisera les requêtes cross-origin entre votre frontend et votre backend.

Configuration des variables d'environnement

Créez un fichier .env à la racine de votre projet React :

REACT_APP_STRIPE_PUBLIC_KEY=pk_test_votreClePublique

Puis un fichier .env à la racine de votre serveur backend :

STRIPE_SECRET_KEY=sk_test_votreCleSecrete
STRIPE_WEBHOOK_SECRET=whsec_votreSecretWebhook
PORT=4242
Ne commitez jamais vos fichiers .env dans votre dépôt Git. Ajoutez-les systématiquement à votre fichier .gitignore pour protéger vos clés API.

Mise en place du backend avec Express

Le backend joue un rôle central dans l'intégration de Stripe. C'est lui qui crée les PaymentIntents, ces objets qui représentent l'intention de collecter un paiement auprès d'un client.

Création du serveur Express

Voici la structure de base de votre serveur :

require('dotenv').config();
const express = require('express');
const cors = require('cors');
const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);

const app = express();
app.use(cors());
app.use(express.json());

app.post('/create-payment-intent', async (req, res) => {
  try {
    const { amount, currency } = req.body;

    const paymentIntent = await stripe.paymentIntents.create({
      amount: amount,
      currency: currency || 'eur',
      automatic_payment_methods: { enabled: true },
    });

    res.json({ clientSecret: paymentIntent.client_secret });
  } catch (error) {
    res.status(500).json({ error: error.message });
  }
});

const PORT = process.env.PORT || 4242;
app.listen(PORT, () => console.log(`Serveur démarré sur le port ${PORT}`));

Ce endpoint reçoit un montant (en centimes) et une devise, crée un PaymentIntent via l'API Stripe, puis renvoie le clientSecret au frontend. Ce secret est indispensable pour confirmer le paiement côté client.

Comprendre le PaymentIntent

Le PaymentIntent est l'objet central de l'API Stripe pour les paiements. Il suit un cycle de vie précis :

  1. created : le PaymentIntent est créé côté serveur.
  2. requires_payment_method : en attente des informations de paiement du client.
  3. requires_confirmation : les informations sont collectées, le paiement attend la confirmation.
  4. succeeded : le paiement a été traité avec succès.
  5. canceled ou requires_action : le paiement a été annulé ou nécessite une action supplémentaire (comme une authentification 3D Secure).

Comprendre ce cycle est essentiel pour gérer correctement les différents états de paiement dans votre interface.

Intégration des éléments de paiement dans React

Maintenant que le backend est en place, construisons le frontend. Les Stripe Elements sont des composants d'interface pré-construits, sécurisés et personnalisables qui gèrent la collecte des informations de carte.

Initialisation de Stripe dans React

Dans votre fichier principal (par exemple App.js ou App.tsx), chargez Stripe et encapsulez votre application dans le provider Elements :

import React, { useState, useEffect } from 'react';
import { loadStripe } from '@stripe/stripe-js';
import { Elements } from '@stripe/react-stripe-js';
import CheckoutForm from './CheckoutForm';

const stripePromise = loadStripe(process.env.REACT_APP_STRIPE_PUBLIC_KEY);

function App() {
  const [clientSecret, setClientSecret] = useState('');

  useEffect(() => {
    fetch('/create-payment-intent', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ amount: 1999, currency: 'eur' }),
    })
      .then((res) => res.json())
      .then((data) => setClientSecret(data.clientSecret));
  }, []);

  const options = {
    clientSecret,
    appearance: { theme: 'stripe' },
  };

  return (
    <div>
      {clientSecret && (
        <Elements stripe={stripePromise} options={options}>
          <CheckoutForm />
        </Elements>
      )}
    </div>
  );
}

export default App;

Remarquez que nous attendons d'avoir reçu le clientSecret du backend avant de rendre le composant Elements. Cela garantit que Stripe est correctement initialisé avant l'affichage du formulaire.

Création du composant CheckoutForm

Le composant CheckoutForm est le cœur de l'expérience de paiement. Voici une implémentation complète utilisant le PaymentElement, le composant le plus récent et le plus polyvalent de Stripe :

import React, { useState } from 'react';
import {
  PaymentElement,
  useStripe,
  useElements,
} from '@stripe/react-stripe-js';

export default function CheckoutForm() {
  const stripe = useStripe();
  const elements = useElements();
  const [message, setMessage] = useState(null);
  const [isLoading, setIsLoading] = useState(false);

  const handleSubmit = async (event) => {
    event.preventDefault();

    if (!stripe || !elements) {
      return;
    }

    setIsLoading(true);

    const { error } = await stripe.confirmPayment({
      elements,
      confirmParams: {
        return_url: 'https://votre-site.com/paiement-reussi',
      },
    });

    if (error) {
      if (error.type === 'card_error' || error.type === 'validation_error') {
        setMessage(error.message);
      } else {
        setMessage('Une erreur inattendue est survenue.');
      }
    }

    setIsLoading(false);
  };

  return (
    <form onSubmit={handleSubmit}>
      <PaymentElement />
      <button disabled={isLoading || !stripe || !elements}>
        {isLoading ? 'Traitement en cours...' : 'Payer maintenant'}
      </button>
      {message && <div>{message}</div>}
    </form>
  );
}

Ce composant gère plusieurs aspects importants :

  • État de chargement : le bouton est désactivé pendant le traitement pour éviter les doubles soumissions.
  • Gestion des erreurs : les messages d'erreur sont affichés directement à l'utilisateur.
  • Redirection : après un paiement réussi, l'utilisateur est redirigé vers une page de confirmation.

Différence entre CardElement et PaymentElement

Stripe propose deux approches pour collecter les paiements :

ComposantDescriptionCas d'utilisation
CardElementCollecte uniquement les informations de carte bancairePaiements par carte exclusivement
PaymentElementAffiche dynamiquement tous les moyens de paiement activésCartes, virements SEPA, Apple Pay, Google Pay

Aujourd’hui, il est fortement recommandé d'utiliser le PaymentElement pour offrir un maximum de flexibilité à vos utilisateurs et augmenter votre taux de conversion.

Gestion avancée des erreurs

Une gestion des erreurs robuste est indispensable pour offrir une expérience utilisateur de qualité et faciliter le débogage en production.

Types d'erreurs Stripe

L'API Stripe renvoie plusieurs catégories d'erreurs que vous devez traiter différemment :

  • card_error : carte refusée, fonds insuffisants, carte expirée. Affichez un message clair à l'utilisateur.
  • validation_error : champs du formulaire invalides (numéro de carte incomplet, CVC manquant).
  • api_error : problème côté Stripe. Invitez l'utilisateur à réessayer plus tard.
  • authentication_error : clé API invalide. Vérifiez votre configuration.
  • rate_limit_error : trop de requêtes envoyées. Implémentez un mécanisme de retry avec back-off exponentiel.

Implémentation d'un gestionnaire d'erreurs complet

Voici un utilitaire réutilisable pour centraliser la gestion des erreurs Stripe dans votre application :

export function handleStripeError(error) {
  const errorMessages = {
    card_error: {
      insufficient_funds: 'Fonds insuffisants. Veuillez utiliser une autre carte.',
      card_declined: 'Carte refusée. Contactez votre banque.',
      expired_card: 'Carte expirée. Veuillez mettre à jour vos informations.',
      incorrect_cvc: 'Code CVC incorrect. Vérifiez votre carte.',
      processing_error: 'Erreur de traitement. Réessayez dans quelques instants.',
    },
    validation_error: 'Veuillez vérifier les informations saisies.',
    api_error: 'Service temporairement indisponible. Réessayez plus tard.',
    rate_limit_error: 'Trop de tentatives. Patientez quelques secondes.',
  };

  if (error.type === 'card_error') {
    return errorMessages.card_error[error.code] || error.message;
  }

  return errorMessages[error.type] || 'Une erreur inattendue est survenue.';
}

Utilisez cette fonction dans votre composant CheckoutForm pour afficher des messages d'erreur localisés et compréhensibles par vos utilisateurs francophones.

Journalisation des erreurs

En production, ne vous contentez pas d'afficher les erreurs à l'utilisateur. Envoyez-les également vers un service de monitoring comme Sentry ou LogRocket pour identifier rapidement les problèmes récurrents :

import * as Sentry from '@sentry/react';

if (error) {
  Sentry.captureException(error);
  setMessage(handleStripeError(error));
}

Configuration des webhooks Stripe

Les webhooks sont un mécanisme essentiel qui permet à Stripe de notifier votre serveur en temps réel lorsqu'un événement se produit (paiement réussi, remboursement, litige, etc.).

Pourquoi les webhooks sont indispensables

Ne vous fiez jamais uniquement à la réponse côté client pour confirmer un paiement. Un utilisateur peut fermer son navigateur avant la redirection, ou une erreur réseau peut interrompre la communication. Les webhooks garantissent que votre serveur est informé de chaque événement de paiement, quelle que soit la situation côté client.

Implémentation d'un endpoint webhook

Ajoutez le code suivant à votre serveur Express :

const endpointSecret = process.env.STRIPE_WEBHOOK_SECRET;

app.post(
  '/webhook',
  express.raw({ type: 'application/json' }),
  (req, res) => {
    const sig = req.headers['stripe-signature'];
    let event;

    try {
      event = stripe.webhooks.constructEvent(req.body, sig, endpointSecret);
    } catch (err) {
      console.log(`Erreur de signature webhook : ${err.message}`);
      return res.status(400).send(`Webhook Error: ${err.message}`);
    }

    switch (event.type) {
      case 'payment_intent.succeeded':
        const paymentIntent = event.data.object;
        console.log(`Paiement réussi : ${paymentIntent.id}`);
        // Mettez à jour votre base de données ici
        break;
      case 'payment_intent.payment_failed':
        const failedPayment = event.data.object;
        console.log(`Paiement échoué : ${failedPayment.id}`);
        // Notifiez l'utilisateur par e-mail
        break;
      default:
        console.log(`Événement non géré : ${event.type}`);
    }

    res.json({ received: true });
  }
);
Attention : le endpoint webhook doit utiliser express.raw() au lieu de express.json() pour que la vérification de signature fonctionne correctement. Placez ce middleware avant les autres parseurs de body.

Tester les webhooks en local

Utilisez le CLI Stripe pour tester vos webhooks en local pendant le développement :

stripe listen --forward-to localhost:4242/webhook

Cette commande intercepte les événements de votre compte Stripe en mode test et les redirige vers votre serveur local.

Tests et passage en production

Tester minutieusement votre intégration avant le déploiement est une étape que vous ne devez jamais négliger.

Cartes de test Stripe

Stripe fournit une série de numéros de carte pour simuler différents scénarios :

Numéro de carteScénario simulé
4242 4242 4242 4242Paiement réussi
4000 0000 0000 9995Fonds insuffisants
4000 0000 0000 0002Carte refusée
4000 0027 6000 3184Authentification 3D Secure requise

Pour toutes ces cartes de test, utilisez une date d'expiration future quelconque et n'importe quel code CVC à trois chiffres.

Checklist de mise en production

Avant de passer en mode live, vérifiez systématiquement les points suivants :

  1. Remplacez les clés de test par les clés de production dans vos variables d'environnement.
  2. Activez le HTTPS sur votre domaine (obligatoire pour Stripe).
  3. Configurez vos webhooks de production dans le tableau de bord Stripe.
  4. Testez le flux complet de paiement avec une vraie carte (vous pouvez rembourser immédiatement).
  5. Vérifiez que votre gestion des erreurs fonctionne correctement pour chaque type d'erreur.
  6. Implémentez un mécanisme d'idempotence pour éviter les doubles débits en cas de retry réseau.

Pièges et erreurs courantes à éviter

Après avoir accompagné de nombreuses équipes dans l'intégration de Stripe, voici les erreurs les plus fréquentes et comment les éviter.

Erreurs de sécurité

  • Exposer la clé secrète côté client : c'est la faute la plus grave. La clé secrète ne doit exister que sur votre serveur.
  • Ne pas valider le montant côté serveur : un utilisateur malveillant peut modifier le montant envoyé depuis le frontend. Calculez toujours le montant à facturer côté serveur.
  • Ignorer la vérification de signature des webhooks : sans cette vérification, un attaquant pourrait envoyer de faux événements à votre endpoint.

Erreurs d'implémentation

  • Créer un nouveau PaymentIntent à chaque re-rendu : utilisez le hook useEffect avec un tableau de dépendances vide pour ne créer le PaymentIntent qu'une seule fois.
  • Ne pas gérer le mode 3D Secure : certaines cartes européennes exigent une authentification supplémentaire. Le PaymentElement gère cela automatiquement, mais assurez-vous que votre return_url est correcte.
  • Oublier de gérer les états de chargement : désactivez le bouton de soumission pendant le traitement pour éviter les doubles paiements.

Erreurs de conception

  • Ne pas afficher de feedback visuel : informez toujours l'utilisateur de l'état de son paiement (en cours, réussi, échoué).
  • Ignorer l'accessibilité : les composants Stripe Elements sont accessibles par défaut, mais assurez-vous que le reste de votre formulaire l'est également (labels, focus, messages d'erreur liés aux champs).

Conclusion

Intégrer Stripe dans une application React est un processus structuré qui, lorsqu'il est bien exécuté, offre une expérience de paiement fluide, sécurisée et professionnelle à vos utilisateurs. Ce guide vous a accompagné à travers chaque étape essentielle, de la configuration initiale au déploiement en production.

Voici les points essentiels à retenir :

  • Adoptez une architecture client-serveur pour séparer les responsabilités et protéger vos clés API.
  • Utilisez le PaymentElement pour prendre en charge tous les moyens de paiement modernes.
  • Implémentez une gestion des erreurs robuste avec des messages localisés en français.
  • Configurez les webhooks pour gérer les événements de paiement de manière fiable et asynchrone.
  • Testez exhaustivement avec les cartes de test Stripe avant chaque mise en production.
  • Surveillez vos paiements en production avec un outil de monitoring comme Sentry.

La documentation officielle de Stripe est régulièrement mise à jour et constitue une ressource précieuse pour approfondir chaque sujet abordé ici. Commencez par un projet simple, maîtrisez les fondamentaux, puis enrichissez progressivement votre intégration avec des fonctionnalités avancées comme les abonnements récurrents, les coupons de réduction ou les paiements en plusieurs fois.

#React #Stripe #Paiement

Partager cet article

Jordane YENO
Jordane YENO

Développeur web et mobile à Port-Gentil et Libreville. J'écris sur ce que je construis et ce que j'apprends.

En savoir plus
À lire ensuite

Articles similaires

Retour au blog