Aller au contenu principal

Flux de paiement de bout en bout

Un paiement se découpe en deux phases, plus un canal de retour parallèle dédié à l'expérience utilisateur. Comprendre quelle étape appartient à quelle phase, c'est ce qui sépare une intégration fiable d'une intégration qui « marche à peu près ».

Phase 1 — Initiation (synchrone)

Le client clique sur « Payer par virement bancaire » et se retrouve redirigé vers la page hébergée LodinPay. Tout se déroule au premier plan, dans la session active du client.

ÉtapeDeVersAction
1ClientPlateformeClic sur « Payer par virement bancaire »
2ModuleBDD commandesCréation de la commande à l'état PENDING
3ModuleConstruction du jeton de retour HMAC
4ModulePasserelle LodinPOST /rtp avec les en-têtes signés
5Passerelle LodinModuleRéponse { url, invoiceId }
6ModuleBDD commandesPersistance de l'invoiceId comme référence de la transaction
7ModuleClientRedirection HTTP 302 vers la page de paiement hébergée
8ClientPasserelle LodinChargement de la page de paiement hébergée
9Passerelle LodinBanqueDéclenchement de la SCA
10ClientBanqueAuthentification dans son application bancaire

À la fin de la phase 1, la commande existe chez vous à l'état PENDING et le client est dans le parcours d'authentification de sa banque.

Phase 2 — Confirmation (asynchrone)

La banque exécute le virement, Lodin constate le règlement, puis la passerelle notifie votre serveur hors-bande. Cette phase s'exécute indépendamment de la session navigateur du client — même si le client ferme son onglet, le webhook arrive quand même.

ÉtapeDeVersAction
11BanquePasserelle LodinSCT Inst exécuté
12Passerelle LodinModuleWebhook payment.succeeded (signé)
13ModuleVérification de la signature HMAC
14ModuleBDD commandesÉtat de la commande = PAID (idempotent)
15ModulePasserelle LodinRéponse HTTP 200 OK

Le webhook est le canal de confirmation faisant autorité. La phase 2 peut se terminer avant, pendant ou après le retour du client.

En parallèle : retour navigateur (UX uniquement)

En parallèle de la phase 2, Lodin redirige le client vers votre returnUrl. Ce canal existe uniquement pour que le client voie une page de confirmation.

ÉtapeDeVersAction
16Passerelle LodinClientRedirection navigateur vers returnUrl
17ClientModuleGET de la page de retour avec le jeton
18ModuleVérification du jeton, branchement selon l'état courant
Choix de conception critique

Le retour navigateur n'est pas fiable : le client peut fermer son onglet, perdre sa connexion ou se laisser distraire. Si l'état de votre commande dépendait de son retour, des paiements échoueraient silencieusement.

Le webhook fait foi, et il fonctionne indépendamment. Le canal de retour n'existe que pour afficher une page de confirmation au client.

Conséquences pour votre implémentation

  • L'état de la commande doit être accessible en écriture depuis les deux côtés. Le gestionnaire de webhook (en arrière-plan) et le gestionnaire de retour (au premier plan) peuvent arriver dans n'importe quel ordre. Quel que soit celui qui arrive en premier, l'autre doit voir un état cohérent.
  • Le gestionnaire de retour lit l'état, n'écrit jamais l'état du paiement. Son unique rôle est d'afficher la bonne interface en fonction de ce que le gestionnaire de webhook a déjà écrit (ou pas encore).
  • Soyez patient sur la page de retour. Si le webhook n'est pas encore arrivé, affichez une page « Traitement en cours… » qui interroge l'état pendant quelques secondes avant de trancher entre confirmation et nouvelle tentative. Ne renvoyez pas une erreur à T+0.
  • L'idempotence est obligatoire — voir la Spécification des webhooks.

Voir aussi