Integracao AbacatePay

Pagamentos e PIX com AbacatePay, gateway brasileiro.

O AbacatePay e um gateway de pagamentos brasileiro focado em simplicidade. A integracao gera um service para criar cobranças e PIX.

AbacatePay Service

// apps/api/src/integrations/abacatepay/abacatepay.service.ts
export class AbacatePayService {
  private apiUrl: string;
  private apiKey: string;

  constructor() {
    this.apiUrl = process.env.ABACATEPAY_API_URL || 'https://api.abacatepay.com/v1';
    this.apiKey = process.env.ABACATEPAY_API_KEY!;
  }

  private async request(path: string, options: RequestInit = {}) {
    const response = await fetch(`${this.apiUrl}${path}`, {
      ...options,
      headers: {
        Authorization: `Bearer ${this.apiKey}`,
        'Content-Type': 'application/json',
        ...options.headers,
      },
    });

    if (!response.ok) {
      const error = await response.json();
      throw new Error(error.message || 'AbacatePay API error');
    }

    return response.json();
  }

  async createPixCharge(params: {
    amount: number; // em centavos
    description: string;
    customer: {
      name: string;
      email: string;
      cpf: string;
    };
    externalId?: string;
  }) {
    return this.request('/billing/pix', {
      method: 'POST',
      body: JSON.stringify({
        amount: params.amount,
        description: params.description,
        customer: params.customer,
        external_id: params.externalId,
        callback_url: `${process.env.API_URL}/api/webhooks/abacatepay`,
      }),
    });
  }

  async getCharge(chargeId: string) {
    return this.request(`/billing/${chargeId}`);
  }
}

Controller e Webhook

// apps/api/src/integrations/abacatepay/abacatepay.controller.ts

// Criar cobranca PIX
app.post('/api/payments/pix', authMiddleware, async (req, res) => {
  const { amount, description } = req.body;
  const user = req.user;

  const charge = await abacatePayService.createPixCharge({
    amount: Math.round(amount * 100), // converter para centavos
    description,
    customer: {
      name: user.name,
      email: user.email,
      cpf: user.cpf,
    },
    externalId: `order_${Date.now()}`,
  });

  res.json(charge);
});

// Webhook
app.post('/api/webhooks/abacatepay', async (req, res) => {
  const { event, data } = req.body;

  switch (event) {
    case 'billing.paid':
      console.log('Pagamento confirmado:', data.id);
      // Atualizar pedido, liberar acesso, etc.
      break;
    case 'billing.expired':
      console.log('Cobranca expirada:', data.id);
      break;
  }

  res.sendStatus(200);
});

Variaveis de ambiente

VariavelDescricao
ABACATEPAY_API_KEYChave de API do AbacatePay
ABACATEPAY_API_URLURL base da API (padrao: https://api.abacatepay.com/v1)