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

# Dostawa dynamiczna

> Twórz niestandardowe przepływy realizacji przez programową obsługę dostawy produktów przez webhooks

## Przegląd

Dostawa dynamiczna pozwala programowo obsługiwać realizację produktów poprzez implementację endpointu webhook, który odbiera informacje o zamówieniu i zwraca treść dostawy. Idealne do dostarczania produktów cyfrowych, kluczy licencyjnych, kodów gier lub integracji z zewnętrznymi systemami realizacji.

Gdy klient kupuje produkt z włączoną dostawą dynamiczną, Komerza natychmiast wysyła żądanie POST do skonfigurowanego URL webhooka ze szczegółami zamówienia, a Twój endpoint odpowiada treścią do dostarczenia klientowi.

<Note>
  Dostawa dynamiczna jest konfigurowana dla każdego wariantu produktu w
  ustawieniach produktu w sekcji metod dostawy.
</Note>

## Przypadki użycia

<CardGroup cols={2}>
  <Card title="Produkty cyfrowe" icon="file-code">
    Dostarczaj klucze licencyjne, linki do pobierania lub kody dostępu w czasie rzeczywistym
  </Card>

  {" "}

  <Card title="Integracja zewnętrzna" icon="puzzle-piece">
    Połącz się z zewnętrznymi systemami realizacji lub zarządzania magazynem
  </Card>

  {" "}

  <Card title="Niestandardowa logika" icon="diagram-project">
    Implementuj złożone reguły dostawy bazujące na danych klienta, produktu lub
    zamówienia
  </Card>

  <Card title="Kody do gier" icon="gamepad">
    Automatycznie dostarczaj klucze do gier, kody aktywacyjne lub przedmioty w grze
  </Card>
</CardGroup>

## Jak to działa

1. **Klient kupuje** - Klient finalizuje zakup produktu z włączoną dostawą dynamiczną
2. **Webhook wyzwolony** - Komerza wysyła żądanie POST do skonfigurowanego URL webhooka
3. **Twoja odpowiedź** - Twój endpoint przetwarza żądanie i zwraca treść dostawy
4. **Klient otrzymuje** - Zwrócona treść jest dostarczana klientowi jako zwykły tekst

## Konfiguracja

### Konfigurowanie dostawy dynamicznej

1. Przejdź do swojego produktu w panelu Komerza
2. Wybierz wariant, który chcesz skonfigurować
3. Wybierz **Dostawa dynamiczna** jako metodę dostawy
4. Wprowadź URL swojego endpointu webhooka
5. Wygeneruj i zapisz swój sekret webhooka

<Warning>
  Chroń swój sekret webhooka. Służy do weryfikacji, że żądania pochodzą
  rzeczywiście od Komerza.
</Warning>

## Żądanie webhook

### Nagłówki żądania

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

### Weryfikacja podpisu

Wszystkie żądania webhook zawierają nagłówek `X-Signature` z podpisem HMAC SHA256. Powinieneś zweryfikować ten podpis, aby upewnić się, że żądanie pochodzi od Komerza.

**Obliczanie podpisu:**

```
HMAC-SHA256(secret, request_body) -> kodowany 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("Nieprawidłowy podpis");
    }

    // Przetwórz 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>

### Struktura payload

Webhook otrzymuje ładunek JSON o następującej strukturze:

```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": "klient@przyklad.pl",
      "name": "Jan Kowalski"
    }
  }
}
```

## Odpowiedź webhook

### Format odpowiedzi

Twój endpoint musi odpowiedzieć **zwykłym tekstem** (`text/plain`) zawierającym treść dostawy. Zostanie ona wyświetlona klientowi dokładnie tak, jak zostanie zwrócona.

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

KLUCZ-LICENCYJNY-ABC123-XYZ789-PREMIUM
Pobieranie: https://przyklad.pl/download/abc123
Ważny do: 2026-11-27
```
