Vai al contenuto
OmniChannels.ai

Integrare una API di messaggistica: REST, SMPP e webhook

Guida per sviluppatori all'integrazione di una API di messaggistica: REST, SMPP e webhook, autenticazione, idempotenza, rapporti di consegna, retry e test.

Aggiornato 9 min di lettura

Di OmniChannels.ai Editorial Team · Revisione di BroadNet Messaging Solutions Team

Integrazione

Risposta breve

Usate una API REST per inviare messaggi dalle applicazioni, SMPP solo per SMS ad alto volume dove gestite già un'infrastruttura di livello telecom, e i webhook per ricevere rapporti di consegna e messaggi in ingresso. Autenticate ogni chiamata, inviate una chiave di idempotenza con ogni invio così i retry non duplicano mai i messaggi, trattate lo stato di consegna come asincrono, rallentate sugli errori HTTP 429 e 5xx e testate i percorsi di errore in una sandbox prima della produzione.

In questa pagina
  1. Quale interfaccia usare: REST, SMPP o webhook?
  2. Come autenticarsi?
  3. Come inviare un messaggio in sicurezza?
  4. Perché l'idempotenza è importante?
  5. Come funzionano i rapporti di consegna?
  6. Come gestire retry e limiti di frequenza?
  7. Come testare prima della messa online?
  8. Esempio pratico: un servizio di OTP e notifiche d'ordine
  9. Quali sono gli errori di integrazione più comuni?
  10. Come vi aiuta OmniChannels.ai

Punti chiave

  • REST si adatta alla maggior parte delle integrazioni applicative; SMPP è un protocollo binario persistente pensato per il throughput degli SMS tra sistemi di messaggistica.
  • Una richiesta di invio accettata significa che il messaggio è stato messo in coda, non consegnato; lo stato finale arriva dopo tramite webhook o ricevute di consegna SMPP.
  • HTTP 429 Too Many Requests è definito nell'RFC 6585; i client dovrebbero rallentare e rispettare l'eventuale intestazione Retry-After.
  • Le chiavi di idempotenza permettono di riprovare in sicurezza un invio andato in timeout senza inviare al cliente due volte lo stesso messaggio.
  • Meta firma i webhook della WhatsApp Cloud API, così chi li riceve può verificare che gli eventi provengano davvero da Meta.

Questa guida è rivolta a sviluppatori backend, solution architect e CTO che integrano un'applicazione con un provider di messaggistica per WhatsApp, SMS o email. Spiega quale interfaccia usare e come gestire autenticazione, idempotenza, rapporti di consegna, retry, limiti di frequenza e test, con forme di richieste e risposte a titolo illustrativo. Per sincronizzare le conversazioni in un CRM, vedi la guida complementare sul collegare un CRM con i webhook.

Quale interfaccia usare: REST, SMPP o webhook?

Usate REST per inviare, i webhook per ricevere e SMPP solo per SMS ad alto volume dove gestite già SMPP. Sono complementari più che concorrenti: la maggior parte delle integrazioni combina chiamate REST in uscita con webhook in ritorno.

Aspetto API REST SMPP Webhook
Direzione La vostra app → provider Bidirezionale su un'unica sessione Provider → la vostra app
Trasporto Richiesta/risposta HTTPS Sessione TCP persistente, PDU binarie HTTPS POST al vostro endpoint
Canali WhatsApp, SMS, email, altri Solo SMS Eventi di tutti i canali
Uso tipico Inviare messaggi, gestire template, interrogare lo stato SMS massivi tra sistemi di messaggistica Stato di consegna, messaggi in ingresso
Punti di forza Semplice, compatibile con i firewall, payload ricchi Throughput, windowing, standard telecom Tempo reale, nessun polling
Da tenere presente Limiti di frequenza, timeout Gestione delle sessioni, bind, keep-alive Retry, duplicati, sicurezza

Le sessioni SMPP (Short Message Peer-to-Peer) iniziano con un bind (transmitter, receiver o transceiver), inviano messaggi con submit_sm, ricevono ricevute di consegna e SMS in ingresso tramite deliver_sm e restano attive con enquire_link. È efficiente ma operativamente più pesante di HTTPS.

Come autenticarsi?

Usate il metodo più forte offerto dal provider, tenete i segreti fuori dal codice e autenticate entrambe le direzioni.

  • Chiamate in uscita: chiavi API o bearer token OAuth 2.0 inviati nell'intestazione Authorization su TLS. Conservateli in un gestore di segreti e ruotateli con regolarità e dopo cambi di personale.
  • SMPP: system ID e password al momento del bind, di solito limitati a indirizzi IP consentiti e, dove supportato, su TLS.
  • Webhook in ingresso: verificate la firma di ogni evento. Meta firma i payload dei webhook della WhatsApp Cloud API con una firma HMAC-SHA256 nell'intestazione X-Hub-Signature-256, calcolata con il segreto della vostra app; i provider di solito offrono uno schema simile. Calcolate la firma sul corpo grezzo prima del parsing.

Usate credenziali separate per ambiente, così una chiave di prova compromessa non può inviare traffico di produzione.

Come inviare un messaggio in sicurezza?

Inviate tramite una coda, includete una chiave di idempotenza e trattate la risposta come "accettato", non "consegnato".

Richiesta di invio a titolo illustrativo

La forma seguente è pseudo-JSON a scopo illustrativo, non l'API di uno specifico provider.

POST /v1/messages
Authorization: Bearer <token>
Idempotency-Key: 7f3c9a2e-order-55821-shipped

{
  "channel": "whatsapp",
  "to": "+9715XXXXXXXX",
  "template": {
    "name": "order_shipped",
    "language": "ar",
    "variables": ["Layla", "55821", "15 March"]
  },
  "client_reference": "order-55821",
  "callback_url": "https://api.example.com/webhooks/messaging"
}

Risposta a titolo illustrativo

202 Accepted

{
  "message_id": "msg_01HZX...",
  "status": "accepted",
  "client_reference": "order-55821",
  "created_at": "2026-10-09T12:00:00Z"
}

Memorizzate subito message_id rispetto al vostro riferimento. Tutto ciò che accade dopo arriva in modo asincrono.

Perché l'idempotenza è importante?

Perché le reti vanno in timeout dopo che il server ha già agito. Se la richiesta di invio va in timeout e riprovate alla cieca, il cliente può ricevere due OTP o due avvisi di spedizione. Una chiave di idempotenza permette al server di riconoscere il retry e restituire il risultato originale.

Regole che funzionano:

  1. Derivate la chiave dall'evento di business (ad esempio ID ordine più tipo di evento), non da un valore casuale per tentativo.
  2. Riutilizzate la stessa chiave per ogni retry dello stesso invio.
  3. Conservate le chiavi abbastanza a lungo da coprire la vostra finestra di retry.
  4. Se il provider non supporta le chiavi, deduplicate dal vostro lato prima di inviare.

La bozza IETF dell'intestazione Idempotency-Key standardizza questo schema per le API HTTP; le implementazioni dei provider variano, quindi leggete la loro documentazione.

Come funzionano i rapporti di consegna?

Lo stato di consegna arriva dopo come eventi: da webhook per WhatsApp e la maggior parte delle API REST, e da ricevute deliver_sm su SMPP. Il significato degli stati cambia per canale; la nostra guida agli stati di consegna dei messaggi spiega ciascuno.

Webhook di stato a titolo illustrativo

POST /webhooks/messaging
X-Signature: sha256=<hmac>

{
  "event_id": "evt_9c1...",
  "type": "message.status",
  "message_id": "msg_01HZX...",
  "client_reference": "order-55821",
  "status": "delivered",
  "timestamp": "2026-10-09T12:00:04Z",
  "error": null
}

Gestite gli eventi di stato in modo difensivo:

  • Deduplicate su event_id, oppure su ID del messaggio più stato.
  • Non retrocedete mai un messaggio da letto a consegnato quando gli eventi arrivano fuori ordine.
  • Rispondete subito con 2xx, poi elaborate da una coda.
  • Registrate i codici di errore per i messaggi falliti e decidete quali sono riprovabili.
  • Aspettatevi lacune: alcune rotte SMS restituiscono ricevute limitate e lo stato di lettura dipende dal canale e dalle impostazioni dell'utente.

Come gestire retry e limiti di frequenza?

Riprovate solo ciò che può riuscire, rallentate in modo esponenziale con jitter e rispettate i segnali del server.

Risposta Significato Azione
2xx Accettato Memorizzare l'ID, attendere lo stato
400 / 422 Richiesta non valida (numero, template, variabili) Non riprovare; correggere i dati
401 / 403 Problema di autenticazione o permessi Non riprovare; avvisare
409 Conflitto, spesso una chiave di idempotenza duplicata Recuperare il risultato originale
429 Troppe richieste (RFC 6585) Attendere Retry-After o rallentare
5xx / timeout Errore del server o di rete Riprovare con la stessa chiave di idempotenza e backoff

L'RFC 9110 definisce l'intestazione Retry-After, che può riportare secondi o una data. Mettete un limitatore di frequenza lato client davanti ai vostri invii, così restate sotto i limiti documentati dal provider anziché scoprirli tramite errori. WhatsApp prevede anche limiti lato Meta su quanti clienti unici potete contattare, descritti in limiti di messaggistica e valutazione di qualità.

Come testare prima della messa online?

Testate i percorsi di errore, non solo il percorso felice.

Checklist pre-produzione

  1. Inviate ogni template con valori di lunghezza reale, compreso testo in arabo.
  2. Forzate un timeout e confermate che il retry non duplichi.
  3. Inviate a un numero non valido e confermate che l'errore sia gestito senza retry.
  4. Riproducete un webhook due volte e fuori ordine; confermate un unico stato finale.
  5. Inviate un webhook con una firma errata; confermate che venga rifiutato.
  6. Provocate dei 429 con un test di carico sulla sandbox, se consentito.
  7. Ruotate una chiave API e confermate l'assenza di interruzioni.
  8. Verificate che i log contengano ID dei messaggi ma non i corpi completi dei messaggi né i codici OTP.
  9. Eseguite un piccolo pilota in produzione con numeri interni su ogni canale.

Le sandbox raramente riproducono con esattezza il comportamento di operatori e Meta, quindi mantenete il monitoraggio nelle prime settimane di produzione.

Esempio pratico: un servizio di OTP e notifiche d'ordine

"Qafilah Logistics" (fittizia), azienda di spedizioni in Arabia Saudita, invia aggiornamenti d'ordine su WhatsApp con riserva SMS e OTP di autenticazione.

  • Architettura: gli eventi d'ordine vanno in una coda; un worker di invio chiama l'API REST con una chiave di idempotenza shipment-id:event.
  • Fallback: se WhatsApp restituisce uno stato di fallito per un utente non WhatsApp, il worker invia un SMS con una nuova chiave, shipment-id:event:sms.
  • OTP: i codici scadono in fretta, quindi gli invii OTP non vengono riprovati dopo la finestra di scadenza; l'utente richiede un nuovo codice. Vedi la guida ai messaggi di autenticazione OTP.
  • Ricevute: un ricevitore di webhook verifica le firme, deduplica gli eventi e aggiorna una tabella di stato che non retrocede mai.
  • Limiti: un limitatore a token bucket mantiene la frequenza di invio per canale sotto i limiti documentati.

Quali sono gli errori di integrazione più comuni?

  • Considerare "accettato" come "consegnato".
  • Riprovare con una nuova chiave di idempotenza a ogni tentativo.
  • Eseguire elaborazioni pesanti dentro la richiesta del webhook.
  • Saltare la verifica della firma sui webhook.
  • Riprovare in ciclo gli errori di validazione 4xx.
  • Registrare nei log i codici OTP e il contenuto completo dei messaggi.
  • Usare credenziali di produzione negli ambienti di prova.

Come vi aiuta OmniChannels.ai

OmniChannels.ai, sviluppata da BroadNet Technologies, offre una API REST/JSON documentata pubblicamente con specifica OpenAPI 3.1 e un SDK TypeScript, che copre SMS, WhatsApp, RCS, Messenger, Instagram, Telegram, email e push, compresi i template di autenticazione WhatsApp con OTP one-tap, zero-tap e copy-code. I webhook riportano gli stati di consegna in un unico formato normalizzato, SMPP 3.4 su TLS serve gli SMS ad alto volume e un server MCP collega gli agenti IA. I rapporti di consegna (DLR) con filtri ed esportazione CSV aiutano a riconciliare ciò che la vostra integrazione ha inviato. Iniziate dalla documentazione per sviluppatori e dalla guida rapida.

Domande frequenti

Conviene integrare un provider di messaggistica tramite REST o SMPP?

Scegliete REST per quasi tutti i casi d'uso applicativi: funziona su HTTPS, è semplice da proteggere e supporta canali ricchi come WhatsApp. Scegliete SMPP quando inviate grandi volumi di SMS, gestite già client SMPP e avete bisogno di una connessione persistente con windowing. SMPP vale solo per gli SMS; WhatsApp, email e canali social usano API HTTP.

Che cos'è una chiave di idempotenza in una API di messaggistica?

Una chiave di idempotenza è un valore univoco che il vostro sistema invia con una richiesta, così il server può riconoscere le ripetizioni. Se la chiamata di invio va in timeout e riprovate con la stessa chiave, il provider restituisce il risultato originale anziché inviare un secondo messaggio. L'IETF ha una bozza di standard per un'intestazione HTTP Idempotency-Key, ma i provider implementano le chiavi in modi diversi, quindi consultate la documentazione.

Perché a volte i rapporti di consegna arrivano fuori ordine?

Gli eventi di stato sono generati da sistemi diversi, come operatori, Meta e il provider, e consegnati su reti con retry. Un evento di lettura può arrivare prima di un evento di consegna e i duplicati sono normali. Conservate ogni stato con il suo timestamp, non riportate mai un messaggio da uno stato successivo a uno precedente e deduplicate per ID del messaggio e stato.

Come deve gestire i limiti di frequenza la mia applicazione?

Leggete i limiti documentati dal provider, mettete in coda gli invii in uscita anziché lanciarli direttamente dalle richieste degli utenti e usate un limitatore a token bucket o simile dal vostro lato. Quando ricevete HTTP 429, fermatevi e riprovate dopo il tempo indicato nell'intestazione Retry-After oppure con backoff esponenziale e jitter. Non riprovate gli errori di validazione 4xx.

Cosa testare in una sandbox di messaggistica?

Testate errori di autenticazione, numeri di telefono non validi, errori nelle variabili dei template, timeout con retry idempotenti, webhook duplicati e fuori ordine, risposte ai limiti di frequenza, messaggi lunghi e in arabo e la verifica della firma dei webhook. Poi eseguite un piccolo pilota in produzione con numeri reali, perché le sandbox raramente riproducono con esattezza il comportamento di operatori o Meta.

Fonti

  1. Cloud API webhooks — Meta for Developers
  2. RFC 6585: Additional HTTP Status Codes (429 Too Many Requests)
  3. RFC 9110: HTTP Semantics
  4. The Idempotency-Key HTTP Header Field — IETF draft
  5. SMPP protocol specification resources — SMPP.org