Logotipo Hedhog

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

  1. Crie um Perfil de Integração do tipo Payment, provedor stripe ou mercado_pago, com as chaves do gateway na sua config
  2. Aponte commerce-default-payment-profile-id para esse perfil — seja definindo-o diretamente, ou (recomendado) usando a ação Auto-configure webhook descrita abaixo, que o define para você
  3. CommerceCheckoutService.processCheckout() carrega esse perfil e chama o gateway diretamente: Mercado Pago via POST https://api.mercadopago.com/v1/payments (ou /preapproval para planos recorrentes), Stripe via a Charges API legada POST https://api.stripe.com/v1/charges
  4. 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.

Checkout fluindo para Stripe ou Mercado Pago, e os dois caminhos de webhook diferentes — log de auditoria versus o processador auto-configurado real

Configuração Rápida

  1. Crie um Perfil de Integração (tipo Payment, Stripe ou Mercado Pago) com suas chaves em Settings → Integration Profiles
  2. Vá em Commerce → Webhooks → Webhook Settings, selecione o perfil e clique em Generate Webhook
  3. Copie a URL {API_URL}/webhook/{public_uuid} gerada para o dashboard do gateway — não /commerce/webhooks/...
  4. Faça uma cobrança de teste e confirme que o pedido muda de pending para paid sozinho

Configurando

Campo de configuraçãoStripeMercado Pago
public_keyPublishable 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_keySecret key para cobranças no servidor (sk_live_… / sk_test_…)
access_tokenAccess token de servidor (APP_USR-…) usado tanto para cobranças quanto para a consulta de status do webhook
notification_urlOpcional — 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 source de cartão, não PaymentIntents/Elements. Seu frontend de checkout precisa tokenizar o cartão em um source/token compatí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:

EndpointO que ele faz
POST {API_URL}/commerce/webhooks/stripe
POST {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:

  1. 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
  2. Clique em Generate Webhook (chama POST {API_URL}/commerce/webhooks/auto-configure com { "integrationProfileId": <id> })
  3. 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
  4. 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

  1. Ative sua conta para o modo live quando estiver pronto (o modo test funciona imediatamente, sem ativação)
  2. Vá em Developers → API keys e copie a Publishable key e a Secret key para o Perfil de Integração
  3. 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
  4. Selecione pelo menos charge.succeeded, charge.failed e 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

  1. Em Your integrations → Create application, vá em Credentials e copie o Access token e a Public key (use a aba Test credentials enquanto desenvolve)
  2. 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
  3. 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 4242 para Stripe, os cartões de teste do Mercado Pago para MP) e confirme que o pedido passa de pending para paid sozinho — 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

SintomaCausa provável
Os pedidos ficam pending para sempre após uma cobrança bem-sucedidaO gateway está apontado para /commerce/webhooks/{stripe|mercado-pago} em vez da URL auto-configurada {API_URL}/webhook/{uuid}
No default payment profile configuredcommerce-default-payment-profile-id não está definido — execute o Auto-configure webhook, ou defina-o manualmente
Unsupported payment providerO provedor do Perfil de Integração não é stripe nem mercado_pago
A cobrança do Stripe falha imediatamente com um erro de cartãoLembre-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 ativaVerifique se a notification_url/webhook do preapproval está acessível — o Mercado Pago faz o callback de forma assíncrona quando o pagador autoriza