> ## 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.

# Dynamische Lieferung

> Erstellen Sie benutzerdefinierte Erfüllungs-Workflows durch programmatische Produktlieferung über Webhooks

## Überblick

Dynamische Lieferung ermöglicht es Ihnen, die Produkterfüllung programmatisch zu verwalten, indem Sie einen Webhook-Endpunkt implementieren, der Bestellinformationen empfängt und Lieferinhalt zurückgibt. Ideal für die Lieferung digitaler Produkte, Lizenzschlüssel, Spielcodes oder die Integration externer Erfüllungssysteme.

Wenn ein Kunde ein Produkt mit aktivierter dynamischer Lieferung kauft, sendet Komerza sofort eine POST-Anfrage an Ihre konfigurierte Webhook-URL mit Bestelldetails, und Ihr Endpunkt antwortet mit dem Inhalt, der dem Kunden geliefert werden soll.

<Note>
  Dynamische Lieferung wird pro Produktvariante in Ihren Produkteinstellungen
  unter Liefermethoden konfiguriert.
</Note>

## Anwendungsfälle

<CardGroup cols={2}>
  <Card title="Digitale Produkte" icon="file-code">
    Liefern Sie Lizenzschlüssel, Download-Links oder Zugangscodes in Echtzeit
  </Card>

  {" "}

  <Card title="Drittanbieter-Integration" icon="puzzle-piece">
    Verbinden Sie sich mit externen Erfüllungssystemen oder Bestandsverwaltung
  </Card>

  {" "}

  <Card title="Benutzerdefinierte Logik" icon="diagram-project">
    Implementieren Sie komplexe Lieferregeln basierend auf Kunden-, Produkt- oder
    Bestelldaten
  </Card>

  <Card title="Spielcodes" icon="gamepad">
    Liefern Sie automatisch Spielschlüssel, Aktivierungscodes oder In-Game-Items
  </Card>
</CardGroup>

## Wie es funktioniert

1. **Kunde kauft** - Ein Kunde schließt den Checkout für ein Produkt mit aktivierter dynamischer Lieferung ab
2. **Webhook ausgelöst** - Komerza sendet eine POST-Anfrage an Ihre konfigurierte Webhook-URL
3. **Ihre Antwort** - Ihr Endpunkt verarbeitet die Anfrage und gibt den Lieferinhalt zurück
4. **Kunde erhält** - Der zurückgegebene Inhalt wird dem Kunden als Klartext geliefert

## Konfiguration

### Dynamische Lieferung einrichten

1. Navigieren Sie zu Ihrem Produkt im Komerza-Dashboard
2. Wählen Sie die Variante aus, die Sie konfigurieren möchten
3. Wählen Sie **Dynamische Lieferung** als Liefermethode
4. Geben Sie Ihre Webhook-Endpunkt-URL ein
5. Generieren und speichern Sie Ihr Webhook-Geheimnis

<Warning>
  Halten Sie Ihr Webhook-Geheimnis sicher. Es wird verwendet, um zu überprüfen,
  dass Anfragen tatsächlich von Komerza stammen.
</Warning>

## Webhook-Anfrage

### Anfrage-Header

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

### Signaturverifizierung

Alle Webhook-Anfragen enthalten einen `X-Signature`-Header mit einer HMAC SHA256-Signatur. Sie sollten diese Signatur verifizieren, um sicherzustellen, dass die Anfrage von Komerza stammt.

**Signaturberechnung:**

```
HMAC-SHA256(secret, request_body) -> HEX-codiert
```

<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("Ungültige Signatur");
    }

    // Webhook verarbeiten...
  });
  ```

  ```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>

### Payload-Struktur

Der Webhook empfängt ein JSON-Payload mit der folgenden Struktur:

```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": "kunde@beispiel.de",
      "name": "Max Mustermann"
    }
  }
}
```

## Webhook-Antwort

### Antwortformat

Ihr Endpunkt muss mit **Klartext** (`text/plain`) antworten, der den Lieferinhalt enthält. Dies wird dem Kunden genau so angezeigt, wie es zurückgegeben wird.

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

LIZENZSCHLUESSEL-ABC123-XYZ789-PREMIUM
Download: https://beispiel.de/download/abc123
Gültig bis: 2026-11-27
```
