Vai al contenuto principale
Payload di un webhook Fabrixa visualizzato sullo schermo — evento di ordine in formato JSON firmato, relativo a un tessuto intrecciato
Sviluppatori · Guida di riferimento ai webhook

Ogni evento. Ogni payload. Firmato.

Fabrixa invia gli eventi relativi agli ordini al Suo endpoint in tempo reale. Il Suo server espone un endpoint POST pubblico; noi inviamo il corpo completo dell'ordine con una firma HMAC-SHA256 e il topic dell'evento nelle intestazioni. Verifichi la firma, restituisca rapidamente un codice di stato 200 ed elabori i dati in modo asincrono.

HMAC-SHA256 · order.created / order.updated · 10 tentativi di consegna

Intestazioni della richiesta

Tre intestazioni identificano e verificano la richiesta.

Ogni richiesta POST di webhook contiene le stesse tre intestazioni. Utilizzi x-webhook-topic per instradare l'evento e x-webhook-signature per verificarlo prima di fidarsi del body.

content-type è sempre application/json. x-webhook-signature è l'HMAC-SHA256 in formato Base64 del corpo del messaggio non elaborato. x-webhook-topic è il nome dell'evento.

Intestazioni in entrata
{
  "content-type":        "application/json",
  "x-webhook-topic":     "order.updated",
  "x-webhook-signature": "YmEwNjBhMGMy...MAxMw=="
}
Eventi webhook

Due topic, ad oggi.

Ogni webhook viene attivato da un valore x-webhook-topic specifico. Entrambi contengono l'oggetto ordine completo, quindi un unico gestore può eseguire uno switch sul topic.

order.created

È stato effettuato un nuovo ordine.

Si attiva quando viene creato un ordine in Fabrixa, sia tramite una richiesta API sia direttamente sulla piattaforma.

order.updated

Un ordine esistente subisce una modifica.

Viene attivato quando cambiano i dettagli dell'ordine — ad esempio, quando lo stato dell'ordine o lo stato di evasione subiscono un'evoluzione.

Stati

Cosa indicano i campi di stato.

Il payload contiene l'ordine status oltre a un fulfillment_status. Le attivi per gestire lo stato del Suo ordine.

Stati degli ordini
  • Completed — spedito o ritirato e ricevuta confermata.
  • Canceled — Il pagamento è stato annullato; la transazione non è andata a buon fine.
  • On hold — l'ordine è temporaneamente bloccato.
  • Imported — l'ordine è stato importato nella piattaforma.
Stati di evasione dell'ordine
  • Unfulfilled — non ancora preparato o inviato.
  • Partially fulfilled — alcuni articoli sono stati elaborati o spediti, altri sono in attesa di elaborazione.
  • Scheduled — pianificati e programmati per l'elaborazione.
  • Rejected — la richiesta di evasione è stata respinta.
  • Fulfilled — completamente elaborati e consegnati o messi a disposizione.
Payload

Che aspetto ha il corpo.

Il payload order.updated completo, esattamente come documentato nel riferimento API: l'ordine, i relativi stati e le righe con i dettagli relativi alla variante, al prodotto e al file sorgente.

Corpo del 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" }
        }
      ]
    }
  ]
}
Verifica la firma

Ricalcoli l'HMAC, confronta i risultati e, se corrispondono, considera attendibile il corpo del messaggio.

Ricalcoli l'HMAC-SHA256 del payload grezzo della richiesta utilizzando la Sua chiave segreta, lo codifichi in base64 e lo confronti con x-webhook-signature. Utilizzare sempre un confronto a tempo costante (hash_equals) per evitare attacchi basati sul timing.

PHP grezzo
$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…
}
Consegna e risposta

I retry e la risposta che ci aspettiamo.

Retry

Fino a 10 tentativi, poi disattivato

Qualsiasi 2xx una risposta (ad es. 200) viene considerata un esito positivo, così come un 301 o 302 reindirizzamento. Qualsiasi 4xx, 5xx o timeout attiva un nuovo tentativo — fino a un massimo di 10 in totale. Dopo il decimo tentativo fallito, il webhook viene disattivato.

Risposta

Restituisce rapidamente il codice di stato 200, elaborazione asincrona

Rispondere con 200 OK il più rapidamente possibile, quindi gestire il payload in modo asincrono tramite un’attività in background o una coda. Un endpoint lento può essere considerato un errore anche se alla fine va a buon fine.

Domande frequenti

Webhook: le risposte

Come posso verificare la firma di un webhook Fabrixa?

Ricalcoli l'HMAC-SHA256 del corpo della richiesta non elaborato utilizzando la Sua chiave segreta, codifica il risultato in base64 e confrontalo con l'intestazione x-webhook-signature utilizzando un confronto a tempo costante, come ad esempio hash_equals. Fabrixa fornisce esempi pratici in PHP grezzo e Laravel; qualsiasi discrepanza deve essere respinta prima che il payload venga elaborato.

Quali eventi webhook invia Fabrixa?

Fabrixa invia due eventi, identificati dall'intestazione x-webhook-topic: order.created, attivato quando viene effettuato un ordine tramite API o direttamente sulla piattaforma, e order.updated, attivato quando cambia lo stato dell'ordine o lo stato di evasione. Entrambi contengono l’oggetto ordine completo, pertanto è possibile utilizzare un unico gestore per l’argomento.

Quante volte Fabrixa riprova a eseguire un webhook che non è andato a buon fine?

Fabrixa riprova a inviare un webhook fino a 10 volte quando la risposta non è un codice 2xx, 301 o 302. Qualsiasi codice di errore 4xx, 5xx o timeout viene considerato un errore e attiva un nuovo tentativo; dopo il decimo tentativo fallito, il webhook viene disattivato, pertanto l’endpoint dovrebbe restituire rapidamente un codice 200 ed elaborare il payload in modo asincrono.

Quali intestazioni sono incluse in una richiesta webhook Fabrixa?

Ogni richiesta POST del webhook contiene tre intestazioni: content-type, sempre application/json; x-webhook-topic, che indica il nome dell’evento, ad esempio order.updated; e x-webhook-signature, la firma HMAC-SHA256 codificata in base64 del corpo grezzo. Utilizza l’argomento per instradare l’evento e la firma per verificarlo prima di considerare attendibile il payload.

Quali stati dell'ordine compaiono nel payload di un webhook Fabrixa?

Il payload contiene un campo "status" con quattro valori — "Completed", "Canceled", "On hold" e "Imported" — e un campo separato "fulfillment_status" con cinque valori: "Unfulfilled", "Partially fulfilled", "Scheduled", "Rejected" e "Fulfilled". Un singolo evento "order.updated" può segnalare una modifica in uno dei due campi.

Crei il Suo gestore

Configuri l'endpoint del Suo webhook.

La guida all'integrazione illustra passo dopo passo come registrare il proprio endpoint e gestire l'intero ciclo di vita dell'ordine. Il riferimento API completo contiene lo schema completo del payload.