Skip to content

Cobrança com Mercado Pago

Integração nativa com Mercado Pago para processar pagamentos com cartão de crédito.

GET /api/charge/mercado-pago

Obtém a chave pública do Mercado Pago para integração.

Endpoint

GET https://api.divipay.com.br/api/charge/mercado-pago

Headers

HeaderValorObrigatório
AuthorizationBearerSim

Exemplo de Requisição

bash
curl -X GET https://api.divipay.com.br/api/charge/mercado-pago \
  -H "Authorization: Bearer SEU_TOKEN"

Resposta

json
{
  "publicKey": "APP_USR-abc123xyz-456def-789ghi"
}

POST /api/charge/mercado-pago

Cria uma cobrança usando Mercado Pago.

Endpoint

POST https://api.divipay.com.br/api/charge/mercado-pago

Body Parameters

CampoTipoDescriçãoObrigatório
amountnumberValor da cobrançaSim
descriptionstringDescrição (máx. 15 caracteres)Sim
referenceIdstringID de referênciaSim
callbackUrlstringURL para webhookSim
installmentsnumberNúmero de parcelasSim
customerIdstringID da subcontaNão
clientobjectDados do clienteSim
ipAddressstringIP do clienteSim
mercadoPagoobjectDados do Mercado PagoSim
itensarrayLista de itensSim
shippingobjectEndereço de entregaSim

Objeto MercadoPago

CampoTipoDescriçãoObrigatório
issuer_idnumberID do emissor do cartãoSim
tokenstringToken do cartão (gerado pelo MP)Sim
payment_method_idstringID do método de pagamentoSim

Fluxo de Integração

mermaid
sequenceDiagram
    participant C as Cliente
    participant F as Frontend
    participant MP as Mercado Pago
    participant API as DiviPay API
    
    F->>API: 1. GET /mercado-pago (obter publicKey)
    API->>F: publicKey
    
    C->>F: 2. Inserir dados do cartão
    F->>MP: 3. Criar token (usando SDK MP)
    MP->>F: token, issuer_id, payment_method_id
    
    F->>API: 4. POST /mercado-pago (criar cobrança)
    API->>MP: 5. Processar pagamento
    MP->>API: 6. Resultado
    API->>F: 7. Resposta

Exemplo Frontend (JavaScript)

html
<!DOCTYPE html>
<html>
<head>
  <script src="https://sdk.mercadopago.com/js/v2"></script>
</head>
<body>
  <form id="payment-form">
    <input type="text" id="cardNumber" placeholder="Número do cartão" />
    <input type="text" id="cardholderName" placeholder="Nome no cartão" />
    <input type="text" id="cardExpirationMonth" placeholder="Mês" />
    <input type="text" id="cardExpirationYear" placeholder="Ano" />
    <input type="text" id="securityCode" placeholder="CVV" />
    <button type="submit">Pagar</button>
  </form>

  <script>
    // 1. Obter chave pública
    async function getPublicKey() {
      const response = await fetch(
        'https://api.divipay.com.br/api/charge/mercado-pago',
        {
          headers: { 'Authorization': 'Bearer SEU_TOKEN' }
        }
      );
      const data = await response.json();
      return data.publicKey;
    }

    // 2. Inicializar Mercado Pago
    async function initMercadoPago() {
      const publicKey = await getPublicKey();
      const mp = new MercadoPago(publicKey);
      return mp;
    }

    // 3. Processar pagamento
    document.getElementById('payment-form').addEventListener('submit', async (e) => {
      e.preventDefault();

      try {
        const mp = await initMercadoPago();

        // Criar token do cartão
        const cardData = {
          cardNumber: document.getElementById('cardNumber').value,
          cardholderName: document.getElementById('cardholderName').value,
          cardExpirationMonth: document.getElementById('cardExpirationMonth').value,
          cardExpirationYear: document.getElementById('cardExpirationYear').value,
          securityCode: document.getElementById('securityCode').value
        };

        const token = await mp.createCardToken(cardData);

        // Obter método de pagamento
        const paymentMethod = await mp.getPaymentMethods({
          bin: cardData.cardNumber.substring(0, 6)
        });

        // Criar cobrança na DiviPay
        const response = await fetch(
          'https://api.divipay.com.br/api/charge/mercado-pago',
          {
            method: 'POST',
            headers: {
              'Authorization': 'Bearer SEU_TOKEN',
              'Content-Type': 'application/json'
            },
            body: JSON.stringify({
              amount: 100.00,
              description: 'Compra Online',
              referenceId: 'order-123',
              callbackUrl: 'https://seusite.com/webhook',
              installments: 1,
              ipAddress: '192.168.1.1',
              mercadoPago: {
                issuer_id: token.issuer_id,
                token: token.id,
                payment_method_id: paymentMethod.results[0].id
              },
              client: {
                name: 'João Silva',
                document: '12345678901',
                email: 'joao@email.com',
                phone: '11999999999'
              },
              itens: [
                {
                  name: 'Produto',
                  quantity: 1,
                  unitPrice: 100.00,
                  feePercent: 0
                }
              ],
              shipping: {
                zipCode: '01310100',
                street: 'Av. Paulista',
                number: '1000',
                complement: '',
                district: 'Bela Vista',
                city: 'São Paulo',
                state: 'SP'
              }
            })
          }
        );

        const charge = await response.json();

        if (charge.status === 'PAID') {
          alert('Pagamento aprovado!');
        } else {
          alert('Pagamento recusado: ' + charge.returnMessage);
        }

      } catch (error) {
        console.error('Erro:', error);
        alert('Erro ao processar pagamento');
      }
    });
  </script>
</body>
</html>

Exemplo Backend (Node.js)

javascript
const express = require('express');
const app = express();

app.use(express.json());

// Endpoint para obter publicKey
app.get('/api/mp-key', async (req, res) => {
  try {
    const response = await fetch(
      'https://api.divipay.com.br/api/charge/mercado-pago',
      {
        headers: {
          'Authorization': `Bearer ${process.env.DIVIPAY_TOKEN}`
        }
      }
    );
    
    const data = await response.json();
    res.json({ publicKey: data.publicKey });
    
  } catch (error) {
    res.status(500).json({ error: error.message });
  }
});

// Endpoint para criar cobrança
app.post('/api/charge', async (req, res) => {
  try {
    const { mercadoPagoData, orderData } = req.body;

    const response = await fetch(
      'https://api.divipay.com.br/api/charge/mercado-pago',
      {
        method: 'POST',
        headers: {
          'Authorization': `Bearer ${process.env.DIVIPAY_TOKEN}`,
          'Content-Type': 'application/json'
        },
        body: JSON.stringify({
          amount: orderData.total,
          description: `Pedido #${orderData.id}`,
          referenceId: orderData.id,
          callbackUrl: `${process.env.BASE_URL}/webhook`,
          installments: mercadoPagoData.installments,
          ipAddress: req.ip,
          mercadoPago: {
            issuer_id: mercadoPagoData.issuer_id,
            token: mercadoPagoData.token,
            payment_method_id: mercadoPagoData.payment_method_id
          },
          client: orderData.customer,
          itens: orderData.items,
          shipping: orderData.shipping
        })
      }
    );

    const charge = await response.json();
    res.json(charge);

  } catch (error) {
    res.status(500).json({ error: error.message });
  }
});

app.listen(3000);

Resposta de Sucesso

Status: 201 Created

json
{
  "id": "mp_abc123xyz",
  "status": "PAID",
  "amount": 100.00,
  "payedAt": "2024-11-04T15:30:00.000Z",
  "customerId": null,
  "nsu": "123456",
  "authorizationCode": "ABC123",
  "returnCode": "approved",
  "returnMessage": "Pagamento aprovado"
}

Métodos de Pagamento Suportados

IDNomeTipo
visaVisaCrédito
masterMastercardCrédito
amexAmerican ExpressCrédito
eloEloCrédito
hipercardHipercardCrédito

Parcelamento

javascript
{
  "installments": 3,  // 3x sem juros
  "amount": 300.00    // 3x de R$ 100,00
}

Exemplo Completo com React

jsx
import React, { useState, useEffect } from 'react';

function CheckoutMercadoPago() {
  const [mp, setMp] = useState(null);
  const [loading, setLoading] = useState(false);

  useEffect(() => {
    // Carregar SDK do Mercado Pago
    const script = document.createElement('script');
    script.src = 'https://sdk.mercadopago.com/js/v2';
    script.async = true;
    script.onload = initMercadoPago;
    document.body.appendChild(script);
  }, []);

  async function initMercadoPago() {
    try {
      const response = await fetch('/api/mp-key');
      const { publicKey } = await response.json();
      const mercadoPago = new window.MercadoPago(publicKey);
      setMp(mercadoPago);
    } catch (error) {
      console.error('Erro ao inicializar MP:', error);
    }
  }

  async function handleSubmit(e) {
    e.preventDefault();
    setLoading(true);

    try {
      const formData = new FormData(e.target);
      
      // Criar token do cartão
      const token = await mp.createCardToken({
        cardNumber: formData.get('cardNumber'),
        cardholderName: formData.get('cardholderName'),
        cardExpirationMonth: formData.get('expirationMonth'),
        cardExpirationYear: formData.get('expirationYear'),
        securityCode: formData.get('securityCode')
      });

      // Obter método de pagamento
      const bin = formData.get('cardNumber').substring(0, 6);
      const paymentMethod = await mp.getPaymentMethods({ bin });

      // Criar cobrança
      const response = await fetch('/api/charge', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({
          mercadoPagoData: {
            issuer_id: token.issuer_id,
            token: token.id,
            payment_method_id: paymentMethod.results[0].id,
            installments: 1
          },
          orderData: {
            id: 'order-123',
            total: 100.00,
            customer: {
              name: formData.get('name'),
              document: formData.get('document'),
              email: formData.get('email'),
              phone: formData.get('phone')
            },
            items: [
              {
                name: 'Produto',
                quantity: 1,
                unitPrice: 100.00,
                feePercent: 0
              }
            ],
            shipping: {
              zipCode: '01310100',
              street: 'Av. Paulista',
              number: '1000',
              complement: '',
              district: 'Bela Vista',
              city: 'São Paulo',
              state: 'SP'
            }
          }
        })
      });

      const charge = await response.json();

      if (charge.status === 'PAID') {
        alert('Pagamento aprovado!');
      } else {
        alert('Pagamento recusado');
      }

    } catch (error) {
      console.error('Erro:', error);
      alert('Erro ao processar pagamento');
    } finally {
      setLoading(false);
    }
  }

  return (
    <form onSubmit={handleSubmit}>
      <h2>Pagamento com Mercado Pago</h2>
      
      <input name="name" placeholder="Nome completo" required />
      <input name="document" placeholder="CPF" required />
      <input name="email" type="email" placeholder="Email" required />
      <input name="phone" placeholder="Telefone" required />
      
      <input name="cardNumber" placeholder="Número do cartão" required />
      <input name="cardholderName" placeholder="Nome no cartão" required />
      <input name="expirationMonth" placeholder="Mês" required />
      <input name="expirationYear" placeholder="Ano" required />
      <input name="securityCode" placeholder="CVV" required />
      
      <button type="submit" disabled={loading || !mp}>
        {loading ? 'Processando...' : 'Pagar R$ 100,00'}
      </button>
    </form>
  );
}

export default CheckoutMercadoPago;

Webhook

Quando o pagamento for confirmado:

json
{
  "event": "charge.paid",
  "chargeId": "mp_abc123xyz",
  "referenceId": "order-123",
  "amount": 100.00,
  "paidAt": "2024-11-04T15:30:00.000Z",
  "status": "PAID",
  "paymentMethod": "MERCADO_PAGO"
}

Erros Comuns

Token Inválido

json
{
  "statusCode": 400,
  "message": "Invalid Mercado Pago token"
}

Pagamento Recusado

json
{
  "statusCode": 412,
  "message": "Payment rejected",
  "returnCode": "cc_rejected_insufficient_amount",
  "returnMessage": "Saldo insuficiente"
}

Segurança

IMPORTANTE

  • Nunca exponha sua chave privada
  • Use a chave pública apenas no frontend
  • Valide dados no backend
  • Implemente antifraude

Próximos Passos

Documentação da API DiviPay