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