Integracao Mercado Pago

Pagamentos com Preferences, PIX e webhooks do Mercado Pago.

A integracao Mercado Pago gera pagamentos via Checkout Pro (redirect) e PIX usando a SDK oficial do Mercado Pago. Ideal para o mercado brasileiro.

MercadoPago Service

// apps/api/src/integrations/mercadopago/mercadopago.service.ts
import { MercadoPagoConfig, Preference, Payment } from 'mercadopago';

export class MercadoPagoService {
  private client: MercadoPagoConfig;

  constructor() {
    this.client = new MercadoPagoConfig({
      accessToken: process.env.MERCADOPAGO_ACCESS_TOKEN!,
    });
  }

  async createPreference(params: {
    items: Array<{
      title: string;
      quantity: number;
      unit_price: number;
      currency_id?: string;
    }>;
    payer?: { email: string };
    externalReference?: string;
  }): Promise<{ id: string; initPoint: string }> {
    const preference = new Preference(this.client);
    const result = await preference.create({
      body: {
        items: params.items.map((item) => ({
          ...item,
          currency_id: item.currency_id || 'BRL',
        })),
        payer: params.payer,
        external_reference: params.externalReference,
        back_urls: {
          success: `${process.env.APP_URL}/payment/success`,
          failure: `${process.env.APP_URL}/payment/failure`,
          pending: `${process.env.APP_URL}/payment/pending`,
        },
        auto_return: 'approved',
        notification_url: `${process.env.API_URL}/api/webhooks/mercadopago`,
      },
    });

    return {
      id: result.id!,
      initPoint: result.init_point!,
    };
  }

  async createPixPayment(params: {
    amount: number;
    description: string;
    payerEmail: string;
  }): Promise<{ qrCode: string; qrCodeBase64: string; ticketUrl: string }> {
    const payment = new Payment(this.client);
    const result = await payment.create({
      body: {
        transaction_amount: params.amount,
        description: params.description,
        payment_method_id: 'pix',
        payer: { email: params.payerEmail },
      },
    });

    return {
      qrCode: result.point_of_interaction!.transaction_data!.qr_code!,
      qrCodeBase64: result.point_of_interaction!.transaction_data!.qr_code_base64!,
      ticketUrl: result.point_of_interaction!.transaction_data!.ticket_url!,
    };
  }
}

Webhook

// apps/api/src/integrations/mercadopago/mercadopago.webhook.ts
import { Payment, MercadoPagoConfig } from 'mercadopago';

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

  if (type === 'payment') {
    const client = new MercadoPagoConfig({
      accessToken: process.env.MERCADOPAGO_ACCESS_TOKEN!,
    });
    const paymentApi = new Payment(client);
    const payment = await paymentApi.get({ id: data.id });

    switch (payment.status) {
      case 'approved':
        console.log('Pagamento aprovado:', payment.id);
        // Atualizar pedido
        break;
      case 'pending':
        console.log('Pagamento pendente:', payment.id);
        break;
      case 'rejected':
        console.log('Pagamento rejeitado:', payment.id);
        break;
    }
  }

  res.sendStatus(200);
});

Variaveis de ambiente

VariavelDescricao
MERCADOPAGO_ACCESS_TOKENToken de acesso (test ou producao)
MERCADOPAGO_PUBLIC_KEYChave publica para o frontend

Obtenha suas credenciais em mercadopago.com.br/developers.