---
title: "Automatiser les passeports numériques de produits avec les Webhooks — qr3.app Blog"
description: "Un passeport numérique de produit n"
canonical: "https://qr3.app/fr/blog/dpp-webhooks-automation/"
lang: "fr"
robots: "index,follow,max-image-preview:large,max-snippet:-1"
---

# Automatiser les passeports numériques de produits avec les Webhooks — qr3.app Blog

> Un passeport numérique de produit n

Canonical: <https://qr3.app/fr/blog/dpp-webhooks-automation/>

[← Blog](/fr/blog/) [Tutoriels](/fr/blog/category/tutorials/)

30 mai 2026 5 min de lecture [Tutoriels](/fr/blog/category/tutorials/) [dpp](/fr/blog/tag/dpp/)[webhooks](/fr/blog/tag/webhooks/)[automation](/fr/blog/tag/automation/)[qr-scanned](/fr/blog/tag/qr-scanned/)[sdk](/fr/blog/tag/sdk/)

# Automatiser les passeports numériques de produits avec les Webhooks

Un passeport numérique de produit n'est pas une page statique — chaque scan est un événement sur lequel vous pouvez bâtir. Réagissez à qr.scanned pour l'analytique, le réapprovisionnement et les alertes de rappel, gardez les données du passeport à jour depuis votre ERP, et vérifiez chaque charge utile avec HMAC-SHA256. Un guide de niveau développeur, avec du code.

par **QR3 Redaktion**

![Automatiser les passeports numériques de produits avec les Webhooks](https://qr3-blog-agent.meistern.workers.dev/cdn/blog/dpp-webhooks-automation/hero.png)

La plupart des équipes considèrent un passeport numérique de produit comme une page : vous le créez, vous imprimez le QR code, puis vous l'oubliez. Cela laisse de côté le signal le plus utile. Chaque fois que quelqu'un scanne le QR code d'un produit, il s'agit d'un **événement** — une personne réelle, dans un pays réel, tenant une unité réelle, à un moment réel. Reliez ces événements à votre stack et le passeport cesse d'être une page statique pour devenir le point d'entrée d'un pipeline d'automatisation. Ce guide montre comment s'abonner à `qr.scanned`, vérifier chaque charge utile et transformer les scans et les mises à jour en véritables workflows grâce au SDK qr3.

## Pourquoi un DPP est une source d'événements, et non une page statique

La valeur d'un passeport ne réside pas dans la page que le consommateur consulte une seule fois. Elle réside dans le flux d'interactions qui l'entourent : les scans sur le terrain, les changements de données issus de votre ERP, les transitions de cycle de vie. Chacun de ces éléments est quelque chose auquel vos systèmes peuvent réagir en temps réel.

Les Webhooks inversent le modèle de polling habituel. Au lieu de demander *« s'est-il passé quelque chose ? »* à intervalles réguliers, qr3 **vous** appelle dès que cela se produit. Les types d'événements émis par la plateforme incluent `qr.scanned`, ainsi que `qr.created`, `qr.updated` et `qr.deleted` pour les changements de cycle de vie. Celui que la plupart des équipes sous-exploitent est `qr.scanned` : il se déclenche lorsqu'un consommateur, un technicien ou un agent des douanes scanne réellement un produit sur le terrain.

Une charge utile `qr.scanned` transporte le contexte nécessaire pour agir — y compris le **pays** du scan et l'**identifiant dpp/code** qui indique quelle unité a été scannée. Cela suffit à piloter l'analytique, le réapprovisionnement et la logique de rappel sans intervention humaine.

## S'abonner à qr.scanned

Faites pointer un point de terminaison de Webhook vers votre service et traitez l'événement. Vérifiez la signature par rapport au corps brut avant de l'analyser :

```
import express from "express";
import { createHmac, timingSafeEqual } from "crypto";

const app = express();
const secret = process.env.QR3_WEBHOOK_SECRET!;

// Recompute the HMAC over the exact bytes qr3 signed and compare in constant time.
function verify(raw: Buffer, header: string | undefined): boolean {
  const expected = createHmac("sha256", secret).update(raw).digest("hex");
  const expectedBytes = Buffer.from(`sha256=${expected}`);
  const receivedBytes = Buffer.from(header ?? "");
  return (
    expectedBytes.length === receivedBytes.length &&
    timingSafeEqual(expectedBytes, receivedBytes)
  );
}

// Use the raw body so the signature matches the exact bytes qr3 signed.
app.post("/webhooks/qr3", express.raw({ type: "application/json" }), (req, res) => {
  if (!verify(req.body, req.headers["x-qr3-signature"] as string)) return res.sendStatus(401);
  const event = JSON.parse(req.body.toString("utf8"));

  if (event.type === "qr.scanned") {
    // event payload includes fields like the scan country and the dpp/code id
    handleScan(event);
  }

  res.sendStatus(200);
});
```

Le gestionnaire est volontairement minimaliste : vérifiez, branchez sur `event.type`, accusez réception rapidement avec un `200`. Effectuez le gros du travail (écritures analytiques, appels à l'ERP) de manière asynchrone afin qu'un service en aval lent ne bloque jamais l'accusé de réception.

## Vérifier les signatures (HMAC-SHA256) — faites-le toujours

Un point de terminaison de Webhook est une URL publique. Quiconque la trouve peut y envoyer une requête POST. Si vous faites confiance au corps sans vérifier qui l'a envoyé, un attaquant peut falsifier des « scans », déclencher de faux réapprovisionnements ou émettre de fausses alertes de rappel. **Vérifiez toujours la signature avant d'agir sur une charge utile.**

qr3 signe chaque webhook avec **HMAC-SHA256** sur le corps brut de la requête, en utilisant votre secret de point de terminaison. La signature arrive dans l'en-tête de requête `X-QR3-Signature`, sous la forme `sha256=` suivie du condensé hexadécimal. Recalculez le HMAC sur les mêmes octets et comparez les deux en temps constant ; s'ils diffèrent, rejetez la requête :

```
app.post("/webhooks/qr3", express.raw({ type: "application/json" }), (req, res) => {
  if (!verify(req.body, req.headers["x-qr3-signature"] as string)) {
    // signature mismatch → not from qr3 (or body was altered in transit)
    return res.sendStatus(401);
  }
  process(JSON.parse(req.body.toString("utf8")));
  res.sendStatus(200);
});
```

Trois règles pour garder ce mécanisme fiable :

- **Vérifiez sur les octets bruts.** Re-sérialiser le JSON peut réordonner les clés et modifier les espaces, ce qui casse le HMAC. Capturez le corps brut (ci-dessus, `express.raw`).

- **Gardez le secret secret.** Il vit dans votre environnement, jamais dans le code client ni dans un dépôt.

- **Échouez en mode fermé.** Pas de signature valide → `401`, aucun effet de bord. Ne « traitez jamais quand même » en cas de non-correspondance.

## Modèles : analytique / réapprovisionnement / rappel

Une fois que vous faites confiance à l'événement, une poignée de modèles couvrent l'essentiel de ce que veulent les équipes :

```
function handleScan(event: { type: string; data: { country?: string; dpp_id?: string } }) {
  // 1) Analytics — where and how often are products scanned?
  metrics.increment("dpp.scan", { country: event.data.country });

  // 2) Re-order — a scan can signal consumption or field activity
  if (event.data.country) maybeReplenish(event.data.dpp_id, event.data.country);

  // 3) Recall flag — scans of a flagged unit alert your team
  if (isRecalled(event.data.dpp_id)) alertRecall(event.data.dpp_id, event.data.country);
}
```

- **Analytique :** agrégez les scans par pays et par unité pour observer l'engagement réel — quels marchés scannent effectivement, et quelles références (SKU) connaissent le plus d'interactions après la vente.

- **Réapprovisionnement :** une vague de scans dans une région peut alimenter des signaux de demande ou déclencher des workflows de réassort dans votre ERP.

- **Rappel / sécurité :** si une unité fait l'objet d'un rappel, un scan est l'occasion d'atteindre la personne qui la détient — alertez votre équipe, ou affichez un avis sur le passeport lui-même.

Aucun de ces cas ne nécessite de polling ni de traitement par lot nocturne. Ils se produisent à l'instant même où le produit est scanné.

## Garder les données à jour via client.dpp.update

Réagir aux scans n'est que la moitié de la boucle ; l'autre moitié consiste à maintenir le passeport lui-même exact. Des réglementations telles que l'**ESPR (UE 2024/1781)** et le **règlement sur les batteries (UE 2023/1542)** exigent que les données du passeport reflètent la réalité tout au long de la vie du produit — empreinte carbone recalculée, instructions de réparation mises à jour, objectifs de contenu recyclé atteints.

Pilotez ces mises à jour depuis le système de référence. Lorsqu'une valeur change dans votre ERP, poussez-la vers le passeport :

```
import { QR3 } from "@qr3/sdk";

const client = new QR3({ apiKey: process.env.QR3_API_KEY! });

// GTIN and serial are immutable; data fields are updatable.
await client.dpp.update(dppId, {
  battery_data: { carbon_footprint_kg: 58, recycled_content_pct: 16 },
});
```

Comme le QR code encode une URL de résolveur stable (`https://qr3.app/dpp/{gtin}/{serial}`, ajoutez `?format=jsonld` pour du JSON-LD), vous n'avez jamais à réimprimer une étiquette pour modifier les données. L'identité reste fixe ; le contenu qui se trouve derrière reste à jour. Associez cela à `qr.updated` et vous pourrez diffuser une notification chaque fois qu'un passeport change — bouclant la boucle entre votre ERP, le passeport et toute personne qui observe en aval.

## Un tableau des événements : événement → quoi automatiser

| Événement | Se déclenche quand | Quoi automatiser |
| --- | --- | --- |
| `qr.scanned` | Un QR code produit est scanné sur le terrain | Analytique par pays, signaux de réapprovisionnement, alertes de rappel |
| `qr.created` | Un nouveau passeport est créé | L'indexer, le synchroniser avec le PIM/ERP, notifier l'équipe catalogue |
| `qr.updated` | Les données du passeport changent | Remettre en cache la page publique, diffuser des notifications de changement |
| `qr.deleted` | Un passeport est supprimé | Marquer les enregistrements internes comme supprimés, révoquer les références en aval |

Commencez par `qr.scanned` pour l'engagement et les signaux de terrain ; ajoutez les événements de cycle de vie au fur et à mesure que vous synchronisez les passeports dans vos systèmes plus larges.

## FAQ

**Dois-je vérifier la signature si l'URL de mon point de terminaison est secrète ?**
Oui. Une URL n'est pas un secret — elle fuite dans les journaux, les proxys et l'historique du navigateur. La vérification de l'HMAC `X-QR3-Signature` par rapport au corps brut est la seule chose qui prouve qu'une charge utile provient réellement de qr3.

**Que se passe-t-il si mon point de terminaison est hors service au moment où un événement se déclenche ?**
Accusez réception rapidement avec un `200` une fois la vérification effectuée, et effectuez les tâches lentes de manière asynchrone afin que des problèmes transitoires en aval ne bloquent jamais la réponse. Conservez votre propre idempotence sur l'**identifiant dpp/code** afin qu'une livraison réessayée ne soit pas comptée deux fois.

**Puis-je mettre à jour le GTIN ou le numéro de série via client.dpp.update ?**
Non — le GTIN et le numéro de série sont immuables ; ils constituent l'identité stable du produit. Seuls les champs de données sont modifiables. C'est précisément cette immuabilité qui permet au QR code imprimé de rester valide indéfiniment.

## Sources

- [UE ESPR — Règlement (UE) 2024/1781](https://eur-lex.europa.eu/eli/reg/2024/1781/oj)

- [Règlement européen sur les batteries 2023/1542](https://eur-lex.europa.eu/eli/reg/2023/1542/oj)

- [HMAC — RFC 2104](https://www.rfc-editor.org/rfc/rfc2104)

**Commencez gratuitement** et connectez votre premier Webhook DPP : [app.qr3.app/sign-up](https://app.qr3.app/sign-up)

## Articles liés

- [![](https://qr3-blog-agent.meistern.workers.dev/cdn/blog/gs1-resolver-test-suite-dpp-links/hero.png) Tutoriels Suite de tests du résolveur GS1 : vérifier la robustesse des DPP-Links avant la mise en production La suite de tests GS1 stable permet de tester le résolveur 1.2. Testez ainsi les redirections, les jeux de liens, CORS, les langues et les cas d’erreur avant la mise en production.](/fr/blog/gs1-resolver-test-suite-dpp-links/)
- [![](https://qr3-blog-agent.meistern.workers.dev/cdn/blog/dpp-battery-passport-2027-20260715/hero.png) Actualités du secteur BatteryPass-Ready lance un environnement de test pour le passeport numérique des batteries Le consortium BatteryPass-Ready a lancé le 24 juin 2026 un environnement de test public pour le passeport numérique des batteries, en prévision de l’obligation européenne à partir de février 2027.](/fr/blog/dpp-battery-passport-2027-20260715/)
- [![](https://qr3-blog-agent.meistern.workers.dev/cdn/blog/sector-20260713/hero.png) Actualités du secteur Passeport numérique de batterie 2027 : ce que les fabricants doivent savoir dès maintenant Webinaires, outils open source et nouvelles normes : le passeport européen des batteries prend de l’ampleur. État des lieux en juillet 2026 et questions ouvertes jusqu’en février 2027.](/fr/blog/sector-20260713/)
- [![](https://qr3-blog-agent.meistern.workers.dev/cdn/blog/sector-20260711/hero.png) Actualités du secteur Passeport numérique des batteries 2026 : environnements de test, normes et questions ouvertes Où en est l’industrie concernant le passeport numérique des batteries ? Tour d’horizon des environnements de test, des normes CEN/CENELEC, des outils open source et des orientations réglementaires en.](/fr/blog/sector-20260711/)

[← Tous les articles](/fr/blog/) [Démarrer gratuitement](https://app.qr3.app/sign-up)
