Documentazione tecnica

Webhook

I webhook inviano automaticamente al vostro server un messaggio firmato a ogni evento della vostra organizzazione su Donoor: donazione ricevuta, rimborso, adesione, biglietto scansionato, ordine, ricevuta fiscale, bonifico… Il vostro sistema viene avvisato in pochi secondi, senza che nessuno debba esportare nulla.

api_version 2026-10-17HTTPS · JSON · HMAC-SHA25628 eventi

Presentazione

Un webhook è un indirizzo internet (un URL) che appartiene alla vostra organizzazione: quello del vostro server, del vostro CRM o di uno strumento come Make o Zapier. Non appena si verifica un evento su Donoor, Donoor invia a questo indirizzo una richiesta HTTPS POST che descrive l'evento in formato JSON.

Ogni messaggio è firmato con un segreto che conoscete solo voi: in questo modo il vostro server può verificare che provenga davvero da Donoor e che non sia stato modificato. Se il vostro server non risponde, Donoor riprova automaticamente per circa 28 ore.

Si verifica un evento

donazione, adesione, biglietto…

Donoor invia un messaggio firmato

POST · Donoor-Signature

Il vostro server

verifica, risponde 200, elabora

Pubblicità — trasmettere ogni donazione come conversione a Google Ads, GA4 o Meta, con la campagna di origine.

CRM — creare o aggiornare la scheda del donatore, del socio o dell'acquirente.

Contabilità — registrare pagamenti, rimborsi, ricevute fiscali e bonifici bancari.

Automazione — avvisare il vostro team, compilare un foglio di calcolo, inviare un'e-mail di benvenuto.

Avvio rapido

Calcolate una quindicina di minuti per ricevere il vostro primo messaggio.

  1. 1

    Preparate un indirizzo di ricezione

    Un indirizzo https raggiungibile da Internet, sul vostro server o in uno strumento come Make o Zapier. Per provare senza installare nulla, basta un indirizzo gratuito di webhook.site.

  2. 2

    Aggiungetelo nella vostra dashboard

    Impostazioni › Webhook › Aggiungi un indirizzo. Assegnategli una descrizione e scegliete gli eventi da ricevere (tutti, per impostazione predefinita).

  3. 3

    Copiate il segreto

    Inizia con whsec_. Conservatelo nella configurazione del vostro server, mai in una pagina web o in un repository di codice pubblico.

  4. 4

    Verificate la firma e rispondete 200

    Il vostro server verifica l'header Donoor-Signature e poi risponde con un codice 2xx in meno di 10 secondi. Il codice pronto da copiare si trova più in basso, in Node.js, PHP e Python.

  5. 5

    Inviate un messaggio di prova

    Pulsante Invia un test, oppure Simula un evento per ricevere uno qualsiasi dei 28 eventi con dati fittizi. Verificate poi il risultato nel registro degli invii.

Preferite un video?Il corso di formazione Webhook mostra ogni passaggio in video, dalla prima configurazione al monitoraggio degli invii.

Vengono inviati solo gli eventi che si verificano dopo l'aggiunta del vostro primo indirizzo: lo storico non viene reinviato. I messaggi contengono l'e-mail e il nome dei donatori: solo il responsabile e gli amministratori dell'organizzazione possono gestire i webhook, e il responsabile viene avvisato via e-mail a ogni indirizzo aggiunto o modificato.

Elenco degli eventi

Ogni indirizzo riceve gli eventi che avete selezionato. La colonna «Contenuto» indica gli oggetti presenti in data, descritti nella sezione Oggetti.

Pagamenti

TipoInviato quando…Contenuto
payment.succeededUn pagamento viene confermato: donazione singola o mensile (primo pagamento e ogni rinnovo), adesione, biglietto, ordine del negozio, codice QR, raccolta fondi, Tap to Pay.paymentattribution
payment.failedUna carta o un addebito viene rifiutato, ad esempio il rinnovo di una donazione mensile.paymentattribution
payment.refundedUn pagamento viene rimborsato, totalmente o parzialmente. Un messaggio per ogni rimborso.paymentrefundattribution
dispute.openedUn donatore contesta un pagamento presso la propria banca.paymentdisputeattribution
dispute.closedLa contestazione si chiude, vinta o persa.paymentdisputeattribution

Donazioni mensili

TipoInviato quando…Contenuto
subscription.createdUn donatore avvia una donazione mensile.subscriptionattribution
subscription.past_dueL'addebito del mese non è andato a buon fine: la donazione mensile è in attesa di pagamento.subscriptionattribution
subscription.reactivatedUna donazione mensile non pagata è di nuovo saldata.subscriptionattribution
subscription.canceledUna donazione mensile viene interrotta.subscriptionattribution

Ordini (adesioni, biglietteria, negozio)

TipoInviato quando…Contenuto
order.confirmedUn'adesione, dei biglietti o un acquisto nel negozio vengono confermati, anche se gratuiti.order
order.pending_approvalUna richiesta di adesione attende la vostra approvazione.order
order.rejectedAvete rifiutato una richiesta di adesione.order
order.canceledUn ordine viene annullato.order
order.expiredUn ordine non è stato pagato in tempo ed è scaduto.order
order.fulfillment_updatedUn ordine del negozio cambia fase: in preparazione, spedito (con il numero di tracciamento), consegnato o ritirato.order

Soci e biglietti

TipoInviato quando…Contenuto
membership.createdUna tessera di socio diventa attiva.membership
membership.canceledUn'adesione viene annullata.membership
ticket.checked_inUn biglietto viene scansionato all'ingresso del vostro evento.ticket
ticket.canceledUn biglietto viene annullato.ticket

Richieste di rimborso

TipoInviato quando…Contenuto
refund_request.createdUn donatore o un acquirente vi chiede un rimborso.refund_request
refund_request.updatedUna richiesta di rimborso cambia stato: con risposta, rimborsata o rifiutata.refund_request

Ricevute fiscali

TipoInviato quando…Contenuto
fiscal_receipt.issuedViene emessa una ricevuta fiscale per un donatore.fiscal_receipt
fiscal_receipt.voidedUna ricevuta fiscale viene annullata, ad esempio dopo un rimborso.fiscal_receipt

Bonifici bancari

TipoInviato quando…Contenuto
payout.paidStripe o PayPal ha trasferito denaro sul conto bancario dell'organizzazione.payout
payout.failedUn bonifico verso il conto bancario dell'organizzazione non è andato a buon fine.payout

Moduli e raccolte fondi

TipoInviato quando…Contenuto
form.createdViene creata una raccolta fondi, un evento, una formula di adesione, un negozio, un link di pagamento o un codice QR.form
campaign.goal_reachedUna raccolta fondi raggiunge il suo obiettivo.campaign

Account dell'organizzazione

TipoInviato quando…Contenuto
organization.payment_account_updatedL'account Stripe o PayPal dell'organizzazione viene attivato o sospeso.payment_account

Prova

TipoInviato quando…Contenuto
test.pingMessaggio di prova inviato dalla dashboard.message

Un ordine pagato genera due eventi: order.confirmed (l'ordine) e payment.succeeded (il denaro). Per misurare le vostre conversioni, utilizzate solo payment.succeeded; per gestire i vostri iscritti, solo order.confirmed. Iscrivete ogni indirizzo solo agli eventi di cui avete bisogno.

I messaggi partono in genere meno di due minuti dopo il fatto: Donoor attende che tutte le informazioni siano definitive (importo versato, commissioni…) prima di inviarli.

Struttura di un messaggio

Ogni messaggio è una richiesta POST il cui corpo JSON, codificato in UTF-8, ha sempre la stessa struttura esterna. Cambia solo il contenuto di data, a seconda del tipo di evento. I nomi dei campi sono in inglese, come in Stripe o HelloAsso.

CampoTipoDescrizione
idstringIdentificativo univoco dell'evento (evt_…). Resta invariato a ogni nuovo tentativo e a ogni reinvio: è ciò che permette di ignorare un duplicato.
objectstringSempre event.
typestringTipo dell'evento, ad esempio payment.succeeded.
api_versionstringVersione del formato del messaggio. Cambia solo in caso di evoluzione incompatibile.
createdstring (ISO 8601)Data di creazione dell'evento, in UTC.
livemodebooleantrue per un evento reale; false per una simulazione o nell'ambiente di test. Non contate mai un messaggio con livemode false come un pagamento reale.
organizationobjectL'organizzazione interessata: id (numero Donoor) e name.
dataobjectGli oggetti specifici dell'evento: payment, order, ticket… (vedere Oggetti).

Esempi di messaggi

{
  "id": "evt_9mK2xQpL4vR8sT1w",
  "object": "event",
  "type": "payment.succeeded",
  "api_version": "2026-10-17",
  "created": "2026-10-17T14:02:11.000Z",
  "livemode": true,
  "organization": {
    "id": 1234,
    "name": "Les Amis du Quartier"
  },
  "data": {
    "payment": {
      "id": 32631,
      "conversion_id": "32631",
      "order_id": null,
      "status": "succeeded",
      "amount": 50.6,
      "amount_cents": 5060,
      "net_amount": 49.3,
      "fees_covered_amount": 0.6,
      "provider_fee_amount": 1.3,
      "currency": "EUR",
      "refunded_amount": 0,
      "kind": "donation",
      "channel": "online",
      "form": null,
      "recurring": {
        "interval": "month",
        "sequence": "first",
        "subscription_id": 812
      },
      "payment_provider": "stripe",
      "payment_method": "card",
      "wallet": "apple_pay",
      "provider_reference": "pi_3UQZvoFXPodLa3BZ2HKqlaEw",
      "donor": {
        "email": "amina.k@exemple.fr",
        "name": "Amina K.",
        "anonymous": false
      },
      "created": "2026-10-17T14:01:02.000Z"
    },
    "attribution": {
      "parameters": {
        "utm_source": "google",
        "utm_medium": "cpc",
        "utm_campaign": "ramadan-2027",
        "gclid": "Cj0KCQjw8eTFBhCXARIsAIkiuOz"
      },
      "landing_page": "https://www.mon-association.org/faire-un-don",
      "marketing_consent": true
    }
  }
}

Oggetti

Gli oggetti che possono comparire in data. Un campo senza valore vale null. Le date sono in formato ISO 8601, in UTC.

Tutti gli importi sono in euro, con due decimali; i campi …_cents riportano lo stesso importo in centesimi. Gli importi sono quelli dell'organizzazione: il contributo facoltativo che un donatore lascia a Donoor non vi compare mai.

idintegerIdentificativo Donoor del pagamento.
conversion_idstringIdentificativo di conversione, da trasmettere a Google e Meta. Uguale a id per una donazione, al numero d'ordine per un'adesione, un biglietto o un acquisto nel negozio. È anche il transaction_id inviato dal widget nel dataLayer.
order_idstring | nullIdentificativo dell'ordine collegato (adesione, biglietteria, negozio), altrimenti null.
statusstringsucceeded, failed, refunded, partially_refunded o disputed.
amountnumberImporto pagato per l'organizzazione, comprese le commissioni coperte dal donatore. È il valore da inviare come conversione.
amount_centsintegerLo stesso importo, in centesimi.
net_amountnumber | nullImporto effettivamente versato all'organizzazione da Stripe o PayPal, al netto delle loro commissioni. null finché il fornitore non lo ha comunicato.
fees_covered_amountnumberQuota delle commissioni che il donatore ha scelto di sostenere (altrimenti 0).
provider_fee_amountnumber | nullCommissioni trattenute da Stripe o PayPal, così come le indicano.
currencystringValuta, codice ISO 4217 in maiuscolo (EUR).
refunded_amountnumberTotale già rimborsato su questo pagamento.
kindstringNatura del pagamento: donation, membership, ticket o shop.
channelstringCanale: online (pagina di donazione, widget), campaign (raccolta fondi), qr_code, tap_to_pay o offline (pagamento inserito manualmente).
formobject | nullIl modulo di origine: type (campaign, event, membership_plan, shop, qr_code), id e title. null per una donazione sulla pagina di donazione.
recurringobject | nullPer una donazione mensile: interval, sequence (first per il primo pagamento, renewal per i successivi) e subscription_id. Altrimenti null.
payment_providerstringstripe, paypal o manual.
payment_methodstring | nullMetodo di pagamento indicato dal fornitore: card, sepa_debit, card_present (Tap to Pay), paypal…
walletstring | nullapple_pay o google_pay quando il donatore ha pagato con uno di essi, altrimenti null.
provider_referencestring | nullRiferimento del pagamento presso il fornitore (pi_… per Stripe, numero d'ordine PayPal).
donorobjectIl donatore: email, name e anonymous (true se ha chiesto di restare anonimo sulla pagina pubblica; voi ricevete comunque i suoi recapiti).
createdstring (ISO 8601)Data del pagamento.

Header HTTP

Ogni richiesta contiene questi header. I nomi degli header HTTP non distinguono tra maiuscole e minuscole: il vostro server può riceverli in minuscolo.

HeaderDescrizione
Content-Typeapplication/jsonIl corpo è JSON codificato in UTF-8.
User-AgentDonoor-Webhooks/1.0 (+https://donoor.org/developpeurs/webhooks)Identifica Donoor. Non utilizzatelo per l'autenticazione: fa fede solo la firma.
Donoor-Signaturet=1792300000,v1=f0f590ea41b7…Marca temporale e firma del messaggio (vedere Verificare la firma).
Donoor-Event-Idevt_9mK2xQpL4vR8sT1wIdentico al campo id del corpo: utile per scartare un duplicato ancora prima di leggere il JSON.
Donoor-Event-Typepayment.succeededIdentico al campo type del corpo.
Donoor-Delivery-Attempt1Numero del tentativo: 1 per il primo invio, fino a 8.

Verificare la firma

Chiunque può inviare una richiesta al vostro indirizzo: verificate quindi sempre la firma prima di fidarvi di un messaggio. L'header Donoor-Signature contiene la marca temporale dell'invio (t, in secondi) e una o due firme v1. Ogni firma è un HMAC-SHA256, scritto in esadecimale, del testo «marca temporale + punto + corpo grezzo», calcolato con il vostro segreto.

Donoor-Signature: t=1792300000,v1=f0f590ea41b7f691921bb57c47f593d785d4e4d7d6c14f947848cb9d2d471bdf
  1. 1

    Leggete il corpo GREZZO della richiesta, byte per byte, prima di qualsiasi decodifica JSON.

  2. 2

    Recuperate t e tutti i valori v1 dall'header Donoor-Signature.

  3. 3

    Calcolate l'HMAC-SHA256 con il vostro segreto (whsec_ compreso) su t + «.» + corpo, quindi confrontate il risultato con ogni v1 mediante un confronto a tempo costante. Ne deve corrispondere uno solo.

  4. 4

    Rifiutate il messaggio se t si discosta di oltre 5 minuti dal vostro orologio: così un messaggio intercettato non può essere riprodotto in seguito.

// Node.js (Express) — il corpo GREZZO è indispensabile per la firma
import crypto from "node:crypto";
import express from "express";

const SECRET = process.env.DONOOR_WEBHOOK_SECRET; // whsec_…
const app = express();

app.post("/webhooks/donoor", express.raw({ type: "application/json" }), (req, res) => {
  const entete = req.get("Donoor-Signature") ?? "";
  const t = /t=(\d+)/.exec(entete)?.[1];
  const signatures = [...entete.matchAll(/v1=([0-9a-f]{64})/g)].map((m) => m[1]);
  const attendue = crypto.createHmac("sha256", SECRET).update(`${t}.${req.body}`).digest("hex");

  const valide = signatures.some((s) =>
    crypto.timingSafeEqual(Buffer.from(s, "hex"), Buffer.from(attendue, "hex")));
  const recent = t && Math.abs(Date.now() / 1000 - Number(t)) < 300;
  if (!valide || !recent) return res.status(400).end();

  const evenement = JSON.parse(req.body.toString("utf8"));
  res.status(200).end(); // rispondere subito, elaborare dopo
  traiter(evenement);    // elaborare l'evento; ignorarlo se il suo id è già stato visto
});

Esempio di verifica

Per testare il vostro codice senza attendere un messaggio reale: con questi valori dovete ottenere esattamente questa firma.

Segretowhsec_5wQpK9mZ2vX7rT4yN8bH3jL6fD1sA0cE
Marca temporale (t)1792300000
Corpo grezzo{"id":"evt_doc0exemple0signature","object":"event","type":"test.ping"}
Firma v1 attesaf0f590ea41b7f691921bb57c47f593d785d4e4d7d6c14f947848cb9d2d471bdf

L'errore più frequente: firmare il JSON dopo averlo decodificato e ricodificato. Il minimo spazio o l'ordine delle chiavi cambia la firma. Firmate sempre il corpo esattamente come è stato ricevuto.

Cambiare il segreto

Se il vostro segreto potrebbe essere stato visto da qualcun altro, sostituitelo: Impostazioni › Webhook › Segreto › Cambia il segreto.

Per 24 ore i messaggi vengono firmati con il vecchio E con il nuovo segreto: l'header contiene quindi due valori v1. Installate il nuovo segreto sul vostro server entro questo periodo; dopodiché funziona solo il nuovo.

Donoor conserva il segreto in forma cifrata. Viene mostrato solo ai responsabili e agli amministratori dell'organizzazione.

Indirizzi accettati

  • Solo indirizzi https, con un certificato valido.
  • Porta 443 (quella predefinita) o 8443.
  • L'indirizzo deve essere raggiungibile da Internet: gli indirizzi locali o privati (localhost, rete interna) vengono rifiutati.
  • I reindirizzamenti non vengono seguiti: una risposta 3xx conta come un errore. Indicate l'indirizzo finale.
  • Donoor non invia da un elenco fisso di indirizzi IP: non filtrate per IP, verificate la firma.

Rispondere a un messaggio

Rispondete con un codice 2xx (200, 201, 204…) in meno di 10 secondi. Il contenuto della vostra risposta non viene letto, ma la sua parte iniziale viene mostrata nel registro degli invii per aiutarvi nel debug.

Prima rispondete, poi elaborate: registrate il messaggio, rispondete 200, quindi eseguite le elaborazioni lunghe (chiamata a Google Ads, invio di e-mail…) in background.

Risposta del vostro serverCosa fa Donoor
2xxSuccesso: il messaggio viene contrassegnato come riuscito nel registro.
3xxErrore (reindirizzamento non seguito): nuovo tentativo più tardi.
4xx, 5xxErrore: nuovo tentativo più tardi.
nessuna rispostaPiù di 10 secondi, connessione rifiutata o certificato non valido: errore, nuovo tentativo più tardi.

Nuovi tentativi e messa in pausa

Quando un invio non va a buon fine, Donoor riprova automaticamente: 8 tentativi in totale, nell'arco di circa 28 ore.

  1. 1° invio
  2. +1 min
  3. +5 min
  4. +30 min
  5. +2 h
  6. +5 h
  7. +10 h
  8. +10 h
  • Dopo l'8° tentativo, il messaggio viene abbandonato e l'organizzazione viene avvisata via e-mail (al massimo un'e-mail per indirizzo e per giorno).
  • Un indirizzo che non accetta alcun messaggio per 3 giorni viene messo in pausa automaticamente, con un'e-mail di avviso. Si riattiva con un clic dalla dashboard.
  • Qualsiasi messaggio del registro può essere reinviato manualmente per 30 giorni: pulsante Reinvia.

Duplicati e ordine

Uno stesso evento può arrivare più di una volta: il vostro server ha elaborato il messaggio ma la sua risposta è andata persa, oppure qualcuno ha cliccato su Reinvia. L'evento mantiene allora lo stesso id: registrate gli id già elaborati e ignorate quelli che conoscete.

L'ordine di arrivo non è garantito: in caso di nuovo tentativo, un rimborso può arrivare prima del pagamento di origine. Basatevi sul campo created e sugli stati degli oggetti, non sull'ordine di ricezione.

Per una conversione pubblicitaria basta conversion_id: Google e Meta ignorano autonomamente una conversione già ricevuta con lo stesso identificativo.

Limiti

Indirizzi per organizzazione5
Tempo massimo di risposta10 secondi
Tentativi per messaggio8, in circa 28 h
Messa in pausa automaticadopo 3 giorni senza successo
Messaggi di prova20 all'ora
Simulazioni60 all'ora
Reinvii manuali100 all'ora
Messaggi al giorno20.000 per organizzazione
Conservazione del registro degli invii30 giorni
Conservazione della provenienza400 giorni

Misurare le vostre campagne

Il messaggio payment.succeeded vi fornisce l'importo, la valuta, l'identificativo di conversione e i parametri dell'annuncio di origine. Il vostro server trasmette poi la conversione alla piattaforma pubblicitaria: il metodo è affidabile anche quando il browser blocca i cookie o i tracker.

Google Analytics 4

Inviate un evento purchase tramite il Measurement Protocol: transaction_id = conversion_id, value = amount, currency = currency.

Google Ads

Con gclid (o gbraid / wbraid) in attribution.parameters: importate una conversione offline tramite l'API Google Ads, con order_id = conversion_id per evitare duplicati. Le conversioni avanzate possono utilizzare l'e-mail del donatore, con hash SHA-256.

Meta (Facebook, Instagram)

Tramite la Conversions API: event_name = Purchase, event_id = conversion_id, value e currency; fbc si costruisce con fbclid. L'e-mail del donatore viene inviata con hash SHA-256.

Senza sviluppatori

Incollate l'indirizzo di uno scenario Make o Zapier (modulo «Webhook personalizzato»): potrete poi collegarlo a Google Ads, GA4, Meta, Google Sheets o al vostro CRM, senza scrivere codice.

Widget sul vostro sito

Quando la donazione avviene nel widget Donoor integrato nel vostro sito, la pagina riceve anche l'evento donoor_payment nel dataLayer di Google Tag Manager, senza dati personali, con lo stesso transaction_id di conversion_id: browser e server conteggiano una sola conversione.

CRM e strumenti interni

Utilizzate donor.email come chiave per ritrovare la scheda, kind per sapere se si tratta di una donazione, un'adesione, un biglietto o un acquisto, e recurring per individuare i vostri donatori mensili.

Esempio: una donazione trasmessa a GA4

POST https://www.google-analytics.com/mp/collect?measurement_id=G-XXXXXXX&api_secret=…

{
  "client_id": "donoor.32631",
  "events": [{
    "name": "purchase",
    "params": {
      "transaction_id": "32631",   // data.payment.conversion_id
      "value": 50.6,               // data.payment.amount
      "currency": "EUR",           // data.payment.currency
      "campaign": "ramadan-2027"   // data.attribution.parameters.utm_campaign
    }
  }]
}

Provenienza dei pagamenti

Aggiungete i vostri parametri di tracciamento al link dei vostri annunci, sia che porti alla vostra pagina Donoor sia alla pagina del vostro sito che mostra il widget Donoor:

https://donoor.org/pay/mon-association?utm_source=google&utm_campaign=ramadan-2027&gclid=Cj0KCQjw…
  • Tutti i parametri del link vengono conservati fino al pagamento, anche se il donatore apre la pagina di pagamento in una nuova scheda.
  • Arrivano in data.attribution di payment.succeeded e degli altri eventi dello stesso pagamento (rimborso, contestazione, donazione mensile).
  • Per il rinnovo di una donazione mensile, la provenienza è quella del primo pagamento.
  • I parametri che sembrano dati sensibili (e-mail, password, token, telefono, IBAN…) e i parametri tecnici di Donoor vengono scartati. Al massimo 25 parametri, 300 caratteri per valore.
  • attribution vale null quando il donatore non è arrivato tramite un link con parametri.

Consenso

attribution.marketing_consent indica se il donatore ha accettato i cookie pubblicitari su Donoor: true, false, oppure null se non è noto.

In Europa, Google e Meta chiedono di rispettare questa scelta (Modalità di consenso di Google, GDPR). La vostra organizzazione resta responsabile dell'uso che fa di questi dati: non inviate l'e-mail di un donatore che ha rifiutato e ricordatevi di menzionare questo trattamento nella vostra informativa sulla privacy.

Test, simulazioni e registro

Il pulsante Invia un test, presente su ogni indirizzo, invia immediatamente un evento test.ping firmato come gli altri. Serve a verificare che il vostro server sia raggiungibile e che la vostra verifica della firma sia corretta.

Il pulsante Simula un evento, su ogni indirizzo, invia uno qualsiasi dei 28 eventi nel formato esatto, con dati fittizi e livemode impostato su false, solo a quell'indirizzo. Un'anteprima mostra il messaggio prima dell'invio. Nessun pagamento viene effettuato e nessun dato reale viene inviato.

Per sviluppare in tranquillità, attivate Indirizzo di test nella finestra dell'indirizzo: riceverà allora solo simulazioni e messaggi di test, mai eventi reali. Collegatevi il server di sviluppo del vostro team e tenete un altro indirizzo per la produzione.

Il registro degli invii mostra ogni messaggio degli ultimi 30 giorni: evento, stato, numero di tentativi, codice HTTP e inizio della risposta del vostro server, oltre al contenuto esatto inviato. Filtrate per riusciti, non riusciti o in attesa e reinviate un messaggio con un clic.

Ambiente di test

Il simulatore basta per sviluppare i vostri webhook. Per testare anche il percorso di pagamento completo (pagina di donazione, carta di test, ricevuta), Donoor mette a disposizione un ambiente di test separato su sandbox.donoor.org. Le sue pagine non sono indicizzate dai motori di ricerca.

ProduzioneTest
Sitodonoor.orgsandbox.donoor.org
Dashboarddashboard.donoor.orgdashboard-sandbox.donoor.org
Pagamentirealifittizi, carta 4242 4242 4242 4242
livemodetruefalse
E-mailnormalioggetto preceduto da «[TEST]»
  1. Create un account di organizzazione da sandbox.donoor.org (pulsante Registra la mia organizzazione): non contiene alcun dato reale.
  2. Collegate Stripe in Impostazioni › Processo di raccolta. In modalità test, Stripe accetta informazioni fittizie (codice SMS: 000000): non serve alcun conto bancario reale.
  3. La vostra pagina di pagamento di test è subito online, ad esempio sandbox.donoor.org/pay/la-vostra-organizzazione, come le vostre raccolte fondi, biglietterie e negozi di test.
  4. Aggiungete il vostro indirizzo webhook in Impostazioni › Webhook, come in produzione.
  5. Fate una donazione su questa pagina con la carta di test 4242 4242 4242 4242 (qualsiasi data futura, qualsiasi codice): riceverete veri messaggi firmati, con livemode impostato su false. Il segreto di test è diverso da quello di produzione.

Versioni del formato

Il campo api_version indica la versione del formato del messaggio. Cambia solo in caso di evoluzione incompatibile (un campo rinominato o eliminato, un significato modificato), annunciata in anticipo.

Senza cambiare versione, Donoor può aggiungere nuovi eventi e nuovi campi: il vostro codice deve ignorare ciò che non conosce.

VersioneModifiche
2026-10-17Prima versione pubblica: 28 eventi, firma HMAC-SHA256, provenienza dei pagamenti.

Risoluzione dei problemi

Non ricevo alcun messaggio

Verificate nella dashboard che l'indirizzo sia Attivo e che l'evento atteso sia selezionato, quindi inviate un messaggio di prova: il registro mostrerà la risposta del vostro server o l'errore riscontrato (certificato, timeout, indirizzo irraggiungibile). Il vostro firewall deve accettare le richieste in entrata da Internet.

La firma non corrisponde mai

In 9 casi su 10, il corpo è stato decodificato e poi ricodificato prima del calcolo: utilizzate il corpo grezzo. Verificate anche di utilizzare il segreto completo, prefisso whsec_ compreso, e quello dell'indirizzo giusto (ogni indirizzo ha il proprio segreto). L'esempio di verifica riportato sopra vi permette di testare il vostro codice.

Il registro indica una risposta 301 o 302

Il vostro server reindirizza la richiesta (spesso da http a https, oppure verso un indirizzo con o senza barra finale). I reindirizzamenti non vengono seguiti: indicate l'indirizzo finale esatto.

Ricevo due volte lo stesso pagamento

È normale in caso di nuovo tentativo o di reinvio: l'evento ha lo stesso id, ignoratelo. Se gli id sono diversi, si tratta di due eventi distinti, ad esempio order.confirmed e payment.succeeded per lo stesso ordine.

Non ricevo i pagamenti precedenti all'aggiunta del mio indirizzo

È voluto: vengono inviati solo gli eventi che si verificano dopo l'aggiunta del primo indirizzo. Per lo storico, utilizzate le esportazioni della dashboard.

L'importo non corrisponde a quanto pagato dal donatore

amount è l'importo per l'organizzazione: il contributo facoltativo lasciato a Donoor non è incluso, mentre le commissioni coperte dal donatore sì. Ciò che arriva effettivamente sul vostro conto bancario è net_amount, al netto delle commissioni di Stripe o PayPal.

Avete una domanda?

Il nostro team affianca il vostro team tecnico durante l'integrazione.

Scriveteci