Skip to main content
O formulário de cartão fica dentro do seu site: o cliente digita o cartão, paga e não sai da página. Ao final deste guia você tem uma página funcionando no Dev mode.

Como funciona

  1. O número do cartão nunca passa pelo seu servidor. O formulário é um iframe seguro; o seu código só recebe um token.
  2. São duas chaves. A chave pública (pk_...) vai no navegador. A chave de API (abc_...) fica só no backend.
  3. O token ctok_ vale 60 segundos e uma cobrança. Para cobrar o mesmo cartão de novo depois, use o cardToken da resposta (veja como).
Requisitos: conta com cartão de crédito liberado e Node.js 20 ou superior para rodar o exemplo.

Passo 1: pegue as duas chaves

Ligue o Modo Teste no dashboard e copie:
As duas chaves precisam ser do mesmo ambiente: as duas de teste ou as duas de produção. Misturar faz a cobrança falhar com Invalid or expired card token.

Passo 2: a página

Crie a pasta do projeto:
Crie public/index.html e troque pk_SUA_CHAVE_PUBLICA pela sua chave pública:
public/index.html

Passo 3: o backend

Crie server.mjs na pasta minha-loja:
server.mjs
E o arquivo .env, com a chave de API:
.env

Passo 4: teste

Abra http://localhost:3000 e clique em Pagar. No Dev mode o formulário já vem preenchido com o cartão de teste 4242 4242 4242 4242, e nada é cobrado de verdade. No terminal aparece a cobrança aprovada e o cardToken (no Dev mode, dev_card_4242). Para testar recusas, troque o número no formulário: Toda recusa volta com a mesma mensagem, Não foi possível processar o pagamento com este cartão. É de propósito: detalhar o motivo ajudaria quem testa cartão roubado.

Passo 5: produção

O código não muda. Desligue o Modo Teste, copie as duas chaves de Produção e troque na página e no .env. Em produção o formulário é o seguro de verdade, alguns bancos pedem confirmação (3DS) numa janela que o abacatepay.js abre e fecha sozinho, e são aceitos cartões de crédito Visa e Mastercard. Antes de ir ao ar, ajuste o exemplo para a sua loja:
  • O valor vem do seu pedido, no backend. Não confie no valor que chega do navegador.
  • Os dados do cliente vêm do seu formulário. CPF ou CNPJ precisa ser válido.
  • Libere o pedido quando o status for APPROVED. Se vier PENDING, espere o webhook transparent.completed.
  • Timeout não é recusa. Se a chamada de cobrança der timeout, não repita na hora: confira na listagem ou espere o webhook.

Erros mais comuns

Todos os erros estão em Criar cobrança Cartão e em abacatepay.js.

Próximos passos

Cobrar de novo um cartão salvo

Use o cardToken para cobrar o mesmo cartão sem o cliente digitar nada.

Parcelar e outros campos

installmentCount, metadata, respostas e status.