Webhooks
Receba notificações assinadas de status de pagamento e integre callbacks configuráveis de checkout.
Nesta página
Os webhooks da DEUNA abrangem dois fluxos diferentes de servidor para servidor: notificações que publicam alterações de estado de pagamento para seu backend e callbacks síncronos que permitem que a DEUNA solicite dados ou lógica específicos do comerciante durante o checkout. Escolha o fluxo de acordo com o que sua integração precisa realizar.
| Fluxo | Quando ele é executado | Use-o para |
|---|---|---|
| Notificação de status de pedido e pagamento | Após uma alteração no status de pagamento inscrito | Atualize o estado de fulfillment, reconciliação e pedido do cliente sem fazer polling continuamente. |
| Webhook dinâmico de checkout | Enquanto o checkout aguarda uma resposta do comerciante | Aplicar cupons, calcular gorjetas ou impostos, recuperar informações de envio, validar dados ou executar outra ação de checkout específica do comerciante. |
Redirecionamentos de navegador, callbacks do SDK e callbacks de provedor para DEUNA são superfícies de integração separadas. Não os use como prova de pagamento ou como substitutos para esses fluxos de backend.
Notificações de status de pedido e pagamento#
As notificações de status entregam o snapshot mais recente do pedido ao seu backend quando o status de pagamento normalizado corresponde a um evento inscrito para o merchant. Essas notificações são assíncronas: o ciclo de vida do pagamento não aguarda a conclusão da sua lógica de negócio.
Pagamento <status>, e a DEUNA verifica a assinatura do merchant.Configurar entrega de status
Defina o contrato de entrega para cada ambiente:
| Configuração | O que definir |
|---|---|
| Destino | O endpoint HTTPS que aceita notificações de status. |
| Eventos | O payment.<status> eventos exigidos pelo seu ciclo de vida do pedido. |
| Contrato da requisição | Quaisquer headers estáticos, parâmetros de URL e transformação de payload aprovada. |
| Tratamento de falhas | O comportamento de confirmação, retentativa, monitoramento e reconciliação acordado para a integração. |
Os eventos disponíveis seguem o ciclo de vida de pagamento documentado em Fluxo e status de pagamento. A cobertura de eventos pode variar por método de pagamento porque nem todo método suporta cada operação ou status de pagamento.
Carga útil padrão
Sem uma transformação personalizada do payload, a DEUNA envia um HTTP POST com Content-Type: application/json e o pedido atual sob a propriedade order :
{
"order": {
"token": "21ac49c0-d587-4f25-ae1c-0d60e540c1e8",
"order_id": "merchant-order-123",
"transaction_id": "transaction-456",
"status": "succeeded",
"payment_status": "processed",
"currency": "USD",
"total_amount": 5000,
"payment": {
"data": {
"status": "processed",
"processor": "example_processor",
"external_transaction_id": "processor-789"
}
}
}
}O pedido pode conter os dados de cliente, item, valor, pagamento, processador, fraude, metadados e campo personalizado associados a essa transação. Trate order.payment.data.status como o estado de pagamento autoritativo, e use order.token, order.order_ide os identificadores de transação aplicáveis para reconciliação.
Uma configuração específica do lojista pode alterar o método HTTP, headers, parâmetros de URL, status assinados e formato do payload. Se uma configuração personalizada estiver habilitada, implemente o contrato exato certificado para esse lojista em vez de assumir o corpo padrão.
Verifique a assinatura
A entrega atual adiciona um X-Signature cabeçalho. Isso substitui exemplos mais antigos que se referem a X-Deuna-Signature.
- Leia o corpo da requisição não modificado antes que um framework o analise ou resserialize.
- Aplique o procedimento de verificação HMAC-SHA256 e Base64 certificado para o fluxo e ambiente de entrega.
- Compare o valor calculado com
X-Signatureusando uma comparação de tempo constante. - Rejeite a requisição antes do processamento se os valores não corresponderem.
Notificações de status e webhooks dinâmicos nem sempre assinam a mesma entrada quando a transformação de payload está ativada. Não reutilize um verificador entre esses fluxos até que a entrada assinada e a derivação da chave tenham sido confirmadas durante a certificação.
Mantenha as chaves de API privadas no servidor. Nunca as coloque em código de navegador, aplicativos móveis, logs ou respostas de webhook.
Reconheça e reconcilie
- Verifique a assinatura antes de confiar no payload.
- Registre uma chave de deduplicação que inclua o token do pedido e o evento ou status de pagamento resultante.
- Retorne uma resposta
2xxbem-sucedida assim que a requisição for aceita de forma durável. - Releia ou reconcilie o estado autoritativo do pedido antes de cumprimento, cancelamento, captura, reembolso ou outra ação irreversível.
- Ignore uma notificação que moveria seu registro local para trás a partir de um estado mais recente.
Falhas de entrega podem ser repetidas. Não assuma entrega exatamente uma vez, um intervalo de repetição fixo ou chegada na ordem do ciclo de vida.
Webhooks de checkout dinâmico#
Webhooks dinâmicos são callbacks síncronos e específicos do lojista. Quando o checkout dispara um evento configurado, a DEUNA envia uma requisição assinada para seu endpoint, valida a resposta, aplica apenas as atualizações permitidas e retorna o resultado configurado para o checkout.
Webhooks dinâmicos são ativados e configurados como parte da implementação do lojista. Eles não são registrados a partir de código de navegador ou móvel.
Fluxo de configuração e execução
Configure o webhook com a DEUNA como parte da configuração do seu lojista. Combine o nome do evento, destino, formatos de requisição e resposta, regras de validação e campos que o callback pode atualizar. Após a configuração, o checkout pode executar o evento através do mesmo contrato acordado.
Se o evento não estiver configurado para o lojista e ambiente, a DEUNA não chama seu endpoint. Trate um callback obrigatório que não foi executado como um problema de configuração durante a certificação.
Capacidades de configuração
| Capacidade | Configuração | Comportamento |
|---|---|---|
| Seleção de evento | event_name | Identifica a ação específica do lojista. Nomes suportam letras, números, hífens e sublinhados. |
| Destino | url, http_method | Chama a URL configurada com GET, POST, PUT, ou PATCH; o método padrão é POST. |
| Composição da requisição | headers, params, query_params, payload_template | Constrói cabeçalhos e valores de URL estáticos ou cientes do pedido, e pode transformar o pedido mais a entrada do evento no payload do lojista. |
| Mapeamento da resposta | response_template, response_data | Mapeia a resposta do lojista para o formato de resposta de pedido da DEUNA. Os dados de resposta de exemplo são necessários quando um modelo de resposta é configurado para que o modelo possa ser validado antes da ativação. |
| Validação de erro e resposta | error_response_template, validações configuradas | Mapeia erros do lojista e pode rejeitar uma resposta que não satisfaça as regras configuradas. |
| Mutação controlada do pedido | fields_update, custom_fields | Atualiza apenas os campos permitidos do pedido e os campos personalizados predefinidos. Os resultados dos campos personalizados ainda devem satisfazer o esquema de campos personalizados do pedido. |
| Resposta do checkout | response_body | Seleciona dados do pedido, taxa de envio, método de envio ou campo personalizado para retornar ao checkout. |
| Propagação direta da resposta | propagate_response | Retorna a resposta JSON do lojista diretamente quando a integração precisa de seu próprio contrato de resposta em vez do mapeamento de pedido da DEUNA. |
O trecho a seguir mostra o núcleo de uma definição de cálculo de gorjeta. São dados de configuração, não uma solicitação que deve ser enviada do navegador:
{
"event_name": "tip_amount_updated",
"url": "https://merchant.example.com/checkout/tips",
"http_method": "POST",
"fields_update": {
"fields": ["TotalAmount"],
"custom_fields": ["tipAmount"]
},
"response_body": {
"fields": ["Order"],
"custom_fields": ["tipAmount"]
},
"response_template": "{\"order\":{\"total_amount\":{{ .result.total_amount }},\"custom_fields\":{\"tipAmount\":{{ .result.tip_amount }}}}}",
"response_data": "{\"result\":{\"total_amount\":5500,\"tip_amount\":500}}"
}Durante a execução, o checkout pode fornecer entrada específica do evento:
{
"data": {
"tip_amount": 500
}
}Sem um modelo de payload, o endpoint do lojista recebe esses dados do evento. Com um modelo de payload, o modelo pode usar tanto o pedido atual quanto a entrada do evento para construir o JSON de saída.
Implemente o endpoint do lojista
| Preocupação | Requisito do endpoint do lojista |
|---|---|
| Execução repetida | Seja idempotente para o token do pedido e o nome do evento. |
| Contrato de resposta | Retorne JSON que corresponda ao formato de resposta configurado ou ao modelo de resposta. |
| Campos obrigatórios | Inclua todos os campos de atualização configurados; um campo ausente faz a execução falhar. |
| Latência | Conclua dentro do tempo limite certificado para a integração porque o checkout aguarda a resposta. |
| Erros | Retorne uma resposta não-2xx para uma falha de negócio ou de processamento, usando o formato de erro configurado. |
Chamadas dinâmicas incluem X-Signature e X-Deuna-Operation. Quando um modelo de payload altera o corpo de saída, use a entrada de verificação de assinatura acordada durante a certificação; não assuma que é idêntica ao contrato de notificação de status acima.
Se a propagação da resposta estiver desativada, a resposta padrão do lojista pode conter order, shipping_ratee shipping_methods; a DEUNA retorna apenas os campos de resposta selecionados pela configuração. Se a propagação da resposta estiver ativada, a resposta do lojista deve ser JSON válido e é retornada diretamente como o resultado dinâmico.
Padrões práticos
Exemplo de cálculo de gorjeta
Este exemplo mostra o caminho completo do checkout para o lojista para um evento de gorjeta configurado.
Para uma definição de gorjeta, permita apenas o valor e os campos personalizados que se espera que a resposta do lojista altere. O endpoint do lojista permanece responsável por calcular um total de pedido consistente.