Simulateur GTE ⇄ Frontalien

chargement…
Refuser le prochain créneau du back GTE (409)

Simulateur GTE ──▶ Frontalien

Joue le rôle du back GTE : émet les requêtes partenaire sans le vrai back. Cible par défaut = l'API du simulateur (boucle locale) ; renseigner une URL pour viser une vraie sandbox Frontalien.

Accompagnement envoyé depuis le GTE

La réponse (order_id + payment_url) apparaît dans le journal ci-dessous.

Requêtes unitaires

Même cible que ci-dessus.

Journal des requêtes émises

Aucune requête émise par le simulateur GTE.

Simulateur Frontalien ──▶ GTE

Joue le rôle du prestataire : API partenaire qui reçoit les commandes (du vrai back GTE ou du volet ci-dessus), page Saferpay simulée, et webhooks signés vers le GTE.

Commandes reçues

Aucune commande — déclenche un payment-link (vrai back) ou utilise le volet GTE.

Webhook Frontalien → GTE (déclenchement manuel)

« Id de l'accompagnement » = order UUID ou booking id GTE (external_ref, résolu depuis les commandes connues). Une valeur inconnue part telle quelle — pratique pour tester la réaction du GTE.

Journal des webhooks envoyés

Aucun webhook émis.

Journal complet — requêtes GTE → Frontalien (payload · code HTTP · réponse)

Tous les appels vers l'API partenaire : du vrai back GTE back GTE ou du simulateur GTE simulateur GTE.

Aucun appel.

Référence du contrat

POST /partner/orders — requête envoyée par le GTE
{
  "external_ref": "<booking_id GTE>",
  "member": { "first_name": "…", "last_name": "…", "email": "…", "phone": "…",
              "address": { "line": "…", "postal_code": "…", "city": "…", "country": "FR" } },
  "slot_start": "2026-11-06T09:00:00+01:00",
  "amount": { "value": 12000, "currency": "CHF" },
  "line_items": [ { "label": "Base", "amount": 10000 }, { "label": "Option", "amount": 2000 } ],
  "return_url": "https://<front>/accompagnements/<id>/confirmation?payment=success&booking_id=…"
}
// en-têtes : Authorization: Bearer <clé> · Idempotency-Key: <booking_id>
POST /partner/orders — réponses attendues (201 / 409)
// 201
{ "order_id": "<uuid>", "status": "payment_pending",
  "slot_start": "…", "slot_end": "…",
  "hold_expires_at": "<création + 15 min>",
  "payment_url": "https://www.saferpay.com/vt/Pay?token=…" }
// 409 — créneau pris entre l'affichage et l'envoi
{ "error": "slot_unavailable" }
Enveloppe webhook (POST signé vers le GTE)
// en-tête : X-Taxflowpro-Signature: t=<unix>,v1=<hmac_sha256(secret, "{t}.{corps}")>
{ "id": "evt_…", "type": "payment.succeeded", "occurred_at": "…",
  "order_id": "<uuid>", "external_ref": "<booking_id>",
  "data": { "amount": 12000, "currency": "CHF", "slot_start": "…" } }
// le GTE : déduplique sur id · rejette t > 5 min · vérifie amount ≠ devis → pas de confirmation