Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.colismove.com/llms.txt

Use this file to discover all available pages before exploring further.

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()