Aller au contenu principal

Notifications

Wino envoie une requête POST avec un corps JSON à votre URL :

{
"kind": "Variant",
"source": {
"shopId": "20258224-05f3-49a7-9299-fab4acb89ee5",
"deviceId": "b1fd5f30-a879-40a0-9a86-46804c16ed12"
},
"data": {
"id": "4e584c64-a377-4689-aa01-7fbd32f12a44",
"…": "the properties of the variant"
},
"clientState": "<a secret of yours>"
}
ChampDescription
kindLe type de données qui a changé : l'un des noms de settings. Il ne dit pas ce qui s'est passé (création, modification, archivage) : récupérez l'enregistrement pour voir son état actuel
source.shopIdLa boutique où le changement a eu lieu
source.deviceIdL'appareil d'où le changement est remonté. Pour les changements faits via l'API, c'est l'appareil Web de la boutique (slug W), pas votre appareil : il ne vous dit pas qui a fait le changement
dataL'enregistrement après le changement. Ses propriétés dépendent de kind et utilisent les noms de champs internes de Wino, pas toujours ceux de GraphQL. Ses dates sont des timestamps en millisecondes (GraphQL renvoie des dates ISO). data.id est toujours présent
clientStateLa valeur que vous avez définie sur l'abonnement

D'autres propriétés peuvent apparaître : ignorez celles que vous n'utilisez pas.

Recevoir les notifications​

  1. Répondez vite avec un statut 2xx. Wino attend 10 secondes au plus. Enregistrez la notification et traitez-la ensuite (une file d'attente, une tâche en arrière-plan).
  2. Vérifiez clientState par rapport au secret que vous avez défini, et ignorez les notifications qui ne correspondent pas.
  3. Utilisez HTTPS, et donnez l'URL finale. Si votre URL redirige (par exemple de http vers https), la notification arrive sous forme de GET sans corps.
  4. Récupérez les données actuelles avec l'API GraphQL à partir de data.id, plutôt que de vous fier uniquement à data : c'est le moyen le plus sûr d'obtenir aussi les enregistrements liés.
  5. Attendez-vous à des doublons et à n'importe quel ordre. Quand une livraison échoue (un statut d'erreur, ou pas de réponse sous 10 secondes), Wino renvoie la notification à chaque abonné de la boutique, et continue d'essayer pendant un moment : vous pouvez la recevoir à nouveau même après avoir répondu 2xx. Si votre URL continue d'échouer, Wino vous contacte par e-mail. Traitez deux fois la même notification sans dommage, par exemple en comparant data.updatedAt (en millisecondes) avec la dernière que vous avez traitée. Un mouvement de stock ne change jamais : ignorez un StockActivity dont vous avez déjà le data.id.
  6. Ne réécrivez pas ce que vous avez déjà. Vous êtes aussi notifié des changements que fait votre intégration. Avant de réécrire un changement dans Wino, comparez-le avec vos propres données, et ne faites rien s'il est identique : c'est ce qui évite les boucles (vous mettez à jour le stock, êtes notifié, le mettez à jour à nouveau…). Pour les mouvements de stock (StockActivity), data.deviceId est l'appareil avec lequel le mouvement a été enregistré : l'ID de votre appareil pour les mouvements que vous créez.

Dans ces récepteurs, WINO_CLIENT_STATE contient le clientState de votre abonnement. Ils refusent de fonctionner sans lui : sinon une requête sans clientState passerait la vérification. queue représente votre propre file d'attente ou système de tâches.

import express from "express";

const clientState = process.env.WINO_CLIENT_STATE;
if (!clientState) throw new Error("Set WINO_CLIENT_STATE before starting");

const app = express();
app.use(express.json({ limit: "5mb" })); // the default 100 kB is too small for some notifications

app.post("/wino-webhooks", (req, res) => {
const notification = req.body;
if (notification.clientState !== clientState) {
return res.sendStatus(401);
}
queue.push(notification); // your queue or job system: process it later, outside the request
res.sendStatus(200);
});

app.listen(3000);