Integrando a API 4Geeks Payments em um aplicativo Node.js¶
Visão geral¶
4Geeks Payments é uma plataforma Merchant of Record (MoR) que lida com todo o ciclo de vida da transação - desde a aceitação de pagamentos até o gerenciamento de assinaturas, conformidade fiscal e prevenção de fraudes. Este tutorial mostra como integrar a API REST 4Geeks Payments em um aplicativo Node.js.
Neste tutorial, você irá:
- Configure sua conta 4Geeks Payments e obtenha chaves API
- Criar uma cobrança (pagamento único)
- Criar e gerenciar clientes
- Gerar links de pagamento
- Lidar com webhooks para eventos de pagamento
- Processar reembolsos
Pré-requisitos¶
- Uma conta 4Geeks Payments ativada (ativar serviço)
- Node.js 18+ instalado
- gerenciador de pacotes npm ou fio
- Compreensão básica de APIs REST e Express.js
Etapa 1: Obtenha suas chaves de API¶
- Faça login em console.4geeks.io
- Navegue até Pagamentos → Configurações → Chaves de API
- Clique em “Gerar chave de API”
- Copie e armazene com segurança:
- Chave Pública (para operações do lado do cliente)
- Chave secreta (para operações no lado do servidor — nunca exponha isso)
Importante: Use chaves de sandbox para testes. Mude para chaves de produção quando estiver pronto para entrar no ar.
Etapa 2: Configure seu projeto¶
Crie a estrutura do seu projeto:
Etapa 3: Configurar variáveis de ambiente¶
Crie um arquivo .env:
FOURGEEKS_PAYMENTS_SECRET_KEY=sk_test_your_secret_key_here
FOURGEEKS_PAYMENTS_PUBLIC_KEY=pk_test_your_public_key_here
FOURGEEKS_PAYMENTS_API_URL=https://api.4geeks.io/v1
PORT=3000
Etapa 4: Crie o servidor expresso¶
Crie server.js:
CODE_BLOCO_3
Etapa 5: Crie rotas de pagamento¶
Crie routes/payments.js:
const express = require('express');
const axios = require('axios');
const router = express.Router();
const API_URL = process.env.FOURGEEKS_PAYMENTS_API_URL;
const SECRET_KEY = process.env.FOURGEEKS_PAYMENTS_SECRET_KEY;
const api = axios.create({
baseURL: API_URL,
headers: {
'Authorization': `Bearer ${SECRET_KEY}`,
'Content-Type': 'application/json',
},
});
// Create a one-time charge
router.post('/charges', async (req, res) => {
try {
const { amount, currency, customer_id, description } = req.body;
const response = await api.post('/charges', {
amount, // Amount in cents (e.g., 1000 = $10.00)
currency, // e.g., 'USD', 'EUR', 'CRC'
customer_id, // Existing customer ID or create new
description,
capture: true, // Auto-capture the charge
});
res.json({ success: true, charge: response.data });
} catch (error) {
console.error('Charge error:', error.response?.data || error.message);
res.status(error.response?.status || 500).json({
success: false,
error: error.response?.data || 'Failed to create charge',
});
}
});
// Create a customer
router.post('/customers', async (req, res) => {
try {
const { email, name, phone, metadata } = req.body;
const response = await api.post('/customers', {
email,
name,
phone,
metadata, // Optional: custom key-value pairs
});
res.json({ success: true, customer: response.data });
} catch (error) {
res.status(error.response?.status || 500).json({
success: false,
error: error.response?.data || 'Failed to create customer',
});
}
});
// Generate a payment link
router.post('/payment-links', async (req, res) => {
try {
const { amount, currency, description, customer_email, success_url, cancel_url } = req.body;
const response = await api.post('/payment-links', {
amount,
currency,
description,
customer_email,
success_url, // Redirect after successful payment
cancel_url, // Redirect if customer cancels
});
res.json({ success: true, payment_link: response.data });
} catch (error) {
res.status(error.response?.status || 500).json({
success: false,
error: error.response?.data || 'Failed to create payment link',
});
}
});
// Process a refund
router.post('/charges/:charge_id/refund', async (req, res) => {
try {
const { charge_id } = req.params;
const { amount, reason } = req.body;
const response = await api.post(`/charges/${charge_id}/refunds`, {
amount, // Optional: partial refund (in cents). Omit for full refund
reason, // e.g., 'duplicate', 'fraudulent', 'requested_by_customer'
});
res.json({ success: true, refund: response.data });
} catch (error) {
res.status(error.response?.status || 500).json({
success: false,
error: error.response?.data || 'Failed to process refund',
});
}
});
// Get charge details
router.get('/charges/:charge_id', async (req, res) => {
try {
const { charge_id } = req.params;
const response = await api.get(`/charges/${charge_id}`);
res.json({ success: true, charge: response.data });
} catch (error) {
res.status(error.response?.status || 500).json({
success: false,
error: error.response?.data || 'Failed to get charge',
});
}
});
module.exports = router;
Etapa 6: lidar com webhooks¶
Webhooks notificam seu servidor sobre eventos de pagamento (cobranças bem-sucedidas, falhas de pagamento, reembolsos, etc.).
Adicione ao server.js:
CODE_BLOCO_5
Etapa 7: teste sua integração¶
Inicie o servidor:
Teste com ondulação:
# Create a customer
curl -X POST http://localhost:3000/api/payments/customers \
-H "Content-Type: application/json" \
-d '{"email": "test@example.com", "name": "John Doe"}'
# Create a charge
curl -X POST http://localhost:3000/api/payments/charges \
-H "Content-Type: application/json" \
-d '{"amount": 1000, "currency": "USD", "customer_id": "cus_xxx", "description": "Test charge"}'
# Generate a payment link
curl -X POST http://localhost:3000/api/payments/payment-links \
-H "Content-Type: application/json" \
-d '{"amount": 2500, "currency": "USD", "description": "Premium Plan", "success_url": "https://yoursite.com/success", "cancel_url": "https://yoursite.com/cancel"}'
Cartões de teste¶
Use estes cartões de teste no modo sandbox:
| Número do cartão | Resultado |
|---|---|
| 4242 4242 4242 4242 | Pagamento bem sucedido |
| 4000 0000 0000 9995 | Recusado (fundos insuficientes) |
| 4000 0000 0000 0002 | Requer autenticação 3D Secure |
| 4000 0000 0000 0010 | Requer verificação CVC |
Melhores práticas¶
Segurança¶
- Nunca exponha sua chave secreta no código do lado do cliente
- Use variáveis de ambiente para todas as credenciais
- Verifique as assinaturas do webhook para evitar eventos falsificados
- Implementar chaves de idempotência para criação de cobrança para evitar duplicatas
Tratamento de erros¶
- Sempre verifique
error.response?.datapara mensagens de erro detalhadas - Implementar lógica de repetição para falhas transitórias
- Registrar todos os eventos de pagamento para auditoria
- Lidar com redirecionamentos 3D Secure normalmente
Conformidade¶
- 4Geeks Payments é compatível com PCI DSS – os dados do cartão nunca chegam aos seus servidores
- A conformidade fiscal é tratada automaticamente (IVA, imposto sobre vendas, GST)
- Como Merchant of Record, a 4Geeks lida com a responsabilidade de estorno
O que vem a seguir?¶
- Saiba mais sobre Faturamento de assinatura recorrente
- Explore Implementação 3D Secure
- Leia sobre Check-out multimoedas
- Verifique a [Referência da API] completa(https://docs.4geeks.io/en/api/)
Precisa de ajuda?¶
- Documentação: docs.4geeks.io/en/payments
- Referência da API: docs.4geeks.io/en/api
- Discordância: Discordância
- Suporte: disponível no painel do console
Ainda tem dúvidas? Pergunte na Discord or explore tutoriais