# Ejemplo de adaptador para el sistema de licencias del comerciante

Este ejemplo de Python 3.10+ implementa el puente HTTP externo de Launch con persistencia de eventos/nonces en SQLite y un worker de recuperación. **No** genera licencias, valida funciones protegidas ni sustituye su sistema de licencias.

Implemente un módulo de Python con estos hooks:

```python
def apply_snapshot(snapshot):
    # Call your licensing system with snapshot["event_id"] as its durable
    # idempotency key. Apply desired_state and the absolute purchased dates.
    # Return only after confirming the original operation was applied.
    # Raise ValueError for a result requiring manual review.
    ...

def delivery(snapshot):
    # Read an existing result owned by this purchase; do not issue here.
    return {"type": "instructions", "value": "Your own delivery instructions", "expires_at": None}
```

Sustituya `...` por una integración real antes de configurar un backend. Si no se configura un módulo de backend, los hooks incluidos lanzan `NotImplementedError`; los eventos pasan a revisión manual y nunca afirman que se haya emitido una autorización. El worker del ejemplo puede reintentar un hook tras un fallo del proceso o un error de resultado incierto; por tanto, su backend de licencias debe deduplicar o recuperar usando el mismo ID de evento.

Configure el adaptador mediante variables de entorno, manteniendo la clave fuera del control de versiones y del historial de la shell:

- `CUSTOM_LICENSING_KEY`: codificación Base64 estándar de 32–128 bytes aleatorios, coincidente con Launch.
- `CUSTOM_LICENSING_KEY_ID`: `key-1` o el identificador de clave configurado.
- `CUSTOM_LICENSING_CONNECTION_REF`: referencia de conexión coincidente.
- `CUSTOM_LICENSING_ENVIRONMENT`: `sandbox` o `live`.
- `CUSTOM_LICENSING_DATABASE`: ruta privada y escribible de SQLite fuera del directorio de trabajo del repositorio; consérvela entre reinicios.
- `CUSTOM_LICENSING_BACKEND`: módulo importable que implementa los hooks anteriores.
- `CUSTOM_LICENSING_PORT`: puerto de escucha local, `18883` por defecto.

Ejecute `python server.py`. Para pruebas sandbox locales, configure `http://127.0.0.1:18883` en Launch y habilite explícitamente su excepción HTTP de bucle local. En producción, use terminación HTTPS, supervisión de procesos, copias de seguridad protegidas de la base de datos y la verificación del SDK/entorno de ejecución de su backend. Declare solo los tipos de compra/entrega que su backend admita realmente y adapte `capabilities` en consecuencia.

Después de corregir un problema del backend, `python server.py --retry-event ORIGINAL_EVENT_UUID` vuelve a poner en la cola local el mismo payload guardado. En la página de tareas de autorización de Launch, reintente también ese evento original. No cambie los ID ni añada tiempo otra vez para recuperar una respuesta.

El ejemplo es un punto de partida, no una certificación de preparación para producción. El lease del worker dura 60 segundos; limite las llamadas a hooks con un tiempo de espera inferior o renueve el lease. Añada supervisión, procedimientos de rotación, comprobaciones más estrictas de negocio/esquema y los controles operativos de su despliegue antes de aceptar compras live. La [guía de integración](/es/launch-documents/external-licensing/) y el [OpenAPI](/es/assets/launch/external-licensing-openapi.json) definen el protocolo. Nunca use una respuesta de estado de Launch como permiso para ejecutar código protegido.
