# Exemplo de adaptador para o sistema de licenciamento do comerciante

Este exemplo Python 3.10+ implementa a ponte HTTP externa do Launch com persistência SQLite de eventos e nonces e um worker de recuperação. Ele **não** gera licenças, valida funcionalidades protegidas nem substitui seu sistema de licenciamento.

Implemente um módulo Python com estes 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}
```

Substitua `...` pela integração real antes de configurar o backend. Sem módulo configurado, os hooks incluídos lançam `NotImplementedError`; os eventos entram em revisão manual e nunca afirmam que uma licença foi emitida. O worker pode repetir um hook após falha do processo ou resultado incerto; seu backend precisa deduplicar e recuperar pelo mesmo ID de evento.

Configure o adaptador por variáveis de ambiente, sem colocar a chave no controle de versão ou no histórico do shell:

- `CUSTOM_LICENSING_KEY`: codificação Base64 padrão de 32–128 bytes aleatórios, igual à configurada no Launch.
- `CUSTOM_LICENSING_KEY_ID`: `key-1` ou o identificador de chave configurado.
- `CUSTOM_LICENSING_CONNECTION_REF`: referência de conexão correspondente.
- `CUSTOM_LICENSING_ENVIRONMENT`: `sandbox` ou `live`.
- `CUSTOM_LICENSING_DATABASE`: caminho SQLite privado e gravável, fora do checkout; conserve-o entre reinícios.
- `CUSTOM_LICENSING_BACKEND`: módulo importável que implementa os hooks acima.
- `CUSTOM_LICENSING_PORT`: porta local de escuta, padrão `18883`.

Execute `python server.py`. Em testes sandbox locais, configure `http://127.0.0.1:18883` no Launch e ative explicitamente a exceção HTTP de loopback. Na produção, use terminação HTTPS, supervisão de processos, backups protegidos do banco e verificação pelo SDK/runtime do seu backend. Anuncie apenas tipos de compra e entrega realmente suportados e ajuste `capabilities` conforme necessário.

Depois de corrigir o backend, `python server.py --retry-event ORIGINAL_EVENT_UUID` recoloca localmente o mesmo conteúdo persistido na fila. Na página de tarefas de licenciamento do Launch, repita também o evento original. Não troque IDs nem acrescente prazo novamente para recuperar uma resposta.

O exemplo é um ponto de partida, não uma qualificação para produção. O lease do worker dura 60 segundos; limite o timeout dos hooks a um prazo menor ou renove o lease. Antes de aceitar compras reais, acrescente monitoramento, rotação, validações de negócio e esquema mais rigorosas e controles operacionais da implantação. O [guia de integração](/pt/launch-documents/external-licensing/) e o [OpenAPI](/pt/assets/launch/external-licensing-openapi.json) definem o protocolo. Nunca use uma resposta de estado Launch como permissão para executar código protegido.
