Comment intégrer une API de paiement ?
Intégrer une API de paiement est une tâche technique qui nécessite rigueur et méthode. Une mauvaise intégration peut entraîner des transactions perdues, des failles de sécurité ou une mauvaise expérience utilisateur. Ce guide couvre les étapes clés et les bonnes pratiques.
Avant de commencer : choisir son mode d'intégration
Il existe trois grandes approches d'intégration d'une API de paiement, avec des niveaux de complexité et de responsabilité PCI-DSS très différents :
| Mode | Complexité | PCI-DSS | Expérience UX |
|---|---|---|---|
| Redirection (hosted page) | Faible | SAQ A (minimale) | Redirection visible |
| Hosted fields / iFrame | Moyenne | SAQ A-EP | Transparente |
| API directe (server-to-server) | Élevée | SAQ D / PCI Level 1 | Totale maîtrise |
Pour la grande majorité des e-commerçants, l'approche hosted fields (comme Stripe.js ou Adyen Web Components) offre le meilleur compromis : expérience client transparente avec une responsabilité PCI-DSS limitée.
Les étapes d'une intégration API
1. Créer et configurer son compte PSP
Avant toute ligne de code, créez votre compte sandbox (test) chez votre PSP. Récupérez vos clés API : une clé publique (utilisée côté client pour initialiser le formulaire) et une clé secrète (utilisée côté serveur pour créer les paiements). Ne confondez jamais les deux — la clé secrète ne doit jamais apparaître dans votre code front-end.
2. Initialiser le formulaire de paiement côté client
Intégrez le SDK JavaScript du PSP (Stripe.js, Adyen Web, Mollie Components) dans votre page de paiement. Ce SDK va créer les champs de carte sécurisés (iFrames). Exemple avec Stripe :
- Charger
stripe.jsdepuis le CDN officiel (jamais en local pour garantir la conformité PCI). - Initialiser Stripe avec votre clé publique.
- Monter les éléments de carte dans vos conteneurs HTML.
- Gérer les événements
changepour afficher les erreurs en temps réel.
3. Créer le PaymentIntent côté serveur
Quand l'utilisateur soumet le formulaire, votre serveur doit d'abord créer un objet de paiement (PaymentIntent chez Stripe, PaymentSession chez Adyen) avec le montant, la devise et les métadonnées de la commande. Cet objet retourne un client_secret qui sera utilisé côté client pour confirmer le paiement.
Cette étape côté serveur est critique pour la sécurité : le montant doit toujours être défini côté serveur, jamais côté client où il pourrait être manipulé.
4. Confirmer le paiement côté client
Utilisez le client_secret reçu du serveur pour appeler stripe.confirmPayment() ou l'équivalent. Le SDK gère automatiquement l'authentification 3DS2 si elle est requise par la banque de l'acheteur.
5. Gérer les webhooks
Les webhooks sont des notifications HTTP envoyées par le PSP à votre serveur en cas d'événements asynchrones : paiement réussi, remboursement, chargeback, abonnement renouvelé. C'est le mécanisme le plus fiable pour mettre à jour l'état de vos commandes — ne vous fiez pas uniquement à la redirection après paiement, qui peut échouer (fermeture de navigateur, timeout).
Bonnes pratiques webhooks :
- Vérifiez toujours la signature du webhook (chaque PSP fournit un secret de signature).
- Répondez immédiatement avec un HTTP 200 avant de traiter l'événement (évite les timeouts).
- Rendez votre handler idempotent : un même événement peut être reçu plusieurs fois.
- Loggez tous les événements pour faciliter le débogage.
6. Tester exhaustivement avant la mise en production
Chaque PSP fournit des numéros de carte de test pour simuler différents scénarios : paiement réussi, décliné, nécessitant 3DS2, carte expirée. Testez au minimum :
- Paiement accepté nominalement
- Paiement décliné (fonds insuffisants, carte invalide)
- Authentification 3DS2 requise
- Remboursement total et partiel
- Webhook de confirmation reçu correctement
Sécurité : ce qui ne se négocie pas
- HTTPS obligatoire sur toutes les pages du tunnel de paiement — et idéalement sur tout votre site.
- Ne jamais stocker les données de carte sur vos serveurs. Utilisez la tokenisation fournie par votre PSP.
- Content Security Policy (CSP) : bloquez les scripts non autorisés qui pourraient intercepter les données de carte (attaques Magecart).
- Validation côté serveur de tous les montants et données de commande.
Questions fréquentes
Combien de temps faut-il pour intégrer une API de paiement ?
Une intégration basique en hosted fields (Stripe Checkout ou Stripe Elements) peut être faite en 1 à 2 jours par un développeur expérimenté. Une intégration complète avec gestion des remboursements, webhooks, abonnements et tests prend généralement 1 à 3 semaines.
Faut-il être certifié PCI-DSS pour intégrer une API de paiement ?
En mode hosted fields ou redirection, vous relevez du SAQ A (le niveau le plus simple) qui requiert un questionnaire d'auto-évaluation annuel mais aucun audit externe. En mode API directe (les données de carte passent par vos serveurs), vous devez être certifié PCI-DSS niveau 1 ou 2 selon votre volume — c'est coûteux et complexe, à réserver aux cas où c'est vraiment nécessaire.
Articles liés :