> ## Documentation Index
> Fetch the complete documentation index at: https://docs.komerza.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Livraison dynamique

> Créez des workflows de traitement personnalisés en gérant la livraison des produits par programmation via des webhooks

## Aperçu

La livraison dynamique vous permet de gérer par programmation l'exécution des produits en implémentant un endpoint webhook qui reçoit les informations de commande et renvoie le contenu de livraison. Idéal pour livrer des produits numériques, des clés de licence, des codes de jeux ou pour intégrer des systèmes d'exécution externes.

Lorsqu'un client achète un produit avec la livraison dynamique activée, Komerza envoie immédiatement une requête POST à votre URL webhook configurée avec les détails de la commande, et votre endpoint répond avec le contenu à livrer au client.

<Note>
  La livraison dynamique est configurée par variante de produit dans les
  paramètres de votre produit, sous les méthodes de livraison.
</Note>

## Cas d'utilisation

<CardGroup cols={2}>
  <Card title="Produits numériques" icon="file-code">
    Livrez des clés de licence, des liens de téléchargement ou des codes d'accès en temps réel
  </Card>

  {" "}

  <Card title="Intégration tierce" icon="puzzle-piece">
    Connectez-vous à des systèmes d'exécution externes ou de gestion des stocks
  </Card>

  {" "}

  <Card title="Logique personnalisée" icon="diagram-project">
    Implémentez des règles de livraison complexes basées sur le client, le produit
    ou les données de commande
  </Card>

  <Card title="Codes de jeux" icon="gamepad">
    Livrez automatiquement des clés de jeux, codes d'activation ou objets in-game
  </Card>
</CardGroup>

## Comment ça fonctionne

1. **Le client achète** - Un client finalise le paiement pour un produit avec la livraison dynamique activée
2. **Webhook déclenché** - Komerza envoie une requête POST à votre URL webhook configurée
3. **Votre réponse** - Votre endpoint traite la requête et renvoie le contenu de livraison
4. **Le client reçoit** - Le contenu renvoyé est livré au client en texte brut

## Configuration

### Configurer la livraison dynamique

1. Naviguez vers votre produit dans le tableau de bord Komerza
2. Sélectionnez la variante à configurer
3. Choisissez **Livraison dynamique** comme méthode de livraison
4. Saisissez l'URL de votre endpoint webhook
5. Générez et sauvegardez votre secret webhook

<Warning>
  Gardez votre secret webhook sécurisé. Il est utilisé pour vérifier que les
  requêtes proviennent bien de Komerza.
</Warning>

## Requête webhook

### En-têtes de requête

```
Content-Type: application/json
Accept: application/json
User-Agent: Komerza/1.0
X-Signature: <HMAC-SHA256-SIGNATURE>
```

### Vérification de la signature

Toutes les requêtes webhook incluent un en-tête `X-Signature` contenant une signature HMAC SHA256. Vous devriez vérifier cette signature pour vous assurer que la requête provient de Komerza.

**Calcul de la signature :**

```
HMAC-SHA256(secret, request_body) -> encodé en HEX
```

<CodeGroup>
  ```javascript Node.js theme={null}
  const crypto = require("crypto");

  function verifySignature(secret, body, signature) {
    const calculatedSignature = crypto
      .createHmac("sha256", secret)
      .update(body)
      .digest("hex")
      .toUpperCase();

    return calculatedSignature === signature.toUpperCase();
  }

  app.use("/webhook", express.raw({ type: "application/json" }));

  app.post("/webhook", (req, res) => {
    const signature = req.headers["x-signature"];
    const body = req.body.toString("utf8");

    if (!verifySignature(process.env.WEBHOOK_SECRET, body, signature)) {
      return res.status(401).send("Signature invalide");
    }

    // Traiter le webhook...
  });
  ```

  ```python Python theme={null}
  import hmac
  import hashlib

  def verify_signature(secret: str, body: str, signature: str) -> bool:
      calculated_signature = hmac.new(
          secret.encode('utf-8'),
          body.encode('utf-8'),
          hashlib.sha256
      ).hexdigest().upper()

      return calculated_signature.upper() == signature.upper()
  ```

  ```php PHP theme={null}
  <?php

  function verifySignature($secret, $body, $signature) {
      $calculatedSignature = strtoupper(
          hash_hmac('sha256', $body, $secret)
      );

      return hash_equals($calculatedSignature, strtoupper($signature));
  }
  ```
</CodeGroup>

### Structure du payload

Le webhook reçoit un payload JSON avec la structure suivante :

```json theme={null}
{
  "storeId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "customerId": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
  "lineItemId": "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
  "productId": "1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d",
  "variantId": "8f7e6d5c-4b3a-2918-7654-3210fedcba98",
  "quantity": 1,
  "order": {
    "id": "5f3a8b2c-1d4e-5f6a-7b8c-9d0e1f2a3b4c",
    "totalPrice": 29.99,
    "currency": "USD",
    "customer": {
      "email": "client@exemple.com",
      "name": "Jean Dupont"
    }
  }
}
```

## Réponse webhook

### Format de réponse

Votre endpoint doit répondre avec du **texte brut** (`text/plain`) contenant le contenu de livraison. Ceci sera affiché au client exactement tel que renvoyé.

```http theme={null}
HTTP/1.1 200 OK
Content-Type: text/plain

CLE-LICENCE-ABC123-XYZ789-PREMIUM
Téléchargement: https://exemple.com/download/abc123
Valide jusqu'au: 2026-11-27
```
