Construire un checkout B2B
Créez une session liée à un acheteur, faites exécuter le parcours de paiement ou de crédit par Ormuz, puis confirmez la commande uniquement lorsque le checkout, la décision financière et les contrôles requis sont favorables, notamment les vérifications anti-fraude ou toute autre validation interne, externe ou réalisée par un partenaire.
Objectif métier
Une checkout_session représente une tentative de checkout pour une party et un contact acheteur. Elle porte le panier, les montants, les adresses, l’URL de retour et le processus qui décide comment le buyer peut régler sa commande.
Le checkout peut être initié dans un parcours en ligne, par exemple depuis un site e-commerce ou un portail B2B, mais aussi en magasin ou depuis un point de vente assisté. Dans tous les cas, la session conserve le même rôle : contextualiser l'acheteur et la transaction, exécuter les contrôles requis et produire une décision exploitable par le système qui porte la commande.
Le parcours peut aboutir à un paiement immédiat, une autorisation ou un crédit différé. Votre système conserve la maîtrise de la commande et de son fulfillment ; Ormuz fournit le résultat nécessaire pour prendre cette décision.
Prérequis
| Élément | Pourquoi il est requis |
|---|---|
| Marchand | Définit le périmètre du checkout et sa configuration. |
party | Représente l'acheteur B2B auquel la décision financière s'applique. |
party_contact | Identifie la personne qui accède au parcours utilisateur et agit pour la party. |
| Process launcher checkout | Associe les nouvelles sessions à une définition de processus checkout. Plusieurs launchers peuvent coexister pour le marchand. |
return_url | Ramène l’acheteur vers votre application après une redirection prévue par le parcours. |
La party et le party_contact doivent appartenir au même marchand, et le contact doit être rattaché à cette party. Si plusieurs launchers checkout sont actifs, transmettez explicitement leprocess_definition_id à utiliser lors de la création de la session.
Parcours cible
Le process checkout choisit la branche financière, produit une décision explicite puis finalise la session.
Créer la session
Votre backend transmet l’acheteur, son contact, le panier, les montants et l’URL de retour éventuelle.
Rediriger vers le parcours utilisateur si nécessaire
Si le process attend une action utilisateur, ouvrez l'URL contextualisée retournée avec la session. Sinon, laissez le process s'exécuter sans redirection et attendez le webhook de fin de checkout.
Décider du moyen de règlement
Le processus peut collecter un paiement, demander une autorisation ou évaluer une capacité de crédit.
Finaliser et synchroniser la commande
Le process fixe les deux statuts ; votre système relit la session ou traite son événement de complétion.
Créer la session
Appelez POST /v1/checkout/sessions depuis votre backend. Les trois montants sont requis, exprimés dans l'unité mineure de la devise, et doivent respecter amount_excluding_tax + amount_tax = amount_including_tax. La requête ne choisit pas un mode paiement ou crédit : le processus checkout porte cette décision et les capacités qu’il exécute.
POST /v1/checkout/sessions
Content-Type: application/json
{
"merchant_id": "mer_abc123",
"buyer_id": "pty_abc123",
"buyer_contact_id": "ptc_abc123",
"currency": "eur",
"amount_excluding_tax": 10000,
"amount_tax": 2000,
"amount_including_tax": 12000,
"return_url": "https://shop.example/orders/ORD-2026-104",
"source_reference": "ORD-2026-104",
"line_items": [
{
"line_type": "service",
"product_name": "Licence annuelle",
"quantity": 1,
"unit_amount_excluding_tax": 10000,
"unit_amount_including_tax": 12000,
"currency": "eur"
}
]
}{
"id": "cs_abc123",
"object": "checkout_session",
"status": "open",
"payment_status": "unpaid",
"merchant_id": "mer_abc123",
"buyer_id": "pty_abc123",
"buyer_contact_id": "ptc_abc123",
"process_instance_id": "pci_abc123",
"source_reference": "ORD-2026-104",
"currency": "eur",
"amount_including_tax": 12000,
"url": "https://hosted.example/access/..."
}Les line_items décrivent le panier au moment de la création. Ils peuvent représenter un produit, un service, une livraison, une remise ou des frais. Ils ne sont plus modifiables après la création de la session.
cs_* retourné. source_reference permet de retrouver la session à partir de votre numéro de commande, mais ne remplace pas à lui seul une stratégie anti-doublon lors de la création.Porter la décision financière dans le process
Le process reçoit la checkout_session comme objet d'entrée. Il peut lire ses lignes, son montant, sa party et son contact sans demander au concepteur de mapper des identifiants techniques.
| Branche | Capacités typiques | Résultat attendu |
|---|---|---|
| Paiement immédiat | Créer ou réutiliser un paiement PSP, collecter ou autoriser les fonds | paid ou authorized |
| Crédit différé | Évaluer la capacité disponible, appliquer les règles de risque, accorder le crédit | credit_granted |
| Refus | Refus provider, capacité insuffisante ou règle métier défavorable | failed |
Le node finalize_checkout_session permet de mettre à jour ensemble le résultat financier et le cycle de vie. Cette finalisation explicite évite de considérer la simple fin des écrans du parcours utilisateur comme une preuve de paiement.
Séparer parcours et résultat financier
Les deux axes de statut répondent à des questions différentes. status décrit le parcours ; payment_status décrit l'issue financière.
status | Signification |
|---|---|
open | La session est accessible et peut encore être complétée. |
completed | Le parcours s'est terminé avec succès. |
expired | La session a dépassé sa durée de validité. |
cancelled | La session a été explicitement annulée. |
payment_status | Signification |
|---|---|
unpaid | Aucun paiement ni crédit n'est encore accepté. |
paid | Un paiement immédiat a été collecté. |
authorized | Le paiement est autorisé, sous réserve de votre politique de capture. |
credit_granted | Le paiement différé a été accepté. |
failed | La tentative de paiement ou la décision de crédit a échoué. |
cancelled | La tentative financière a été annulée. |
status = completed et que payment_status vaut paid, authorized ou credit_granted.Une session completed + unpaid n'autorise pas la livraison. Inversement, credit_granted indique une décision favorable sans imposer le provider ou le mécanisme qui porte le risque.

Événements et suivi
| Événement | Utilisation |
|---|---|
checkout_session.created | Tracer la création et l'ouverture du parcours. |
checkout_session.completed | Relire les deux statuts et décider de confirmer la commande. |
checkout_session.expired | Fermer ou renouveler une tentative devenue inaccessible. |
checkout_session.abandoned | Déclencher une relance ou une analyse d'abandon tant que la session reste ouverte. |
Un parcours utilisateur n'est requis que si le processus comporte des actions utilisateur. Un checkout entièrement automatisé peut rester côté serveur : votre intégration attend alors le webhook checkout_session.completed, puis relit la session avant de mettre à jour la commande.
Après une redirection de succès, relisez également la session côté serveur. La redirection améliore l'expérience utilisateur ; l'API et les événements portent le résultat métier à utiliser pour votre commande.
Une session ouverte expire par défaut après 24 heures si vous ne fournissez pas expires_at. Vous pouvez aussi expirer explicitement une session ouverte avec POST /v1/checkout/sessions/:id/expire.
Checklist d'intégration
- Créer ou résoudre la party et le contact acheteur avant le checkout.
- Configurer au moins un launcher checkout actif et sélectionner explicitement le
process_definition_idlorsqu'il y en a plusieurs. - Envoyer des montants et des lignes cohérents dans une même devise.
- Stocker l'ID de session avec la commande source.
- Rediriger vers l'URL de parcours utilisateur retournée par Ormuz uniquement si le processus attend une action utilisateur.
- Pour un parcours automatisé, attendre le webhook de fin de checkout sans imposer de redirection.
- Finaliser explicitement
statusetpayment_statusdans le process. - Confirmer la commande avec la règle à deux axes, jamais avec
statusseul. - Traiter les webhooks de façon idempotente et relire la session avant fulfillment.
- Prévoir les cas de refus, d'annulation, d'expiration et d'abandon.