Configurare i webhook nella PSB: topic, sicurezza HMAC SHA256 e IP whitelisting.
I webhook sono il metodo principale per ricevere notifiche in tempo reale dalla PSB. Ad ogni evento rilevante, una fattura ricevuta, una modifica di stato, una conferma di consegna, la PSB invia una richiesta HTTP POST al proprio endpoint con i dettagli dell'evento.
Si registra un webhook (un "hook") nella PSB con un URL e un topic. La PSB invia quindi tutti gli eventi di quel topic al proprio URL. Ogni evento contiene i dati rilevanti come payload JSON.
Nessuna interfaccia disponibile: al momento non è possibile configurare un hook tramite l'interfaccia utente della piattaforma. Gli hook vengono impostati tramite l'API o tramite il supporto eConnect. Un'interfaccia self-service per gli hook è nella roadmap (prevista per il T4 2026) e farà parte di Control (Platform 2.0): gli utenti potranno quindi creare, modificare ed eliminare gli hook autonomamente. Fino ad allora, non è previsto alcun articolo passo-passo per la configurazione manuale degli hook tramite l'API.
Registrare un hook tramite l'API:
POST /api/v1/hook
I principali elementi di configurazione:
InvoiceReceived)Nota: evita di eliminare e ricreare rapidamente hook per lo stesso partyId e topic. A causa di race condition nell'elaborazione dei task, questo può temporaneamente risultare in nessun hook attivo, causando la mancata consegna degli eventi. Attendi brevemente dopo aver eliminato un hook prima di crearne uno nuovo, oppure utilizza un aggiornamento anziché eliminare + creare.
Vuoi aggiungere un topic aggiuntivo (ad es. InvoiceReceived) a un hook esistente? Aggiorna la configurazione webhook esistente tramite la normale API /hook in modo che il topic desiderato sia incluso nell'array topics:
{
"topics": ["InvoiceReceived"]
}
Aggiorna l'hook esistente invece di eliminarlo e ricrearlo. Eliminare e ricreare introduce una race condition in cui gli eventi potrebbero temporaneamente non essere consegnati (vedi l'avviso sopra).
Non è self-service per i clienti non tecnici. Aggiungere un topic a un hook esistente è un'operazione tecnica: chi la esegue deve sapere dove deve puntare il webhook (l'URL dell'endpoint) e capire cos'è un webhook. Un cliente non tecnico generalmente non può farlo in modo autonomo. Coinvolgi qualcuno con competenze tecniche (IT del cliente o supporto eConnect).
InvoiceReceivedInvoiceSentInvoiceSentErrorInvoiceSentRetryInvoiceResponseReceivedMessageLevelStatusReceivedMessageLevelStatusSentOrderReceivedMLS (Message Level Status) è il successore del precedente MLR e fornisce alla parte mittente un feedback sulla ricezione e l'elaborazione di un documento. L'MLS non è abilitato di default e deve essere configurato per party tramite la capability reviews nella configurazione SMP. Una volta abilitato, la PSB lo gestisce automaticamente: come Service Provider ricevente, la PSB invia un messaggio MLS al mittente dopo la ricezione e la consegna.
Quando si inviano documenti tramite la PSB, si riceve il feedback MLS dalla parte ricevente come evento webhook sul topic MessageLevelStatusReceived. Il payload contiene tra l'altro:
documentIdrefToDocumentIddetails.statusCodeAP (accepted), RE (rejected), AB (acknowledged)details.descriptionPer ricevere messaggi MLS, l'hook Peppol deve contenere il campo mlsType. I valori possibili sono ALWAYS_SEND (inviare sempre MLS di ritorno) e FAILURE_ONLY (solo in caso di rifiuto).
Suggerimento: è possibile recuperare il documento MLS completo tramite
GET /api/v1-beta/{partyId}/generic/{documentId}/download, ma il payload del webhook contiene generalmente informazioni sufficienti.
La PSB protegge tutte le consegne webhook con firme HMAC SHA256. Ad ogni richiesta la PSB invia l'header:
X-EConnect-Signature: sha256={handtekening}
Per verificare la firma:
X-EConnect-Signature.Controllare anche il campo sentOn nel payload. Se questo timestamp è più vecchio di 5 minuti, rifiutare la richiesta. Questo previene attacchi replay in cui una richiesta intercettata viene riprodotta successivamente.
Oltre alla verifica HMAC, la PSB offre livelli di sicurezza aggiuntivi:
104.40.188.59 e 104.47.148.207)Se sono configurati più hook, la PSB determina quale hook utilizzare in base a:
&& aggiuntiva vince su un filtro più corto senza quella clausola. Questo evita la doppia consegna senza richiedere che i filtri siano reciprocamente esclusivi.Di seguito sono riportati i problemi più comuni con i webhook e come risolverli.
sha256=sentOn è più vecchio di 5 minutiHookSentError (vedere sotto); recuperare gli eventi mancati tramite il batch endpointX-EConnect-Delivery (UUID univoco) per la deduplicazioneIl PSB invia eventi webhook (ad es. InvoiceReceived quando si riceve una fattura elettronica) all'endpoint configurato. Se l'endpoint non è raggiungibile - a causa di un timeout, un errore SSL o un errore DNS come No such host is known - il PSB riprova con backoff esponenziale per 5 giorni (timeout 100 sec. per tentativo). Ogni tentativo genera un evento HookSentRetry; dopo 5 giorni senza risposta 2xx, viene emesso HookSentError come stato finale e il PSB smette di riprovare.
Conseguenza: una fattura elettronica ricevuta non verrà consegnata al cliente finché l'endpoint è irraggiungibile, senza che il cliente se ne accorga direttamente. Azioni consigliate:
HookSentError in modo che un errore di consegna definitivo venga segnalato attivamente anziéé passare inosservato. Considerare anche HookSentRetry per il rilevamento precoce.Prenda il corpo JSON grezzo della richiesta, calcoli l'hash HMAC SHA256 con il secret indicato al momento della creazione dell'hook e lo confronti con il valore nell'header X-EConnect-Signature (dopo il prefisso sha256=). Se corrispondono, sa che la richiesta proviene dalla PSB e non è stata modificata durante il transito.
Verifichi che sentOn non sia più vecchio di 5 minuti. Se il timestamp è troppo vecchio, rifiuti la richiesta. Questo previene attacchi di tipo replay, in cui una richiesta precedentemente intercettata viene reinviata in un secondo momento, anche se la firma è tecnicamente valida.
Implementi un'elaborazione idempotente dalla propria parte, poiché la PSB può in rari casi consegnare un evento più di una volta. Inoltre, restituisca rapidamente uno stato HTTP 2xx: qualsiasi altra risposta viene considerata un errore e attiva un retry. Per elaborazioni pesanti, confermi prima la ricezione e poi elabori tramite una coda.