Quand j'ai lancé Jokair, je voulais que chaque client puisse payer comme il le souhaite : carte bancaire, PayPal ou crypto. Le problème, c'est que chaque système a sa propre logique, ses propres callbacks et ses propres délais de confirmation.
Le problème
Stripe fonctionne avec des webhooks, PayPal avec des IPN/captures, et la crypto nécessite une confirmation on-chain. Unifier tout ça dans un seul flux de checkout sans perdre de commande, c'est un vrai défi technique.
Ma solution
J'ai créé une couche d'abstraction côté backend qui normalise les événements de paiement. Chaque provider (Stripe, PayPal, crypto) envoie ses notifications à un endpoint dédié, mais tous convergent vers la même logique de validation de commande.
Pour la crypto sans KYC, j'utilise ethers.js côté front pour connecter MetaMask ou Phantom. Le backend vérifie la transaction on-chain via un provider RPC avant de valider la commande.
Les pièges à éviter
- Les doubles webhooks Stripe : il faut rendre les handlers idempotents, sinon une commande peut être traitée deux fois.
- Les annulations PayPal : un paiement peut être autorisé mais jamais capturé. Il faut un cron qui nettoie les commandes en attente.
- Les confirmations crypto lentes : sur Ethereum, 12 confirmations c'est long. J'affiche un statut "en attente" et je notifie le client par email une fois confirmé.
Résultat
Aujourd'hui, le checkout Jokair accepte les trois modes de paiement. Le taux de conversion a augmenté parce que chaque client trouve son mode de paiement préféré. Et côté dev, la couche d'abstraction rend trivial l'ajout d'un nouveau provider.