Em resumo
As APIs do Braintree permitem processar pagamentos com cartões de crédito, PayPal, Venmo e carteiras digitais. A integração ocorre via SDKs server-side (Node, Python, Ruby, etc.), onde você gera tokens de cliente para segurança no frontend e gerencia transações, reembolsos e assinaturas. Para testar, use o Apidog para validar cargas de webhook e experimentar a integração com dados de sandbox antes de ir para produção.
Introdução
O Braintree processa bilhões em pagamentos anualmente e é utilizado por empresas como Uber, Airbnb e GitHub. Ele suporta pagamentos por cartão de crédito, PayPal, Venmo, Apple Pay, Google Pay e transferências ACH.
APIs de pagamento exigem precisão. Um erro pode causar prejuízo financeiro e perda de confiança do cliente. Implementação e testes rigorosos são essenciais.
O Braintree oferece dois tipos de integração: UI Drop-in (formulário pronto) e UI Personalizada (controle total). Ambas usam as APIs server-side para processar pagamentos. Aqui, focamos nos fluxos server-side após o clique em "Pagar".
💡 Dica: Se você desenvolve integrações de pagamento, o Apidog auxilia a testar manipuladores de webhook e validar respostas. Simule webhooks do Braintree localmente para garantir que seu código trate sucesso, falha e casos de borda antes de processar transações reais.
Teste webhooks do Braintree com Apidog - grátis
Configurando o Braintree
Criar uma conta Braintree
Acesse braintreepayments.com e crie uma conta sandbox. Você receberá:
- Merchant ID:
abc123xyz - Public Key:
def456... - Private Key:
ghi789...
Armazene essas credenciais com segurança. Nunca compartilhe ou comite a chave privada no Git.
Instalar o SDK
O Braintree oferece SDKs para várias linguagens.
Node.js:
npm install braintree
Python:
pip install braintree
Ruby:
gem install braintree
Inicialização do gateway:
const braintree = require('braintree')
const gateway = new braintree.BraintreeGateway({
environment: braintree.Environment.Sandbox,
merchantId: process.env.BRAINTREE_MERCHANT_ID,
publicKey: process.env.BRAINTREE_PUBLIC_KEY,
privateKey: process.env.BRAINTREE_PRIVATE_KEY
})
Gerar um token de cliente
Antes de exibir o formulário de pagamento, gere um token de cliente para autorizar o frontend:
app.get('/checkout/token', async (req, res) => {
const clientToken = await gateway.clientToken.generate()
res.json({ clientToken: clientToken.clientToken })
})
O frontend utiliza esse token para inicializar a UI Drop-in ou uma integração personalizada.
Processando pagamentos
O fluxo de pagamento
- O frontend envia o nonce do método de pagamento para o backend.
- O servidor cria uma transação usando o nonce.
- O Braintree processa o pagamento.
- O backend recebe resposta de sucesso/falha.
- O pedido é finalizado ou um erro é exibido.
Cobrar um cartão de crédito
app.post('/checkout', async (req, res) => {
const { paymentMethodNonce, amount, orderId } = req.body
const result = await gateway.transaction.sale({
amount: amount,
paymentMethodNonce: paymentMethodNonce,
orderId: orderId,
options: {
submitForSettlement: true
}
})
if (result.success) {
res.json({
success: true,
transactionId: result.transaction.id
})
} else {
res.status(400).json({
success: false,
message: result.message
})
}
})
Cobrar com método de pagamento salvo
Após a primeira transação, salve o método de pagamento para cobranças futuras:
// Criar cliente com método de pagamento
const result = await gateway.customer.create({
firstName: 'John',
lastName: 'Doe',
email: 'john@example.com',
paymentMethodNonce: nonce
})
// Token do método de pagamento salvo
const paymentMethodToken = result.customer.paymentMethods[0].token
// Cobrar método de pagamento salvo
await gateway.transaction.sale({
amount: '49.99',
paymentMethodToken: paymentMethodToken,
options: {
submitForSettlement: true
}
})
Transações PayPal
O fluxo é semelhante: o frontend obtém um nonce do PayPal e o backend processa:
const result = await gateway.transaction.sale({
amount: '99.00',
paymentMethodNonce: paypalNonce,
orderId: 'ORDER-123',
options: {
submitForSettlement: true
}
})
Reembolsos e anulações
Reembolso total
const result = await gateway.transaction.refund('transaction_id')
if (result.success) {
console.log('Reembolsado:', result.transaction.id)
}
Reembolso parcial
const result = await gateway.transaction.refund('transaction_id', '50.00')
if (result.success) {
console.log('Reembolso parcial processado')
}
Anular uma transação
Use para cancelar autorizações não liquidadas:
const result = await gateway.transaction.void('transaction_id')
if (result.success) {
console.log('Transação anulada')
}
Fluxo de status da transação
authorized → submitted_for_settlement → settled
↓
voided
settled → refunded
Assinaturas e cobrança recorrente
O Braintree suporta pagamentos recorrentes.
Criar um plano
No painel do Braintree ou via API:
const result = await gateway.plan.create({
id: 'monthly-premium',
name: 'Monthly Premium',
billingFrequency: 1,
currencyIsoCode: 'USD',
price: '29.99'
})
Criar uma assinatura
const result = await gateway.subscription.create({
paymentMethodToken: paymentMethodToken,
planId: 'monthly-premium',
firstBillingDate: new Date()
})
if (result.success) {
console.log('Assinatura criada:', result.subscription.id)
}
Cancelar uma assinatura
const result = await gateway.subscription.cancel('subscription_id')
if (result.success) {
console.log('Assinatura cancelada')
}
Atualizar assinatura
const result = await gateway.subscription.update('subscription_id', {
planId: 'annual-premium',
price: '299.99'
})
Webhooks para eventos de pagamento
Webhooks notificam seu sistema sobre eventos críticos, como cobranças recorrentes e disputas.
Criar um endpoint de webhook
app.post('/webhooks/braintree', (req, res) => {
const signature = req.body.bt_signature
const payload = req.body.bt_payload
gateway.webhookNotification.parse(
signature,
payload,
(err, webhookNotification) => {
if (err) {
return res.status(400).send('Webhook inválido')
}
switch (webhookNotification.kind) {
case 'subscription_charged_successfully':
handleSuccessfulCharge(webhookNotification.subscription)
break
case 'subscription_charged_unsuccessfully':
handleFailedCharge(webhookNotification.subscription)
break
case 'dispute_opened':
handleDispute(webhookNotification.dispute)
break
case 'transaction_settled':
handleSettledTransaction(webhookNotification.transaction)
break
}
res.status(200).send('OK')
}
)
})
Registrar webhook no Braintree
No painel Braintree, acesse Configurações → Webhooks e adicione a URL do endpoint. Em desenvolvimento, use ngrok ou similar para receber webhooks localmente.
Testando com Apidog
APIs de pagamento exigem testes detalhados. Não use dados de produção. O Apidog permite simular e validar todos os fluxos sem riscos.
1. Simular cargas de webhook
Monte cargas simuladas e envie para seu endpoint:
{
"bt_signature": "test_signature",
"bt_payload": "eyJraW5kIjoidHJhbnNhY3Rpb25fc2V0dGxlZCIsInRyYW5zYWN0aW9uIjp7ImlkIjoiYWJjMTIzIiwiYW1vdW50IjoiNDkuOTkiLCJzdGF0dXMiOiJzZXR0bGVkIn19"
}
2. Separação de ambientes
Configure variáveis de ambiente por ambiente:
# Sandbox
BRAINTREE_MERCHANT_ID: sandbox_merchant
BRAINTREE_PUBLIC_KEY: sandbox_public
BRAINTREE_PRIVATE_KEY: sandbox_private
BRAINTREE_ENVIRONMENT: sandbox
# Production
BRAINTREE_MERCHANT_ID: live_merchant
BRAINTREE_PUBLIC_KEY: live_public
BRAINTREE_PRIVATE_KEY: live_private
BRAINTREE_ENVIRONMENT: production
3. Validar respostas de webhook
No seu runner de testes:
pm.test('Webhook processado com sucesso', () => {
pm.response.to.have.status(200)
pm.response.to.have.body('OK')
})
pm.test('ID da transação logado', () => {
const transactionId = pm.environment.get('last_transaction_id')
pm.expect(transactionId).to.not.be.empty
})
Teste webhooks do Braintree com Apidog - grátis
Erros comuns e correções
Processador Recusou
Causa: O banco do cliente recusou a transação.
Correção: Exiba erro genérico e sugira outro cartão. Registre o processorResponseCode para depuração.
if (!result.success) {
if (result.transaction.processorResponseCode === '2000') {
return res.status(400).json({
error: 'Seu banco recusou esta transação. Por favor, tente um cartão diferente.'
})
}
}
Gateway Rejeitou
Causa: Filtros de fraude do Braintree bloquearam.
Correção: Verifique o gatewayRejectionReason:
if (result.transaction.gatewayRejectionReason === 'cvv') {
// Divergência de CVV
}
if (result.transaction.gatewayRejectionReason === 'avs') {
// Verificação de endereço falhou
}
if (result.transaction.gatewayRejectionReason === 'fraud') {
// Bloqueio por fraude
}
Falhas na liquidação
Causa: Transação não foi liquidada após autorização.
Correção: Monitore webhooks transaction_settlement_declined. Causas comuns: cartão expirado, bloqueio do emissor, fundos insuficientes.
Transações duplicadas
Causa: Cliente clicou duas vezes em "Pagar" ou o código fez retry.
Correção: Use o parâmetro orderId para evitar duplicidades:
const result = await gateway.transaction.sale({
amount: '49.99',
paymentMethodNonce: nonce,
orderId: 'UNIQUE-ORDER-123',
options: {
submitForSettlement: true
}
})
Alternativas e comparações
| Característica | Braintree | Stripe | PayPal |
|---|---|---|---|
| Preços | 2.9% + 30¢ | 2.9% + 30¢ | 2.9% + 30¢ |
| Suporte PayPal | Nativo | Adicional | Nativo |
| Assinaturas | Sim | Sim | Limitado |
| Internacional | 46 países | 46 países | Mais de 200 países |
| Ferramentas de fraude | Incorporado | Incorporado | Básico |
| Qualidade do SDK | Excelente | Excelente | Bom |
| Pagamentos | Sim | Sim | Sim |
A principal vantagem do Braintree é o suporte nativo ao PayPal e Venmo. Se você precisa de cartão e PayPal, a integração costuma ser mais simples do que Stripe + PayPal separadamente.
Casos de uso reais
Plataforma SaaS: Ferramenta de gerenciamento de projetos usa Braintree para assinaturas mensais. Webhooks tratam pagamentos falhos e notificam usuários por e-mail. Usuários atualizam métodos de pagamento autônomos.
Marketplace: Plataforma de freelancers divide pagamentos entre taxa da plataforma e freelancers, usando sub-comerciantes do Braintree.
E-commerce com PayPal: Loja online oferece cartões e PayPal via integração unificada, usando o mesmo objeto cliente para ambos.
Conclusão
Resumo prático:
- SDKs do Braintree processam pagamentos server-side.
- Tokens de cliente autorizam o frontend.
- Transações cobram cartões e PayPal.
- Assinaturas automatizam cobrança recorrente.
- Webhooks notificam sobre eventos de pagamento.
- Teste tudo com Apidog antes de ir para produção.
Perguntas Frequentes
O que é um nonce de método de pagamento?
Nonce é um token de uso único que representa o método de pagamento. O frontend gera esse token após o usuário inserir os dados do cartão. O backend usa o nonce para cobrar. Nonces expiram em 3 horas.
Qual a diferença entre autorização e liquidação?
Autorização reserva fundos. Liquidação efetiva a cobrança. Por padrão, o Braintree liquida automaticamente. Para pré-vendas, autorize e liquide depois:
// Autorizar apenas
await gateway.transaction.sale({
amount: '99.00',
paymentMethodNonce: nonce,
options: {
submitForSettlement: false
}
})
// Liquidar posteriormente
await gateway.transaction.submitForSettlement('transaction_id')
Como lido com moedas?
Cada conta de comerciante tem uma moeda padrão. Para multi-moeda, são necessárias contas separadas. Consulte o suporte Braintree para configuração.
Que números de cartão de teste devo usar?
-
4111111111111111– Visa (sucesso) -
4000111111111115– Visa (recusa) -
5555555555554444– Mastercard (sucesso) -
378282246310005– Amex (sucesso)
Como lido com disputas/chargebacks?
Monitore webhooks dispute_opened, dispute_won e dispute_lost. Envie evidências pelo painel do Braintree. Documente todas as interações e entregas.
Posso armazenar números de cartão de crédito?
Não. Armazene apenas tokens de método de pagamento. O Braintree cuida da conformidade PCI.
O que é 3D Secure?
3D Secure adiciona verificação extra para transações online. Habilite no painel e trate respostas authentication_required:
const result = await gateway.transaction.sale({
amount: '100.00',
paymentMethodNonce: nonce,
threeDSecure: {
required: true
}
})
Quanto tempo levam os reembolsos?
Normalmente, 3 a 5 dias úteis, dependendo do banco do cliente. O webhook transaction_refunded sinaliza a conclusão.


Top comments (0)