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. Come Service Provider ricevente, segue un webhook separato con topic MessageLevelStatusSent non appena la PSB invia per proprio conto un MLS al SP mittente. Utilizzare questo topic per monitorare se le proprie risposte MLS auto-emesse vengono consegnate correttamente.
MessageLevelStatusSent non è una conferma di una fattura inviata. Il topic riguarda un MLS che la PSB invia in risposta a un documento ricevuto (l'utente, come SP ricevente, rimanda la notifica di stato al mittente originale), non una fattura elettronica inviata autonomamente. In presenza di molte notifiche MessageLevelStatusSent a fronte di poche fatture inviate: verificare se l'hook ascolta il wildcard *sent invece di specificamente InvoiceSent (vedere Topic wildcard).
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.Oltre ai topic specifici, è possibile utilizzare anche pattern wildcard per intercettare più tipi di evento con un unico hook.
Send*Send*sent / *SentSent: InvoiceSent, InvoiceResponseSent, OrderSent, MessageLevelStatusSent, HookSent*ReceivedInvoiceReceived, OrderReceived, InvoiceResponseReceived, ecc.)Invoice*Send* non è uguale a *sent. Send* corrisponde ai topic che iniziano con Send; questo pattern non compare tra i topic standard PSB. Per intercettare tutti gli eventi "sent" (InvoiceSent, MessageLevelStatusSent, HookSent, ecc.), usare *sent. InvoiceSentRetry e InvoiceSentError non terminano in Sent e quindi non sono coperti dal suffisso *sent.
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 deduplicazioneInvoiceReceived), ma non è registrato alcun hook su quel topic (mai configurato, o rimosso nel frattempo)InvoiceReceived è presente nei topic? Senza un hook su quel topic non appare alcun HookSentError, quindi l'assenza di errori non prova che l'hook sia attivoMessageLevelStatusSent a fronte di poche fatture inviatemailto:) o il webhook HTTP ascolta il wildcard *sent invece di InvoiceSentInvoiceSent (stessa modifica sul mail-hook e sul webhook HTTP); vedere Topic wildcardInvoiceReceived)Il PSB può ricevere una fattura d'acquisto senza inoltrarla alla parte destinataria. Il topic InvoiceReceived significa che il PSB ha ricevuto la fattura; senza un hook su quel topic, non viene inviato nulla a un endpoint.
HookSentError esiste solo se è configurato un hook che non riesce a consegnare.Correggere un hook mancante aggiornando l'hook esistente invece di eliminarlo e ricrearlo.
Il 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.Prima linea: interruzione lato cliente vs. problema tecnico (accettazione e produzione)
HookSentError, un HTTP 404 ripetuto o "endpoint offline"/"ambiente di accettazione spento" può anche derivare dal fatto che il cliente spegne temporaneamente l'endpoint di accettazione o produzione (sviluppo, manutenzione). Questo non è un incidente della piattaforma eConnect.
HookSentError, endpoint offline o HTTP 404 sull'endpoint webhook configurato dal cliente. Spesso visibile come il testo esatto Response status code does not indicate success: 404 (Not Found) (di solito una HttpRequestException .NET sulla richiesta hook in uscita). Si tratta di un 404 proveniente dall'endpoint stesso del cliente (spento o percorso errato), non dell'errore Peppol PartyId not found in fase di invio (404 SMP), né di un 404 di risorsa REST dalla gestione degli errori dell'API.HookSentError sopra (DNS/SSL/timeout, log, monitoraggio, recupero batch).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.
HookSentError compare dopo che il PSB ha tentato per 5 giorni senza risposta 2xx. Un HTTP 404 ripetuto o il messaggio che l'endpoint è offline deriva spesso dal fatto che il cliente spegne temporaneamente l'endpoint di accettazione o produzione (sviluppo, manutenzione) - questo non è un incidente della piattaforma eConnect. Confermare prima se l'interruzione è intenzionale e temporanea; in tal caso non serve alcuna ulteriore azione finché l'endpoint non è di nuovo raggiungibile. Gli eventi mancati possono comunque essere recuperati tramite il batch endpoint entro la finestra di 5 giorni.
Questo è un comportamento previsto se il mail-hook (mailto:) o il webhook HTTP ascolta il wildcard *sent invece di specificamente InvoiceSent. MessageLevelStatusSent non è una conferma di una fattura inviata autonomamente, ma di un MLS che la PSB invia in risposta a un documento ricevuto, e rientra nel pattern *sent insieme a InvoiceSent, OrderSent e HookSent. Se si desiderano notifiche solo per l'invio di fatture, modificare la configurazione del topic in InvoiceSent. InvoiceSentRetry e InvoiceSentError non terminano in Sent e quindi non sono coperti da *sent.