> ## Documentation Index
> Fetch the complete documentation index at: https://docs.norbaas.com.br/llms.txt
> Use this file to discover all available pages before exploring further.

# Lidar e monitorar entregas de webhooks

> Como analisar, validar e lidar com webhooks e monitorar suas entregas na Norbaas

<img className="block dark:hidden" src="https://mintcdn.com/norbaas/5OPQggdmVnQLu7D4/assets/integrate/webhooks/delivery.light.png?fit=max&auto=format&n=5OPQggdmVnQLu7D4&q=85&s=60ee18c091f3bcc5212356a91f538004" width="2740" height="1522" data-path="assets/integrate/webhooks/delivery.light.png" />

<img className="hidden dark:block" src="https://mintcdn.com/norbaas/5OPQggdmVnQLu7D4/assets/integrate/webhooks/delivery.dark.png?fit=max&auto=format&n=5OPQggdmVnQLu7D4&q=85&s=e50137fa6eceff9b4380f21925175870" width="2672" height="1526" data-path="assets/integrate/webhooks/delivery.dark.png" />

Depois que um endpoint de webhook estiver configurado, você terá acesso à página de visão geral das entregas. Aqui você pode:

* Ver entregas históricas
* Revisar a carga útil enviada
* Acionar uma nova entrega em caso de falha

Agora, vamos integrar nossa rota de endpoint para validar, analisar e lidar com webhooks recebidos.

## Validar e analisar webhooks

Agora você precisa configurar um manipulador de rota para o endpoint registrado no Norbaas para
receber, validar e analisar os webhooks antes de tratá-los de acordo com suas
necessidades.

### Usando nossos SDKs

Nossos SDKs em TypeScript e Python vêm com uma função auxiliar integrada para facilitar
a validação e análise do evento de webhook – veja os exemplos completos abaixo.

<CodeGroup>
  ```typescript JS (Express) theme={null}
  import express, { Request, Response } from 'express'
  import { validateEvent, WebhookVerificationError } from '@norbaas-sh/sdk/webhooks'

  const app = express()

  app.post(
  '/webhook',
  express.raw({ type: 'application/json' }),
  (req: Request, res: Response) => {
  try {
  const event = validateEvent(
  req.body,
  req.headers,
  process.env['NORBAAS_WEBHOOK_SECRET'] ?? '',
  )

        // Processe o evento

        res.status(202).send('')
      } catch (error) {
        if (error instanceof WebhookVerificationError) {
          res.status(403).send('')
        }
        throw error
      }

  },
  )

  ```

  ```python Python (Flask) theme={null}
  import os
  from flask import Flask, request
  from norbaas_sdk.webhooks import validate_event, WebhookVerificationError

  app = Flask(__name__)

  @app.route('/webhook', methods=['POST'])
  def webhook():
      try:
          event = validate_event(
              payload=request.data,
              headers=request.headers,
              secret=os.getenv('NORBAAS_WEBHOOK_SECRET', ''),
          )

          # Process the event

          return "", 202
      except WebhookVerificationError as e:
          return "", 403
  ```
</CodeGroup>

Ambos os exemplos acima esperam que uma variável de ambiente chamada NORBAAS\_WEBHOOK\_SECRET
seja definida com o segredo que você configurou durante a criação do endpoint.

### Validação personalizada

Nós seguimos o padrão [Standard Webhooks](https://www.standardwebhooks.com/)
que oferece [diversas bibliotecas em várias linguagens](https://github.com/standard-webhooks/standard-webhooks/tree/main/libraries)
para facilitar a validação de assinaturas. Ou você pode seguir a
[especificação](https://github.com/standard-webhooks/standard-webhooks/blob/main/spec/standard-webhooks.md)
caso prefira implementar sua própria solução.

<Info>
  **Observação: O segredo precisa estar codificado em base64**

  Um erro comum com essa especificação é que o segredo do webhook deve estar
  codificado em base64. Você não precisa se preocupar com isso ao usar nosso SDK,
  pois ele cuida desses detalhes de implementação, oferecendo uma melhor experiência para desenvolvedores.
</Info>

## Tratamento de Falhas

### Tentativas de Reentrega

Se ocorrer um erro ao tentar alcançar seu endpoint — seja um erro de rede temporário ou um bug — tentaremos reenviar o evento até 10 vezes com uma estratégia de exponential backoff.

### Tempo Limite de Entrega

As requisições feitas ao seu endpoint têm um tempo limite de 20 segundos. Após esse tempo, uma nova tentativa será feita após um atraso, como explicado acima. No entanto, recomendamos fortemente que você otimize sua rota de endpoint para ser rápida.
Uma boa prática é fazer com que o manipulador de webhook coloque uma tarefa em uma fila para ser executada por um worker em segundo plano, processando a carga útil de forma assíncrona.

## Solução de Problemas

### Não está recebendo webhooks

Está vendo entregas no Norbaas, mas não está recebendo nada no seu lado?
Abaixo estão algumas técnicas comuns para resolver o problema, dependendo do código de erro informado.

**Geral**

*Inicie o ngrok ou serviço semelhante*

Certifique-se de que você iniciou o `ngrok` ou qualquer serviço de tunelamento que esteja usando durante o desenvolvimento local.

*Adicione logs excessivos*

Exemplo:
`console.log('webhook.handler_called')`,
`console.log('webhook.validate_signature')`,
`console.log('webhook.signature_validated')` etc.

Assim você pode confirmar facilmente se o manipulador foi chamado e até onde ele chega antes de qualquer problema ocorrer.

`HTTP 404`

* Tente usar `curl -vvv -X POST <cole-e-cole-a-URL-do-endpoint>` no terminal para confirmar se a rota existe e identificar qualquer problema ao longo do caminho.
* Tente adicionar uma barra `(/)` ao final da URL no Norbaas. Muitas vezes `/foo` é resolvido como `/foo/` por alguns frameworks.

`HTTP 403`

* Está usando middleware para autorização? Certifique-se de excluir a rota do webhook, já que ela precisa ser publicamente acessível.
* Está usando Cloudflare? Verifique os logs do firewall para ver se nossos pedidos estão sendo bloqueados e configure uma regra personalizada no WAF para aceitar requisições vindas do Norbaas.

### Exceções de assinatura inválida

Está implementando sua própria lógica de validação de webhook?
Certifique-se de codificar em base64 o segredo que você configurou no Norbaas antes de gerar a assinatura para validação.
