Ir diretamente para o conteúdo principal
Payload de um webhook Fabrixa no ecrã — evento de encomenda em JSON assinado, sobre tecido
Programadores · Referência sobre webhooks

Cada evento. Cada payload. Assinado.

A Fabrixa envia eventos de encomendas para o seu endpoint em tempo real. O seu servidor expõe um endpoint POST público; enviamos o corpo completo da encomenda com uma assinatura HMAC-SHA256 e o tópico do evento nos cabeçalhos. Verifique a assinatura, devolva rapidamente um 200 e processe de forma assíncrona.

HMAC-SHA256 · order.created / order.updated · 10 tentativas de entrega

Cabeçalhos do pedido

Três cabeçalhos identificam e verificam o pedido.

Cada POST de webhook inclui os mesmos três cabeçalhos. Utilize x-webhook-topic para encaminhar o evento e x-webhook-signature para o verificar antes de confiar na entidade.

content-type é sempre application/json. x-webhook-signature é o HMAC-SHA256 codificado em base64 do corpo do pedido em formato bruto. x-webhook-topic é o nome do evento.

Cabeçalhos de entrada
{
  "content-type":        "application/json",
  "x-webhook-topic":     "order.updated",
  "x-webhook-signature": "YmEwNjBhMGMy...MAxMw=="
}
Eventos de webhook

Dois tópicos, para já.

Cada webhook é acionado por um x-webhook-topic valor. Ambos contêm o objeto de encomenda completo, pelo que um único manipulador pode alternar no tópico.

order.created

Foi efetuada uma nova encomenda.

É acionado quando é criada uma encomenda no Fabrixa — quer através de um pedido da API, quer diretamente na plataforma.

order.updated

Uma encomenda já existente é alterada.

É acionado quando os detalhes da encomenda se alteram — por exemplo, quando o estado da encomenda ou o estado do processamento da encomenda mudam para a fase seguinte.

Estados

O que os campos de estado podem indicar.

A payload transporta tanto uma encomenda status e um fulfillment_status. Ative estas opções para controlar o estado da sua encomenda.

Estados das encomendas
  • Completed — enviado ou levantado e receção confirmada.
  • Canceled — o pagamento foi cancelado; a transação não foi concluída.
  • On hold — a encomenda está temporariamente bloqueada.
  • Imported — a encomenda foi importada para a plataforma.
Estados de processamento de encomendas
  • Unfulfilled — ainda não está preparado nem enviado.
  • Partially fulfilled — alguns artigos já foram processados ou enviados, outros ainda estão pendentes.
  • Scheduled — planeados e agendados para processamento.
  • Rejected — o pedido de execução foi recusado.
  • Fulfilled — totalmente processados e entregues ou disponibilizados.
Payload

Como é o corpo.

O texto completo order.updated payload, exatamente tal como documentado nos documentos de referência da API — a encomenda, os seus estados e as linhas com detalhes sobre a variante, o produto e a origem.

Corpo do POST — order.updated
{
  "id": 23069,
  "number": "1250211835",
  "comments": null,
  "is_archived": false,
  "status": "imported",
  "fulfillment_status": "unfulfilled",
  "purchased_at": "2025-04-17T16:17:21.000000Z",
  "created_at":   "2025-04-17T16:17:23.000000Z",
  "updated_at":   "2025-04-18T07:43:52.000000Z",
  "rows": [
    {
      "id": 27954,
      "quantity": 1,
      "client_barcode": "1250211835",
      "fulfillment_status": "unfulfilled",
      "variant": {
        "id": 293457,
        "name": "Sherpa fleece deken",
        "subtitle": "100x150",
        "SKU": "SFD787231",
        "product": {
          "id": 5319, "name": "Sherpa fleece deken", "subtitle": "Sherpa fleece deken"
        }
      },
      "sources": [
        {
          "type": "print",
          "url": "https://storage.googleapis.com/fabrixa-api/…/120002795400.pdf",
          "properties": { "fill_style": "contain" }
        }
      ]
    }
  ]
}
Verificar a assinatura

Recalcule o HMAC, compare e, em seguida, considere o corpo como fiável.

Recalcule o HMAC-SHA256 da payload bruta do pedido com a sua chave secreta, codifique-a em base64 e compare com x-webhook-signature. Utilize sempre uma comparação de tempo constante (hash_equals) para evitar ataques de temporização.

PHP puro
$payload = file_get_contents('php://input');
$secret  = 'your-secret-key';

$expected = base64_encode(
  hash_hmac('sha256', $payload, $secret, true)
);
$received = $_SERVER['HTTP_X_WEBHOOK_SIGNATURE'] ?? '';

// constant-time compare
if (!hash_equals($expected, $received)) {
  http_response_code(403);
  exit('Invalid signature');
}
Laravel
public function handle(Request $request)
{
  $secret  = 'your-secret-key';
  $payload = $request->getContent();

  $expected = base64_encode(
    hash_hmac('sha256', $payload, $secret, true)
  );
  $received = $request->header('x-webhook-signature');

  if (!hash_equals($expected, $received)) {
    abort(403, 'Invalid signature');
  }
  // Continue processing…
}
Entrega e resposta

Novas tentativas e a resposta que esperamos.

Novas tentativas

Até 10 tentativas; depois, é desativado

A 2xx (por exemplo, 200) ou um 301 / 302 é considerado um sucesso. Qualquer 4xx, 5xx ou se o tempo limite for atingido, é iniciada uma nova tentativa — até um total de 10. Após a décima falha, o webhook é desativado.

Resposta

Devolver 200 rapidamente, processar de forma assíncrona

Confirme com 200 OK o mais rapidamente possível e, em seguida, processar a carga de trabalho de forma assíncrona através de uma tarefa em segundo plano ou de uma fila. Um ponto final lento pode ser considerado uma falha, mesmo que acabe por ser bem-sucedido.

Crie o seu manipulador

Configure o seu endpoint de webhook.

O guia de integração explica passo a passo como registar o seu endpoint e como gerir o ciclo de vida da encomenda do início ao fim. A referência completa da API contém o esquema completo do payload.