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

# Entrega dinámica

> Cree flujos de trabajo de cumplimiento personalizados manejando la entrega de productos mediante programación a través de webhooks

## Descripción general

La Entrega Dinámica le permite manejar programáticamente el cumplimiento de productos implementando un endpoint de webhook que recibe información del pedido y devuelve el contenido de entrega. Ideal para entregar productos digitales, claves de licencia, códigos de juegos o integrar con sistemas de cumplimiento externos.

Cuando un cliente compra un producto con entrega dinámica habilitada, Komerza envía inmediatamente una solicitud POST a su URL de webhook configurada con los detalles del pedido, y su endpoint responde con el contenido para entregar al cliente.

<Note>
  La Entrega Dinámica se configura por variante de producto en la configuración
  de su producto bajo métodos de entrega.
</Note>

## Casos de uso

<CardGroup cols={2}>
  <Card title="Productos digitales" icon="file-code">
    Entregue claves de licencia, enlaces de descarga o códigos de acceso en tiempo real
  </Card>

  {" "}

  <Card title="Integración de terceros" icon="puzzle-piece">
    Conecte con sistemas de cumplimiento externos o gestión de inventario
  </Card>

  {" "}

  <Card title="Lógica personalizada" icon="diagram-project">
    Implemente reglas de entrega complejas basadas en datos del cliente, producto
    o pedido
  </Card>

  <Card title="Códigos de juegos" icon="gamepad">
    Entregue automáticamente claves de juego, códigos de activación o artículos en el juego
  </Card>
</CardGroup>

## Cómo funciona

1. **El cliente compra** - Un cliente completa el pago de un producto con entrega dinámica habilitada
2. **Webhook activado** - Komerza envía una solicitud POST a su URL de webhook configurada
3. **Su respuesta** - Su endpoint procesa la solicitud y devuelve el contenido de entrega
4. **El cliente recibe** - El contenido devuelto se entrega al cliente como texto plano

## Configuración

### Configurar la Entrega Dinámica

1. Navegue a su producto en el panel de Komerza
2. Seleccione la variante que desea configurar
3. Elija **Entrega Dinámica** como método de entrega
4. Ingrese la URL de su endpoint de webhook
5. Genere y guarde su secreto de webhook

<Warning>
  Mantenga su secreto de webhook seguro. Se usa para verificar que las
  solicitudes son genuinamente de Komerza.
</Warning>

## Solicitud de webhook

### Encabezados de solicitud

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

### Verificación de firma

Todas las solicitudes de webhook incluyen un encabezado `X-Signature` con una firma HMAC SHA256. Debe verificar esta firma para asegurarse de que la solicitud es de Komerza.

**Cálculo de firma:**

```
HMAC-SHA256(secret, request_body) -> codificado 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("Firma inválida");
    }

    // Procesar 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>

### Estructura del payload

El webhook recibe un payload JSON con la siguiente estructura:

```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": "cliente@ejemplo.com",
      "name": "Juan García"
    }
  }
}
```

## Respuesta del webhook

### Formato de respuesta

Su endpoint debe responder con **texto plano** (`text/plain`) que contenga el contenido de entrega. Esto se mostrará al cliente exactamente como se devuelva.

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

CLAVE-LICENCIA-ABC123-XYZ789-PREMIUM
Descarga: https://ejemplo.com/download/abc123
Válido hasta: 2026-11-27
```
