Skip to main content
Six scénarios couvrent la chaîne de paiement Stripe Connect, l’authentification forte 3DS DSP2, la vérification KYC et le wallet carrier.

Sc 8 — Pays non supporté côté transporteur

Si le carrier appartient à un pays non whitelisté côté Stripe Connect, l’onboarding est bloqué dès la création de l’annonce. Référence : commit a783274

Sc 9 — Carte refusée 3DS DSP2

Authentification forte (Strong Customer Authentication) requise par PSD2. Le frontend doit gérer 3 codes Stripe :

Codes Stripe gérés

CodeUX frontendBackend
requires_actionStripe.js handleCardAction()Pas de transition
payment_intent_authentication_failureMessage rejet 3DSStay EN_ATTENTE_PAIEMENT
requires_payment_methodDemander nouvelle carteStay EN_ATTENTE_PAIEMENT

Idempotence

Webhook payment_intent.succeeded protégé par clé idempotency stockée dans processed_webhook_events (table dédiée). Référence : commit d6ccab9

Sc 10 — Cumul LCB-FT silencieux → Stripe Identity (Pivot Flynanga)

Décision archi explicite (ADR 2026-05-01-pivot-flynanga-stripe-identity.md) : drop Didit V2, bascule sur Stripe Identity quand le seuil LCB-FT est atteint.

Migration

  • Compteur mensuel via UtilisateurLcbftJpaEntity (5 colonnes + id, @DynamicUpdate, table partagée utilisateur ADR-008)
  • V16 migration LCB-FT déployée
  • Webhooks Stripe Identity configurés
  • Statut runbook : runbooks/2026-05-01-rollout-didit-disabled-lcbft.md ready

Sc 11 — Webhook perdu / reconciliation cron

Si un webhook Stripe est perdu (réseau, downtime), un scheduler répare l’incohérence en interrogeant l’API Stripe directement.

Logique

  • Lookup JPQL : findStaleEnAttentePaiement(cutoff)
  • Replay idempotent (clé event Stripe ne re-déclenche pas)
  • 6 tests Mockito (zero, succeeded+LCB-FT, requires_capture, processing skip, déjà reconcilié, continue après failure)
  • PaymentLog enregistré avec source stripe-cron
Référence : commit d0de512

Sc 19 — Wallet transporteur (Stripe Express direct)

Plutôt que de maintenir un dashboard wallet custom, ColisMove redirige le carrier directement vers le Stripe Express dashboard (solde, payouts, fiscal docs natifs).

Avantages

  • Solde, payouts, fiscal docs natifs Stripe
  • Zéro maintenance ColisMove
  • Conforme PSD2 (Stripe gère)
Référence : commit 4e873f4

Sc 20 — Compte transporteur Stripe fermé

Si Stripe désactive un compte carrier (suspension, fraude), le webhook account.updated détecte la transition chargesEnabled: true → false et bloque les nouvelles réservations.

Logique technique

  • StripeAccountStatusChangedEvent shared-domain (factories disabled / reactivated)
  • Détection idempotente via prior chargesEnabled lookup
  • Carrier gate dans ReservationService.creer lève TransporteurIndisponibleException HTTP 422
  • 16e champ AnnonceSnapshot.createurStripeChargesEnabled
  • 7 tests Mockito (5 transitions service + 2 carrier gate)
Référence : commit 2216fd0

Récap effets Stripe

ScénarioWebhookAction backend
Sc 9payment_intent.succeeded (3DS OK)→ RESERVATION_PAYEE
Sc 11payment_intent.succeeded (replay)Idempotent → RESERVATION_PAYEE
Sc 20account.updatedDisable/enable carrier annonces
ScénarioEndpoint Stripe SDK
Sc 19accounts.loginLinks.create()
Sc 6/16refunds.create() + transfers.createReversal()