Passer à la V1
- Adaptez le récepteur pour vérifier
EatNow-Signature(voir Vérifier la signature) et lire le corps V1 :typeau lieu deevent,data.object(la réservation de l’API partenaire :party_size,start_at…) au lieu dedata.reservation,data.previous_attributes(les seuls champs modifiés) au lieu deprevious_data. Le secret ne change pas. - Dans Paramètres → Intégrations → Webhooks, cliquez sur Passer au V1 sur le webhook. Ce changement est définitif.
- Les livraisons déjà présentes dans le journal gardent leur corps et leur signature à l’ancien format, renvois compris ; tout ce qui est publié ensuite est en V1.
En-têtes
Les en-têtes personnalisés de la configuration sont appliqués en premier ; ceux
ci-dessus le sont ensuite et l’emportent toujours (noms comparés sans tenir
compte de la casse) : un en-tête personnalisé ne peut pas les remplacer. Tout
en-tête personnalisé dont le nom commence par
X-EatNow- est ignoré. La
signature porte sur le corps brut uniquement, sans préfixer le timestamp de
l’en-tête.
Payload
Exemple de création avec des identifiants et dates illustratifs :
La réservation contient toujours
id, restaurantId, status, group_size,
reservation_date, reservation_time, created_at, updated_at, source,
tags et metadata (qui peut valoir null). Ce format diffère de l’API
partenaire : group_size et date/heure séparées remplacent party_size et
start_at.
reservation_date représente le jour de service du restaurant, normalement
sérialisé à minuit ISO. Conservez sa partie YYYY-MM-DD ; ne convertissez pas
ce minuit UTC vers un autre fuseau pour en déduire le jour. reservation_time
est une heure locale HH:mm. Ne traitez pas cette paire comme un instant UTC.
created_at, updated_at et timestamp sont des instants UTC.
Les champs facultatifs dépendent de la réservation :
customer: identifiant,external_idnullable, nom et coordonnées/langue disponibles.tables: objetsidetname, sans salle imbriquée.room:idetnamemultilingue, pas une simple chaîne.waiter:idetname.payments:id,amount,currency,status,provider,provider_idfacultatif etcreated_at.custom_message,allergiesettotal_amount_paid: omis lorsqu’ils sont vides ou à zéro par le transformateur actuel. Une absence ne signifie pas « inchangé ».
total_amount_paid et
payments[].amount sont des entiers en centimes (5000 = 50,00 dans la devise
du paiement). Divisez par 100 pour les afficher.
previous_data accompagne la plupart des modifications. Pour une action d’une
équipe, un appel partenaire ou un automatisme, c’est la réservation complète
avant le changement. Pour un changement venu d’une caisse (NowOS), il porte les
champs propres de la réservation avant le changement (statut, date, heure,
couverts…) avec les relations actuelles (client, tables, salle).
shift: peut apparaître dans le test ; les événements ordinaires l’omettent actuellement. N’exigez pas ce champ.
Vérifier la signature
Calculez HMAC-SHA256 sur les octets exacts reçus, avec le secret du webhook. Rejetez une signature absente ou malformée, puis comparez les condensats en temps constant. Décodez le JSON uniquement après vérification : le reconstruire peut modifier les espaces ou l’ordre des champs et invalider une signature légitime.- Node.js
- Python
- PHP
Exemple de récepteur Express
Enregistrez la fonction Node.js dansverify-signature.js. Déclarez la route
avec corps brut avant tout middleware express.json(). Cet exemple vérifie
et journalise uniquement les identifiants : remplacez ce traitement de
démonstration par votre traitement métier avant d’acquitter un événement en
production. Chargez le secret depuis un stockage serveur sécurisé, sans le
committer.
