Apresentação
Um webhook é um endereço da internet (um URL) pertencente à sua associação: o do seu servidor, do seu CRM ou de uma ferramenta como o Make ou o Zapier. Assim que ocorre um evento na Donoor, a Donoor envia para esse endereço um pedido HTTPS POST que descreve o evento em formato JSON.
Cada mensagem é assinada com um segredo que só você conhece: o seu servidor pode assim verificar que vem mesmo da Donoor e que não foi alterada. Se o seu servidor não responder, a Donoor tenta novamente automaticamente durante cerca de 28 horas.
Um evento acontece
donativo, adesão, bilhete…
A Donoor envia uma mensagem assinada
POST · Donoor-Signature
O seu servidor
verifica, responde 200, trata
Publicidade — transmitir cada donativo como conversão ao Google Ads, GA4 ou Meta, com a campanha de origem.
CRM — criar ou atualizar a ficha do doador, do associado ou do comprador.
Contabilidade — registar pagamentos, reembolsos, recibos de donativo e transferências bancárias.
Automatização — avisar a sua equipa, preencher uma folha de cálculo, enviar um e-mail de boas-vindas.
Início rápido
Conte cerca de quinze minutos para receber a sua primeira mensagem.
- 1
Prepare um endereço de receção
Um endereço https acessível pela Internet, no seu servidor ou numa ferramenta como o Make ou o Zapier. Para experimentar sem instalar nada, basta um endereço gratuito do webhook.site.
- 2
Adicione-o ao seu painel
Definições › Webhooks › Adicionar um endereço. Dê-lhe uma descrição e escolha os eventos a receber (todos, por predefinição).
- 3
Copie o segredo
Começa por whsec_. Guarde-o na configuração do seu servidor, nunca numa página web ou num repositório de código público.
- 4
Verifique a assinatura e responda 200
O seu servidor verifica o cabeçalho Donoor-Signature e responde com um código 2xx em menos de 10 segundos. O código pronto a copiar está mais abaixo, em Node.js, PHP e Python.
- 5
Envie uma mensagem de teste
Botão Enviar um teste, ou Simular um evento para receber qualquer um dos 28 eventos com dados fictícios. Verifique depois o resultado no registo de envios.
Só são enviados os eventos que ocorrem depois de acrescentar o seu primeiro endereço: o histórico não é reenviado. As mensagens contêm o e-mail e o nome dos doadores: só o responsável e os administradores da associação podem gerir os webhooks, e o responsável é avisado por e-mail a cada endereço acrescentado ou alterado.
Lista dos eventos
Cada endereço recebe os eventos que assinalou. A coluna « Conteúdo » indica os objetos presentes em data, descritos na parte Objetos.
Pagamentos
| Tipo | Enviado quando… | Conteúdo |
|---|---|---|
payment.succeeded | Um pagamento é confirmado: donativo pontual ou mensal (primeiro pagamento e cada renovação), adesão, bilhete, encomenda da loja, código QR, angariação, Tap to Pay. | paymentattribution |
payment.failed | Um cartão ou um débito direto é recusado, por exemplo na renovação de um donativo mensal. | paymentattribution |
payment.refunded | Um pagamento é reembolsado, na totalidade ou em parte. Uma mensagem por reembolso. | paymentrefundattribution |
dispute.opened | Um doador contesta um pagamento junto do seu banco. | paymentdisputeattribution |
dispute.closed | O litígio está encerrado, ganho ou perdido. | paymentdisputeattribution |
Donativos mensais
| Tipo | Enviado quando… | Conteúdo |
|---|---|---|
subscription.created | Um doador inicia um donativo mensal. | subscriptionattribution |
subscription.past_due | O débito do mês não foi efetuado: o donativo mensal aguarda o seu pagamento. | subscriptionattribution |
subscription.reactivated | Um donativo mensal por pagar foi novamente regularizado. | subscriptionattribution |
subscription.canceled | Um donativo mensal é interrompido. | subscriptionattribution |
Encomendas (adesões, bilheteira, loja)
| Tipo | Enviado quando… | Conteúdo |
|---|---|---|
order.confirmed | Uma adesão, bilhetes ou uma compra na loja são confirmados, mesmo quando são gratuitos. | order |
order.pending_approval | Um pedido de adesão aguarda a sua validação. | order |
order.rejected | Recusou um pedido de adesão. | order |
order.canceled | Uma encomenda é cancelada. | order |
order.expired | Uma encomenda não foi paga a tempo e expirou. | order |
order.fulfillment_updated | Uma encomenda da loja muda de etapa: em preparação, expedida (com o número de seguimento), entregue ou levantada. | order |
Membros e bilhetes
| Tipo | Enviado quando… | Conteúdo |
|---|---|---|
membership.created | Um cartão de membro fica ativo. | membership |
membership.canceled | Uma adesão é cancelada. | membership |
ticket.checked_in | Um bilhete é digitalizado à entrada do seu evento. | ticket |
ticket.canceled | Um bilhete é cancelado. | ticket |
Pedidos de reembolso
| Tipo | Enviado quando… | Conteúdo |
|---|---|---|
refund_request.created | Um doador ou um comprador pede-lhe um reembolso. | refund_request |
refund_request.updated | Um pedido de reembolso muda de estado: respondido, reembolsado ou recusado. | refund_request |
Recibos fiscais
| Tipo | Enviado quando… | Conteúdo |
|---|---|---|
fiscal_receipt.issued | Um recibo de donativo é emitido para um doador. | fiscal_receipt |
fiscal_receipt.voided | Um recibo de donativo é anulado, por exemplo após um reembolso. | fiscal_receipt |
Transferências bancárias
| Tipo | Enviado quando… | Conteúdo |
|---|---|---|
payout.paid | A Stripe ou o PayPal transferiu dinheiro para a conta bancária da associação. | payout |
payout.failed | Falhou uma transferência para a conta bancária da associação. | payout |
Formulários e angariações
| Tipo | Enviado quando… | Conteúdo |
|---|---|---|
form.created | Uma angariação, um evento, uma fórmula de adesão, uma loja, uma ligação de pagamento ou um código QR é criado. | form |
campaign.goal_reached | Uma angariação atinge o seu objetivo. | campaign |
Conta da associação
| Tipo | Enviado quando… | Conteúdo |
|---|---|---|
organization.payment_account_updated | A conta Stripe ou PayPal da associação está ativada ou suspensa. | payment_account |
Período experimental
| Tipo | Enviado quando… | Conteúdo |
|---|---|---|
test.ping | Mensagem de teste enviada a partir do painel. | message |
Uma encomenda paga desencadeia dois eventos: order.confirmed (a encomenda) e payment.succeeded (o dinheiro). Para medir as suas conversões, use apenas payment.succeeded; para gerir os seus inscritos, apenas order.confirmed. Subscreva cada endereço apenas aos eventos de que precisa.
As mensagens são normalmente enviadas menos de dois minutos após o facto: a Donoor aguarda que todas as informações estejam definitivas (montante transferido, taxas…) antes de enviar.
Estrutura de uma mensagem
Cada mensagem é um pedido POST cujo corpo JSON, codificado em UTF-8, tem sempre o mesmo envelope. Só o conteúdo de data muda conforme o tipo de evento. Os nomes dos campos estão em inglês, como na Stripe ou na HelloAsso.
| Campo | Tipo | Descrição |
|---|---|---|
id | string | Identificador único do evento (evt_…). Mantém-se o mesmo em cada reenvio e a cada nova tentativa: é ele que permite ignorar um duplicado. |
object | string | Sempre event. |
type | string | Tipo do evento, por exemplo payment.succeeded. |
api_version | string | Versão do formato da mensagem. Só muda numa evolução incompatível. |
created | string (ISO 8601) | Data de criação do evento, em UTC. |
livemode | boolean | true para um evento real; false para uma simulação ou no ambiente de teste. Nunca conte uma mensagem com livemode false como um pagamento real. |
organization | object | A associação em causa: id (número Donoor) e name. |
data | object | Os objetos próprios do evento: payment, order, ticket… (ver Objetos). |
Exemplos de mensagens
{
"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
}
}
}Objetos
Os objetos que pode encontrar em data. Um campo sem valor fica com o valor null. As datas estão no formato ISO 8601, em UTC.
Todos os montantes são em euros, com duas casas decimais; os campos …_cents dão o mesmo montante em cêntimos. Os montantes são os da associação: o apoio facultativo que um doador deixa à Donoor nunca aparece aqui.
idinteger | Identificador Donoor do pagamento. |
conversion_idstring | Identificador de conversão, a transmitir à Google e à Meta. Igual a id para um donativo, ao número de encomenda para uma adesão, um bilhete ou uma compra na loja. É também o transaction_id enviado pelo widget para o dataLayer. |
order_idstring | null | Identificador da encomenda associada (adesão, bilheteira, loja), caso contrário null. |
statusstring | succeeded, failed, refunded, partially_refunded ou disputed. |
amountnumber | Montante pago à associação, incluindo as taxas suportadas pelo doador. É o valor a enviar como conversão. |
amount_centsinteger | O mesmo montante, em cêntimos. |
net_amountnumber | null | Montante efetivamente transferido para a associação pela Stripe ou pelo PayPal, após as respetivas taxas. null enquanto o prestador não o tiver comunicado. |
fees_covered_amountnumber | Parte das taxas que o doador escolheu suportar (0 caso contrário). |
provider_fee_amountnumber | null | Taxas retidas pela Stripe ou pelo PayPal, conforme indicadas por estes. |
currencystring | Moeda, código ISO 4217 em maiúsculas (EUR). |
refunded_amountnumber | Total já reembolsado neste pagamento. |
kindstring | Natureza do pagamento: donation, membership, ticket ou shop. |
channelstring | Canal: online (página de donativo, widget), campaign (angariação), qr_code, tap_to_pay ou offline (pagamento introduzido manualmente). |
formobject | null | O formulário de origem: type (campaign, event, membership_plan, shop, qr_code), id e title. null para um donativo na página de donativo. |
recurringobject | null | Para um donativo mensal: interval, sequence (first para o primeiro pagamento, renewal depois) e subscription_id. null caso contrário. |
payment_providerstring | stripe, paypal ou manual. |
payment_methodstring | null | Meio de pagamento indicado pelo prestador: card, sepa_debit, card_present (Tap to Pay), paypal… |
walletstring | null | apple_pay ou google_pay quando o doador pagou com estes, caso contrário null. |
provider_referencestring | null | Referência do pagamento junto do prestador (pi_… na Stripe, número de encomenda PayPal). |
donorobject | O doador: email, name e anonymous (true se pediu para ficar anónimo na página pública; continua a receber os seus contactos). |
createdstring (ISO 8601) | Data do pagamento. |
Cabeçalhos HTTP
Cada pedido inclui estes cabeçalhos. Os nomes dos cabeçalhos HTTP não diferenciam maiúsculas de minúsculas: o seu servidor pode recebê-los em minúsculas.
| Cabeçalho | Descrição |
|---|---|
Content-Typeapplication/json | O corpo é JSON codificado em UTF-8. |
User-AgentDonoor-Webhooks/1.0 (+https://donoor.org/developpeurs/webhooks) | Identifica a Donoor. Não o use para autenticar: só a assinatura faz fé. |
Donoor-Signaturet=1792300000,v1=f0f590ea41b7… | Data e hora e assinatura da mensagem (ver Verificar a assinatura). |
Donoor-Event-Idevt_9mK2xQpL4vR8sT1w | Idêntico ao campo id do corpo: útil para descartar um duplicado antes mesmo de ler o JSON. |
Donoor-Event-Typepayment.succeeded | Idêntico ao campo type do corpo. |
Donoor-Delivery-Attempt1 | Número da tentativa: 1 para o primeiro envio, até 8. |
Verificar a assinatura
Qualquer pessoa pode enviar um pedido para o seu endereço: verifique por isso sempre a assinatura antes de confiar numa mensagem. O cabeçalho Donoor-Signature contém a data e hora de envio (t, em segundos) e uma ou duas assinaturas v1. Cada assinatura é um HMAC-SHA256, escrito em hexadecimal, do texto « data e hora + ponto + corpo bruto », calculado com o seu segredo.
Donoor-Signature: t=1792300000,v1=f0f590ea41b7f691921bb57c47f593d785d4e4d7d6c14f947848cb9d2d471bdf- 1
Leia o corpo BRUTO do pedido, byte a byte, antes de qualquer descodificação JSON.
- 2
Recupere t e todos os valores v1 do cabeçalho Donoor-Signature.
- 3
Calcule o HMAC-SHA256 com o seu segredo (incluindo whsec_) sobre t + « . » + corpo, e compare o resultado com cada v1 através de uma comparação de tempo constante. Apenas uma deve corresponder.
- 4
Recuse a mensagem se t tiver mais de 5 minutos de diferença em relação ao seu relógio: uma mensagem intercetada não pode ser reproduzida mais tarde.
// Node.js (Express) — o corpo BRUTO é indispensável para a assinatura
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(); // responder depressa, tratar depois
traiter(evenement); // processar o evento; ignorá-lo se o seu id já tiver sido visto
});Exemplo de verificação
Para testar o seu código sem esperar por uma mensagem real: com estes valores, deve obter exatamente esta assinatura.
| Segredo | whsec_5wQpK9mZ2vX7rT4yN8bH3jL6fD1sA0cE |
| Data e hora (t) | 1792300000 |
| Corpo bruto | {"id":"evt_doc0exemple0signature","object":"event","type":"test.ping"} |
| Assinatura v1 esperada | f0f590ea41b7f691921bb57c47f593d785d4e4d7d6c14f947848cb9d2d471bdf |
Erro mais frequente: assinar o JSON depois de o descodificar e recodificar. Um simples espaço ou a ordem das chaves altera a assinatura. Assine sempre o corpo exatamente como recebido.
Alterar o segredo
Se o seu segredo puder ter sido visto por outra pessoa, substitua-o: Definições › Webhooks › Segredo › Alterar o segredo.
Durante 24 horas, as mensagens são assinadas com o segredo antigo E com o novo: o cabeçalho contém então dois valores v1. Instale o novo segredo no seu servidor durante este prazo; depois, só o novo funciona.
O segredo é conservado encriptado pela Donoor. Só é apresentado aos responsáveis e administradores da associação.
Endereços aceites
- Apenas endereços https, com certificado válido.
- Porta 443 (a predefinida) ou 8443.
- O endereço tem de ser acessível pela Internet: endereços locais ou privados (localhost, rede interna) são recusados.
- Os redirecionamentos não são seguidos: uma resposta 3xx conta como falha. Indique o endereço final.
- A Donoor não envia a partir de uma lista fixa de endereços IP: não filtre por IP, verifique a assinatura.
Responder a uma mensagem
Responda com um código 2xx (200, 201, 204…) em menos de 10 segundos. O conteúdo da sua resposta não é lido, mas o seu início é apresentado no registo de envios para o ajudar a depurar.
Responda primeiro, trate depois: registe a mensagem, responda 200 e, em seguida, faça os processamentos longos (chamada ao Google Ads, envio de e-mail…) em segundo plano.
| Resposta do seu servidor | O que faz a Donoor |
|---|---|
| 2xx | Sucesso: a mensagem é marcada como bem-sucedida no registo. |
| 3xx | Falha (redirecionamento não seguido): nova tentativa mais tarde. |
| 4xx, 5xx | Falha: nova tentativa mais tarde. |
| sem resposta | Mais de 10 segundos, ligação recusada ou certificado inválido: falha, nova tentativa mais tarde. |
Lembretes e pausa
Quando um envio falha, a Donoor tenta novamente automaticamente: 8 tentativas no total, durante cerca de 28 horas.
- 1.º envio
- +1 min
- +5 min
- +30 min
- +2 h
- +5 h
- +10 h
- +10 h
- Após a 8.ª tentativa, a mensagem é abandonada e a associação é avisada por e-mail (no máximo um e-mail por endereço e por dia).
- Um endereço que não aceita nenhuma mensagem durante 3 dias é colocado em pausa automaticamente, com um e-mail. Reativa-se com um clique no painel.
- Qualquer mensagem do registo pode ser reenviada manualmente, durante 30 dias: botão Reenviar.
Duplicados e ordem
Um mesmo evento pode chegar mais do que uma vez: o seu servidor tratou a mensagem mas a resposta perdeu-se, ou alguém clicou em Reenviar. O evento mantém então o mesmo id: registe os id já tratados e ignore os que já conhece.
A ordem de chegada não é garantida: um reembolso pode, em caso de nova tentativa, chegar antes do pagamento de origem. Baseie-se no campo created e nos estados dos objetos, não na ordem de receção.
Para uma conversão publicitária, conversion_id basta: a Google e a Meta ignoram por si próprias uma conversão já recebida com o mesmo identificador.
Limites
| Endereços por associação | 5 |
| Tempo máximo de resposta | 10 segundos |
| Tentativas por mensagem | 8, durante cerca de 28 h |
| Pausa automática | após 3 dias sem sucesso |
| Mensagens de teste | 20 por hora |
| Simulações | 60 por hora |
| Reenvios manuais | 100 por hora |
| Mensagens por dia | 20 000 por associação |
| Conservação do registo de envios | 30 dias |
| Preservação da origem | 400 dias |
Medir as suas campanhas
A mensagem payment.succeeded dá-lhe o montante, a moeda, o identificador de conversão e os parâmetros do anúncio de origem. O seu servidor transmite depois a conversão à plataforma publicitária: é fiável mesmo quando o navegador bloqueia os cookies ou os rastreadores.
Google Analytics 4
Envie um evento purchase através do Measurement Protocol: transaction_id = conversion_id, value = amount, currency = currency.
Google Ads
Com gclid (ou gbraid / wbraid) em attribution.parameters: importe uma conversão offline através da API do Google Ads, com order_id = conversion_id para evitar duplicados. As conversões melhoradas podem usar o e-mail do doador, codificado em SHA-256.
Meta (Facebook, Instagram)
Através da API de Conversões: event_name = Purchase, event_id = conversion_id, value e currency; fbc constrói-se com fbclid. O e-mail do doador é enviado codificado em SHA-256.
Sem programador
Cole o endereço de um cenário Make ou Zapier (módulo « Webhook personalizado »): depois liga-o ao Google Ads, GA4, Meta, Google Sheets ou ao seu CRM, sem escrever código.
Widget no seu site
Quando o donativo é feito no widget da Donoor integrado no seu site, a página recebe também o evento donoor_payment no dataLayer do Google Tag Manager, sem dados pessoais, com o mesmo transaction_id que conversion_id: o navegador e o servidor contam apenas uma conversão.
CRM e ferramentas internas
Use donor.email como chave para encontrar a ficha, kind para saber se se trata de um donativo, de uma adesão, de um bilhete ou de uma compra, e recurring para identificar os seus doadores mensais.
Exemplo: um donativo transmitido ao 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
}
}]
}Origem dos pagamentos
Acrescente os seus parâmetros de acompanhamento ao link dos seus anúncios, quer leve à sua página Donoor, quer à página do seu site que apresenta o widget da Donoor:
https://donoor.org/pay/mon-association?utm_source=google&utm_campaign=ramadan-2027&gclid=Cj0KCQjw…- Todos os parâmetros da ligação são conservados até ao pagamento, mesmo que o doador abra a página de pagamento num novo separador.
- Chegam em data.attribution de payment.succeeded, e nos outros eventos do mesmo pagamento (reembolso, litígio, donativo mensal).
- Para uma renovação de donativo mensal, a origem é a do primeiro pagamento.
- Os parâmetros que se assemelham a um dado sensível (e-mail, palavra-passe, token, telefone, IBAN…) e os parâmetros técnicos da Donoor são descartados. No máximo 25 parâmetros, 300 caracteres por valor.
- attribution fica com o valor null quando o doador não chegou através de uma ligação com parâmetros.
Consentimento
attribution.marketing_consent indica se o doador aceitou os cookies publicitários na Donoor: true, false, ou null se não se souber.
Na Europa, a Google e a Meta exigem que respeite esta escolha (Google Consent Mode, RGPD). A sua associação continua responsável pela forma como utiliza estes dados: não envie o e-mail de um doador que recusou e lembre-se de mencionar este tratamento na sua política de privacidade.
Ensaios, simulações e registo
O botão Enviar um teste, em cada endereço, envia imediatamente um evento test.ping assinado como os outros. Serve para verificar se o seu servidor está acessível e se a sua assinatura está correta.
O botão Simular um evento, em cada endereço, envia um dos 28 eventos à escolha, no formato exato, com dados fictícios e livemode a false, apenas para esse endereço. Uma pré-visualização mostra a mensagem antes do envio. Não é efetuado nenhum pagamento, nem é enviado qualquer dado real.
Para desenvolver com calma, marque «Endereço de teste» na janela do endereço: nesse caso, só recebe simulações e mensagens de teste, nunca os eventos reais. Ligue-lhe o servidor de desenvolvimento da sua equipa e mantenha outro endereço para a produção.
O registo de envios mostra cada mensagem dos últimos 30 dias: evento, estado, número de tentativas, código HTTP e início da resposta do seu servidor, bem como o conteúdo exato enviado. Filtre por bem-sucedidos, com falha ou pendentes, e reenvie uma mensagem com um clique.
Ambiente de teste
O simulador basta para desenvolver os seus webhooks. Para testar também o percurso de pagamento completo (página de donativo, cartão de teste, recibo), a Donoor disponibiliza um ambiente de teste separado, em sandbox.donoor.org. As suas páginas não são referenciadas pelos motores de pesquisa.
| Produção | Teste | |
|---|---|---|
| Site | donoor.org | sandbox.donoor.org |
| Painel | dashboard.donoor.org | dashboard-sandbox.donoor.org |
| Pagamentos | reais | fictícios, cartão 4242 4242 4242 4242 |
| livemode | true | false |
| E-mails | normais | objeto com o prefixo « [TEST] » |
- Crie uma conta de associação de teste em dashboard-sandbox.donoor.org/register: não figura nenhum dado real.
- Ligue a Stripe em Definições › Processo de recolha. Em modo de teste, a Stripe aceita dados fictícios (código SMS: 000000): não é necessária nenhuma conta bancária real.
- A sua página de pagamento de teste fica imediatamente online, por exemplo sandbox.donoor.org/pay/votre-association, tal como as suas angariações, bilheteiras e lojas de teste.
- Adicione o seu endereço de webhook em Definições › Webhooks, tal como em produção.
- Faça um donativo nesta página com o cartão de teste 4242 4242 4242 4242 (data futura, qualquer código): recebe mensagens reais assinadas, com livemode a false. O segredo de teste é diferente do de produção.
Versões do formato
O campo api_version indica a versão do formato da mensagem. Só muda em caso de evolução incompatível (um campo renomeado ou eliminado, um significado alterado), anunciada com antecedência.
A Donoor pode, sem mudar de versão, acrescentar novos eventos e novos campos: o seu código deve ignorar o que não conhece.
| Versão | Alterações |
|---|---|
| 2026-10-17 | Primeira versão pública: 28 eventos, assinatura HMAC-SHA256, origem dos pagamentos. |
Resolução de problemas
Não recebo nenhuma mensagem
Verifique no painel que o endereço está Ativo e que o evento esperado está marcado, e envie depois uma mensagem de teste: o registo mostra então a resposta do seu servidor ou o erro encontrado (certificado, prazo, endereço inacessível). A sua firewall tem de aceitar os pedidos recebidos da Internet.
A assinatura nunca corresponde
Em 9 casos em 10, o corpo foi descodificado e recodificado antes do cálculo: use o corpo bruto. Verifique também que usa o segredo completo, incluindo o prefixo whsec_, e o do endereço certo (cada endereço tem o seu próprio segredo). O exemplo de verificação acima permite testar o seu código.
O registo indica uma resposta 301 ou 302
O seu servidor redireciona o pedido (muitas vezes de http para https, ou para um endereço com ou sem barra final). Os redirecionamentos não são seguidos: indique o endereço final exato.
Recebo duas vezes o mesmo pagamento
É normal em caso de reenvio: o evento tem o mesmo id; ignore-o. Se os ids forem diferentes, trata-se de dois eventos distintos, por exemplo order.confirmed e payment.succeeded para a mesma encomenda.
Não recebo os pagamentos anteriores à adição do meu endereço
É intencional: só são enviados os eventos que ocorrem depois de acrescentar o primeiro endereço. Para o histórico, use as exportações do painel.
O montante não corresponde ao que o doador pagou
amount é o montante para a associação: o apoio facultativo deixado à Donoor não aparece, as taxas cobertas pelo doador aparecem. O que chega realmente à sua conta bancária é net_amount, depois das taxas da Stripe ou da PayPal.
Alguma dúvida?
A nossa equipa acompanha a sua equipa técnica durante a integração.
Escreva-nos