Receba novidades do Hedhog no seu e-mail
Novos lançamentos, receitas e breaking changes — sem spam.
Pagamentos
O módulo commerce do Hedhog integra com Stripe e Mercado Pago para cobranças únicas e assinaturas recorrentes. As credenciais ficam em um Perfil de Integração (tipo payment), e uma única configuração escolhe qual está ativo.
Como Funciona
- Crie um Perfil de Integração do tipo Payment, provedor
stripeoumercado_pago, com as chaves do gateway na sua config - Aponte
commerce-default-payment-profile-idpara esse perfil — seja definindo-o diretamente, ou (recomendado) usando a ação Auto-configure webhook descrita abaixo, que o define para você CommerceCheckoutService.processCheckout()carrega esse perfil e chama o gateway diretamente: Mercado Pago viaPOST https://api.mercadopago.com/v1/payments(ou/preapprovalpara planos recorrentes), Stripe via a Charges API legadaPOST https://api.stripe.com/v1/charges- O resultado é registrado em
commerce_payment/commerce_order, e entitlements ou assinaturas são criados em caso de sucesso
Apenas um perfil de pagamento fica ativo por vez — commerce-default-payment-profile-id é uma configuração única, não por produto ou por moeda.
Status: ⚠️ Funciona de ponta a ponta, mas apenas se conectado através da URL de webhook correta — veja "A URL de Webhook Não É a Que Você Esperaria" abaixo, o erro de configuração mais comum de todos.

Configuração Rápida
- Crie um Perfil de Integração (tipo Payment, Stripe ou Mercado Pago) com suas chaves em Settings → Integration Profiles
- Vá em Commerce → Webhooks → Webhook Settings, selecione o perfil e clique em Generate Webhook
- Copie a URL
{API_URL}/webhook/{public_uuid}gerada para o dashboard do gateway — não/commerce/webhooks/... - Faça uma cobrança de teste e confirme que o pedido muda de
pendingparapaidsozinho
Configurando
| Campo de configuração | Stripe | Mercado Pago |
|---|---|---|
public_key | Publishable key, retornada ao cliente para o Stripe.js (o Stripe espera pk_live_… / pk_test_…) | Chave pública usada pelo SDK JS do Mercado Pago na página de checkout |
secret_key | Secret key para cobranças no servidor (sk_live_… / sk_test_…) | — |
access_token | — | Access token de servidor (APP_USR-…) usado tanto para cobranças quanto para a consulta de status do webhook |
notification_url | — | Opcional — enviada ao Mercado Pago como a notification_url em pagamentos/preapprovals. Deixe vazio, a menos que você tenha um motivo para contornar o webhook auto-configurado abaixo |
Nota sobre o Stripe: a integração atual do Hedhog com o Stripe usa a clássica Charges API com um token
sourcede cartão, não PaymentIntents/Elements. Seu frontend de checkout precisa tokenizar o cartão em umsource/tokencompatível com essa API antes de chamar o endpoint de checkout do Hedhog.
A URL de Webhook Não É a Que Você Esperaria
Esta é a parte que mais provavelmente vai enganar um novo desenvolvedor: o Hedhog não usa um path de webhook fixo e previsível como /api/payment/stripe/webhook. Há dois endpoints diferentes, e apenas um deles realmente atualiza o status de pagamento/pedido/assinatura:
| Endpoint | O que ele faz |
|---|---|
POST {API_URL}/commerce/webhooks/stripePOST {API_URL}/commerce/webhooks/mercado-pago | Registra o evento bruto em commerce_webhook_event para auditoria/depuração. Não processa mudanças de status. |
| A URL pública auto-configurada (veja abaixo) | Um endpoint de webhook gerado dinamicamente, baseado em UUID, que de fato chama CommerceCheckoutService.processWebhook() — é isso que atualiza pagamentos, pedidos e assinaturas |
Para obter a URL de webhook real e funcional:
- No admin, vá em Commerce → Webhooks, abra Webhook Settings e selecione seu Perfil de Integração de pagamento — isso o salva imediatamente como
commerce-default-payment-profile-id - Clique em Generate Webhook (chama
POST {API_URL}/commerce/webhooks/auto-configurecom{ "integrationProfileId": <id> }) - O Hedhog cria (ou reutiliza) uma Webhook Integration genérica em Settings → Integrations and Webhooks, e o painel mostra uma URL pública de ingestão no formato
{API_URL}/webhook/{public_uuid}com um botão de copiar para a área de transferência - Registre essa URL
{API_URL}/webhook/{public_uuid}no dashboard do Stripe ou do Mercado Pago — não o path/commerce/webhooks/...
Se os pagamentos têm sucesso mas os pedidos nunca mudam para "paid" e as assinaturas nunca ativam, verifique isto primeiro — quase sempre significa que o gateway está apontado para o endpoint de log de auditoria em vez do auto-configurado.
Stripe
Console: dashboard.stripe.com
- Ative sua conta para o modo live quando estiver pronto (o modo test funciona imediatamente, sem ativação)
- Vá em Developers → API keys e copie a Publishable key e a Secret key para o Perfil de Integração
- Execute a etapa Generate Webhook acima, depois vá em Developers → Webhooks → Add endpoint no dashboard do Stripe e cole a URL
{API_URL}/webhook/{public_uuid}gerada - Selecione pelo menos
charge.succeeded,charge.failede quaisquer eventos relacionados a assinaturas que seus planos usem
Cartão de teste: 4242 4242 4242 4242, qualquer validade futura, qualquer CVC.
Mercado Pago
Console: developers.mercadopago.com
- Em Your integrations → Create application, vá em Credentials e copie o Access token e a Public key (use a aba Test credentials enquanto desenvolve)
- Execute a etapa Generate Webhook acima, depois registre a URL
{API_URL}/webhook/{public_uuid}resultante como a URL de notificação de webhook/IPN da aplicação no dashboard do Mercado Pago - Para planos recorrentes, o Mercado Pago usa objetos de preapproval (assinatura) em vez de cobranças repetidas — o Hedhog os cria automaticamente para preços marcados como
billing_type: recurring
O Mercado Pago suporta vários métodos de pagamento através do mesmo access_token automaticamente: cartões de crédito/débito, Pix (Brasil, transferência instantânea) e métodos específicos por região, dependendo do país do pagador. Teste com os números de cartão de teste deles.
Verifique se Funcionou
- Faça uma cobrança de teste (
4242 4242 4242 4242para Stripe, os cartões de teste do Mercado Pago para MP) e confirme que o pedido passa dependingparapaidsozinho — se ele não mudar em alguns segundos, a URL de webhook está quase certamente errada, não a cobrança em si - Verifique o log da Webhook Integration (Settings → Integrations and Webhooks) para confirmar que o evento realmente chegou
Solução de Problemas
| Sintoma | Causa provável |
|---|---|
Os pedidos ficam pending para sempre após uma cobrança bem-sucedida | O gateway está apontado para /commerce/webhooks/{stripe|mercado-pago} em vez da URL auto-configurada {API_URL}/webhook/{uuid} |
No default payment profile configured | commerce-default-payment-profile-id não está definido — execute o Auto-configure webhook, ou defina-o manualmente |
Unsupported payment provider | O provedor do Perfil de Integração não é stripe nem mercado_pago |
| A cobrança do Stripe falha imediatamente com um erro de cartão | Lembre-se de que o Stripe aqui usa a Charges API com um token source — certifique-se de que o frontend está tokenizando corretamente para essa API, não PaymentIntents |
| A assinatura recorrente do Mercado Pago nunca ativa | Verifique se a notification_url/webhook do preapproval está acessível — o Mercado Pago faz o callback de forma assíncrona quando o pagador autoriza |