Files
MaksTinyWorkshop 9b7af9f1b0 Refonte Structure
2026-03-25 08:34:19 +01:00

3.8 KiB

Backend — Risques & vigilance : Stripe

Extrait de la base de connaissance Lead_tech. Voir knowledge/backend/risques/README.md pour l'index complet.


Stripe (v17+) : confusion billing_cycle_anchor vs current_period_end

Risques

  • Stocker une date de fin de période incorrecte en DB (bug silencieux)
  • État d'abonnement incohérent (UI, relances, accès premium)

Symptômes

  • currentPeriodEnd correspond à une date "bizarre" (souvent proche de la création), ou à un jour du mois
  • Des accès premium expirent trop tôt / trop tard

Bonnes pratiques / mitigations

  • Ne jamais interpréter billing_cycle_anchor comme une date de fin de période
  • Utiliser subscription.current_period_end (timestamp) pour la fin de période courante
  • Ajouter un test sur un événement webhook/Subscription qui vérifie la date persistée

Stripe list() sans gestion de has_more

Risques

  • Pagination tronquée silencieusement
  • Réconciliation incomplète d'abonnements, achats ou moyens de paiement
  • Décisions métier prises sur un jeu de données partiel

Symptômes

  • Comportement correct sur petits comptes mais faux sur comptes plus chargés
  • Premiers éléments traités, les suivants ignorés
  • Absence de boucle de pagination ou d'auto-pagination

Bonnes pratiques / mitigations

  • Traiter explicitement has_more
  • Utiliser l'auto-pagination Stripe si adaptée
  • Tester au moins un cas avec plusieurs pages de résultats
  • Contexte technique : Stripe API — 10-03-2026

Concurrence entre activation locale et webhook sur transition trial → payant

Risques

  • Double création ou double attachement d'une ressource unique
  • Conflit P2002
  • État local différent de l'état Stripe pendant la transition

Symptômes

  • La transition fonctionne parfois, puis échoue aléatoirement
  • Un webhook Stripe et une action applicative écrivent la même mutation métier
  • Erreurs d'unicité lors de l'activation payante

Bonnes pratiques / mitigations

  • Définir une seule source autorisée pour chaque transition d'état
  • Rendre les écritures idempotentes
  • Sérialiser ou réconcilier explicitement les transitions pilotées à la fois par action utilisateur et webhook
  • Contexte technique : Stripe / Prisma / trial subscription — 10-03-2026

Non-idempotence sur opérations sensibles

Risques

  • Doubles paiements / doubles créations
  • Webhooks rejoués qui cassent l'état

Symptômes

  • Doublons de lignes en DB
  • Actions exécutées 2 fois après timeout/retry
  • Incidents difficiles à reproduire

Bonnes pratiques / mitigations

  • Idempotency key sur endpoints critiques
  • Protection anti-doublon côté DB (contraintes uniques)
  • Comportement défini en cas de retry

Webhooks entrants — répondre 200 pendant processing (event perdu)

Risques

  • Le provider (Stripe, etc.) arrête ses retries après un 2xx, même si le premier worker a échoué
  • Event non appliqué mais marqué "traité" → état incohérent silencieux

Symptômes

  • Webhook reçu, 200 retourné, mais l'état en base n'est pas mis à jour
  • Aucun retry du provider → impossible à détecter sans monitoring actif

Bonnes pratiques / mitigations

  • Lock DB (WebhookEvent) avec machine d'état : pendingprocessingprocessed / failed
  • Si processing détecté (concurrent) : attendre brièvement la transition processed, sinon répondre non-2xx (force retry provider)
  • Ne jamais passer à processed sans preuve d'un traitement effectif
  • Contexte technique : Stripe / NestJS — 09-03-2026