Documentação técnica

Webhooks

Os webhooks enviam automaticamente ao seu servidor uma mensagem assinada a cada evento da sua associação na Donoor: donativo recebido, reembolso, adesão, bilhete digitalizado, encomenda, recibo de donativo, transferência… O seu sistema é avisado em poucos segundos, sem que ninguém tenha de exportar seja o que for.

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

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. 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. 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. 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. 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. 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.

Prefere um vídeo?A formação sobre Webhooks mostra cada etapa em vídeo, desde a primeira configuração até ao acompanhamento dos 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

TipoEnviado quando…Conteúdo
payment.succeededUm 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.failedUm cartão ou um débito direto é recusado, por exemplo na renovação de um donativo mensal.paymentattribution
payment.refundedUm pagamento é reembolsado, na totalidade ou em parte. Uma mensagem por reembolso.paymentrefundattribution
dispute.openedUm doador contesta um pagamento junto do seu banco.paymentdisputeattribution
dispute.closedO litígio está encerrado, ganho ou perdido.paymentdisputeattribution

Donativos mensais

TipoEnviado quando…Conteúdo
subscription.createdUm doador inicia um donativo mensal.subscriptionattribution
subscription.past_dueO débito do mês não foi efetuado: o donativo mensal aguarda o seu pagamento.subscriptionattribution
subscription.reactivatedUm donativo mensal por pagar foi novamente regularizado.subscriptionattribution
subscription.canceledUm donativo mensal é interrompido.subscriptionattribution

Encomendas (adesões, bilheteira, loja)

TipoEnviado quando…Conteúdo
order.confirmedUma adesão, bilhetes ou uma compra na loja são confirmados, mesmo quando são gratuitos.order
order.pending_approvalUm pedido de adesão aguarda a sua validação.order
order.rejectedRecusou um pedido de adesão.order
order.canceledUma encomenda é cancelada.order
order.expiredUma encomenda não foi paga a tempo e expirou.order
order.fulfillment_updatedUma encomenda da loja muda de etapa: em preparação, expedida (com o número de seguimento), entregue ou levantada.order

Membros e bilhetes

TipoEnviado quando…Conteúdo
membership.createdUm cartão de membro fica ativo.membership
membership.canceledUma adesão é cancelada.membership
ticket.checked_inUm bilhete é digitalizado à entrada do seu evento.ticket
ticket.canceledUm bilhete é cancelado.ticket

Pedidos de reembolso

TipoEnviado quando…Conteúdo
refund_request.createdUm doador ou um comprador pede-lhe um reembolso.refund_request
refund_request.updatedUm pedido de reembolso muda de estado: respondido, reembolsado ou recusado.refund_request

Recibos fiscais

TipoEnviado quando…Conteúdo
fiscal_receipt.issuedUm recibo de donativo é emitido para um doador.fiscal_receipt
fiscal_receipt.voidedUm recibo de donativo é anulado, por exemplo após um reembolso.fiscal_receipt

Transferências bancárias

TipoEnviado quando…Conteúdo
payout.paidA Stripe ou o PayPal transferiu dinheiro para a conta bancária da associação.payout
payout.failedFalhou uma transferência para a conta bancária da associação.payout

Formulários e angariações

TipoEnviado quando…Conteúdo
form.createdUma 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_reachedUma angariação atinge o seu objetivo.campaign

Conta da associação

TipoEnviado quando…Conteúdo
organization.payment_account_updatedA conta Stripe ou PayPal da associação está ativada ou suspensa.payment_account

Período experimental

TipoEnviado quando…Conteúdo
test.pingMensagem 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.

CampoTipoDescrição
idstringIdentificador único do evento (evt_…). Mantém-se o mesmo em cada reenvio e a cada nova tentativa: é ele que permite ignorar um duplicado.
objectstringSempre event.
typestringTipo do evento, por exemplo payment.succeeded.
api_versionstringVersão do formato da mensagem. Só muda numa evolução incompatível.
createdstring (ISO 8601)Data de criação do evento, em UTC.
livemodebooleantrue 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.
organizationobjectA associação em causa: id (número Donoor) e name.
dataobjectOs 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.

idintegerIdentificador Donoor do pagamento.
conversion_idstringIdentificador 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 | nullIdentificador da encomenda associada (adesão, bilheteira, loja), caso contrário null.
statusstringsucceeded, failed, refunded, partially_refunded ou disputed.
amountnumberMontante pago à associação, incluindo as taxas suportadas pelo doador. É o valor a enviar como conversão.
amount_centsintegerO mesmo montante, em cêntimos.
net_amountnumber | nullMontante 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_amountnumberParte das taxas que o doador escolheu suportar (0 caso contrário).
provider_fee_amountnumber | nullTaxas retidas pela Stripe ou pelo PayPal, conforme indicadas por estes.
currencystringMoeda, código ISO 4217 em maiúsculas (EUR).
refunded_amountnumberTotal já reembolsado neste pagamento.
kindstringNatureza do pagamento: donation, membership, ticket ou shop.
channelstringCanal: online (página de donativo, widget), campaign (angariação), qr_code, tap_to_pay ou offline (pagamento introduzido manualmente).
formobject | nullO 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 | nullPara um donativo mensal: interval, sequence (first para o primeiro pagamento, renewal depois) e subscription_id. null caso contrário.
payment_providerstringstripe, paypal ou manual.
payment_methodstring | nullMeio de pagamento indicado pelo prestador: card, sepa_debit, card_present (Tap to Pay), paypal…
walletstring | nullapple_pay ou google_pay quando o doador pagou com estes, caso contrário null.
provider_referencestring | nullReferência do pagamento junto do prestador (pi_… na Stripe, número de encomenda PayPal).
donorobjectO 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çalhoDescrição
Content-Typeapplication/jsonO 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_9mK2xQpL4vR8sT1wIdêntico ao campo id do corpo: útil para descartar um duplicado antes mesmo de ler o JSON.
Donoor-Event-Typepayment.succeededIdêntico ao campo type do corpo.
Donoor-Delivery-Attempt1Nú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. 1

    Leia o corpo BRUTO do pedido, byte a byte, antes de qualquer descodificação JSON.

  2. 2

    Recupere t e todos os valores v1 do cabeçalho Donoor-Signature.

  3. 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. 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.

Segredowhsec_5wQpK9mZ2vX7rT4yN8bH3jL6fD1sA0cE
Data e hora (t)1792300000
Corpo bruto{"id":"evt_doc0exemple0signature","object":"event","type":"test.ping"}
Assinatura v1 esperadaf0f590ea41b7f691921bb57c47f593d785d4e4d7d6c14f947848cb9d2d471bdf

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 servidorO que faz a Donoor
2xxSucesso: a mensagem é marcada como bem-sucedida no registo.
3xxFalha (redirecionamento não seguido): nova tentativa mais tarde.
4xx, 5xxFalha: nova tentativa mais tarde.
sem respostaMais 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. 1.º envio
  2. +1 min
  3. +5 min
  4. +30 min
  5. +2 h
  6. +5 h
  7. +10 h
  8. +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ção5
Tempo máximo de resposta10 segundos
Tentativas por mensagem8, durante cerca de 28 h
Pausa automáticaapós 3 dias sem sucesso
Mensagens de teste20 por hora
Simulações60 por hora
Reenvios manuais100 por hora
Mensagens por dia20 000 por associação
Conservação do registo de envios30 dias
Preservação da origem400 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çãoTeste
Sitedonoor.orgsandbox.donoor.org
Paineldashboard.donoor.orgdashboard-sandbox.donoor.org
Pagamentosreaisfictícios, cartão 4242 4242 4242 4242
livemodetruefalse
E-mailsnormaisobjeto com o prefixo « [TEST] »
  1. Crie uma conta de associação de teste em dashboard-sandbox.donoor.org/register: não figura nenhum dado real.
  2. 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.
  3. 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.
  4. Adicione o seu endereço de webhook em Definições › Webhooks, tal como em produção.
  5. 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ãoAlterações
2026-10-17Primeira 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