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
| Code | UX frontend | Backend |
|---|
requires_action | Stripe.js handleCardAction() | Pas de transition |
payment_intent_authentication_failure | Message rejet 3DS | Stay EN_ATTENTE_PAIEMENT |
requires_payment_method | Demander nouvelle carte | Stay 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énario | Webhook | Action backend |
|---|
| Sc 9 | payment_intent.succeeded (3DS OK) | → RESERVATION_PAYEE |
| Sc 11 | payment_intent.succeeded (replay) | Idempotent → RESERVATION_PAYEE |
| Sc 20 | account.updated | Disable/enable carrier annonces |
| Scénario | Endpoint Stripe SDK |
|---|
| Sc 19 | accounts.loginLinks.create() |
| Sc 6/16 | refunds.create() + transfers.createReversal() |