DOCS

Ouça eventos com webhooks

Receba notificações de eventos em tempo real para sua integração Zonos.

Os webhooks oferecem uma forma de a Zonos notificar proativamente seus sistemas externos sempre que determinados eventos ocorrem. Quando o evento inscrito ocorre, a Zonos envia uma solicitação HTTP POST para a URL do webhook que você especificar. O corpo da solicitação conterá os detalhes do evento, permitindo que seu sistema trate o evento de forma programática.

Os webhooks são úteis para integrar a Zonos a outras plataformas, acionar fluxos de trabalho automatizados e manter os dados sincronizados entre sistemas em tempo real. Por exemplo, você pode usar webhooks para:

  • Atualizar seu sistema de gerenciamento de pedidos quando um pedido for criado na Zonos
  • Notificar seu provedor de atendimento quando uma remessa for cancelada
  • Registrar alterações de status de pedidos internacionais para fins de auditoria

Tipos de webhook 

Todos os tipos de webhook disponíveis estão incluídos no enum WebhookType. Exemplos de payloads para cada um podem ser encontrados em nosso guia Tipos de eventos.

Criando webhooks 

Para criar um webhook por meio da API:

1mutation WebhookCreate($input: WebhookCreateInput!) {
2 webhookCreate(input: $input) {
3 id
4 url
5 type
6 status
7 secret
8 headers {
9 key
10 }
11 }
12}

Importante: Salve o valor de secret ao criar o webhook — ele é retornado apenas neste momento, e você precisará dele para verificar as assinaturas dos webhooks. Consulte Verificando assinaturas de webhook abaixo.

Editar detalhes do webhook 

Para editar um webhook existente por meio da API:

1mutation WebhookUpdate($input: WebhookUpdateInput!) {
2 webhookUpdate(input: $input) {
3 id
4 url
5 type
6 status
7 }
8}

Verificando assinaturas de webhook 

Toda solicitação de webhook enviada pela Zonos inclui um cabeçalho zonos-signature, para que você possa confirmar que a solicitação realmente veio da Zonos e que o payload não foi alterado durante o trânsito.

O valor do cabeçalho tem o seguinte formato:

timestamp=<unix-timestamp-ms>,hmac=<base64-encoded-signature>
  • timestamp — o horário, em milissegundos desde a época Unix, em que a solicitação foi assinada.
  • hmac — uma assinatura HMAC-SHA256 do corpo bruto da solicitação JSON, calculada usando o secret do seu webhook como chave e codificada em Base64.

Para verificar uma solicitação:

  1. Extraia os valores de timestamp e hmac do cabeçalho zonos-signature.
  2. Calcule sua própria assinatura HMAC-SHA256 sobre o corpo bruto e não processado da solicitação, usando o secret que você recebeu ao criar o webhook.
  3. Compare sua assinatura calculada com o valor de hmac usando uma comparação de tempo constante e rejeite a solicitação se não corresponderem.
  4. Opcionalmente, rejeite solicitações em que o timestamp seja anterior a alguns minutos, para se proteger contra a repetição (replay) de uma solicitação capturada. A Zonos não impõe uma janela de entrega por conta própria, portanto essa verificação fica a seu critério.
1const crypto = require('crypto');
2 
3function verifyZonosWebhook(rawBody, signatureHeader, secret) {
4 const [timestampPart, hmacPart] = signatureHeader.split(',');
5 const receivedHmac = hmacPart.split('=')[1];
6 
7 const expectedHmac = crypto
8 .createHmac('sha256', secret)
9 .update(rawBody)
10 .digest('base64');
11 
12 const receivedBuffer = Buffer.from(receivedHmac);
13 const expectedBuffer = Buffer.from(expectedHmac);
14 
15 if (receivedBuffer.length !== expectedBuffer.length) {
16 return false;
17 }
18 
19 return crypto.timingSafeEqual(receivedBuffer, expectedBuffer);
20}

Observação: Se você configurou cabeçalhos personalizados no seu webhook, eles também são incluídos literalmente em todas as solicitações, junto com zonos-signature.

Ver registros de webhook 

Para visualizar os registros de webhook por meio da API:

1query WebhookLogs(
2$first: Int
3$after: String
4$filter: WebhookLogsFilterInput
5) {
6 webhookLogs(first: $first, after: $after, filter: $filter) {
7 edges {
8 node {
9 id
10 type
11 url
12 createdAt
13 responseStatus
14 }
15 }
16 }
17}
GraphQL API ReferenceTypes, inputs, and operations used in this guide

Esta página foi útil?