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-pagoHeaders
| Header | Valor | Obrigatório |
|---|---|---|
| Authorization | Bearer | Sim |
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-pagoBody Parameters
| Campo | Tipo | Descrição | Obrigatório |
|---|---|---|---|
| amount | number | Valor da cobrança | Sim |
| description | string | Descrição (máx. 15 caracteres) | Sim |
| referenceId | string | ID de referência | Sim |
| callbackUrl | string | URL para webhook | Sim |
| installments | number | Número de parcelas | Sim |
| customerId | string | ID da subconta | Não |
| client | object | Dados do cliente | Sim |
| ipAddress | string | IP do cliente | Sim |
| mercadoPago | object | Dados do Mercado Pago | Sim |
| itens | array | Lista de itens | Sim |
| shipping | object | Endereço de entrega | Sim |
Objeto MercadoPago
| Campo | Tipo | Descrição | Obrigatório |
|---|---|---|---|
| issuer_id | number | ID do emissor do cartão | Sim |
| token | string | Token do cartão (gerado pelo MP) | Sim |
| payment_method_id | string | ID do método de pagamento | Sim |
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. RespostaExemplo 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
| ID | Nome | Tipo |
|---|---|---|
| visa | Visa | Crédito |
| master | Mastercard | Crédito |
| amex | American Express | Crédito |
| elo | Elo | Crédito |
| hipercard | Hipercard | Cré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