Paiements
Comment le paiement est encaissé, comment connecter Stripe, et ce qu'il advient d'une commande à chaque étape.
Pour le pack Full Stack
Comment le paiement est encaissé
La boutique propose deux moyens de paiement : par carte via Stripe, et à la livraison. Il n'y a pas d'option PayPal au paiement. Les deux créent d'abord la commande sur l'API, au prix calculé par l'API à partir de son propre catalogue, jamais à partir des prix envoyés par le navigateur.
| Méthode | Ce qu'il advient de la commande |
|---|---|
| Carte (Stripe) | Enregistrée en pending et non payée. L'API demande un paiement à Stripe et la boutique confirme la carte sur la même page. Quand Stripe signale le paiement via le webhook, la commande passe en paid et confirmed ; une carte refusée la marque failed. |
| Paiement à la livraison | Enregistrée en confirmed et non payée, immédiatement. Vous encaissez l'argent à la livraison et faites avancer la commande dans le tableau de bord. |
Le paiement à la livraison est sélectionné par défaut. Les visiteurs sans compte peuvent payer avec leur e-mail ; les clients connectés retrouvent la commande dans leur compte.
La livraison est gratuite à partir de 75 $ et coûte 9,99 $ en dessous, et il n'y a pas de taxe. Le panier, le récapitulatif du paiement et l'API appliquent la même règle : le total que voit le client est donc le total débité. La boutique garde la règle dans storefront/src/config/shipping.ts et l'API dans back-end/src/modules/orders/orders.service.ts : modifiez les deux ensemble. Stripe débite en dollars américains.
Connecter Stripe
Ajoutez vos clés API
Depuis la page des clés API du tableau de bord Stripe, placez la clé secrète dans
back-end/.env. Utilisez les clés de test (sk_test_…) jusqu'à ce que vous soyez prêt à encaisser de l'argent réel.back-end/.envSTRIPE_SECRET_KEY=sk_test_…Abonnez le webhook
Dans Stripe, ajoutez un endpoint de webhook à l'adresse de votre API suivie de
/api/payments/webhook, abonné àpayment_intent.succeededetpayment_intent.payment_failed. Copiez son secret de signature dansback-end/.env.back-end/.envSTRIPE_WEBHOOK_SECRET=whsec_…Donnez à la boutique sa clé publiable
Définissez la clé publiable dans le
.envde la boutique, puis reconstruisez-la : la clé est compilée dans l'application. Avec Docker Compose, placez-la dans le.envà côté dedocker-compose.ymlet exécutezdocker compose up --build.storefront/.envNEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_test_…Redémarrez l'API
Résultat attendu: Le journal de l'API affiche « Stripe initialized », et le paiement affiche le formulaire de carte.
C'est le webhook qui marque la commande comme payée
Une commande est marquée payée quand Stripe appelle le webhook, pas quand le client revient du paiement. Sans l'abonnement et son secret de signature, les commandes par carte restent en attente et non payées.
Pour tester le webhook sur votre propre machine, la CLI Stripe peut transférer les événements vers http://localhost:8000/api/payments/webhook et affiche le secret de signature à utiliser pendant qu'elle tourne.
Sans Stripe
- Sans
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY, ou avec une valeur qui n'est pas une vraie clépk_test_…oupk_live_…, l'option carte du paiement affiche « Card payments are unavailable right now. Please choose cash on delivery. » et masque le champ de carte. - Sans
STRIPE_SECRET_KEY, ou avec la valeur fictive de.env.example, l'API n'encaisse aucun paiement par carte : une commande passée avec la carte est enregistrée en attente et non payée. - Le paiement à la livraison fonctionne dans tous les cas.
- Avec la boutique d'exemple, sans aucune API, le paiement aboutit sans appeler Stripe et rien n'est débité.
Encaisser de vrais paiements
- Passez aux clés live (
sk_live_…etpk_live_…) et à un webhook créé en mode live, qui a son propre secret de signature. - Définissez
NEXT_PUBLIC_DEMO_CHECKOUT=false, pour que le paiement ne soit pas prérempli avec un acheteur généré. - Les prix sont débités en dollars américains. Pour vendre dans une autre devise, changez la devise que l'API envoie à Stripe dans
back-end/src/modules/payments/payments.service.ts, et réglezNEXT_PUBLIC_ANALYTICS_CURRENCYen conséquence.