# 🏦 Integração PIX com QR Code - Liberi Kids ## 🎯 **Opções de Integração PIX** ### **1. Mercado Pago (Recomendado)** - ✅ **Gratuito** para começar - ✅ **QR Code automático** - ✅ **Webhook para confirmação** - ✅ **Documentação excelente** ### **2. PagSeguro/PagBank** - ✅ **PIX instantâneo** - ✅ **Taxas competitivas** ### **3. Asaas** - ✅ **Focado em pequenas empresas** - ✅ **PIX + Boleto + Cartão** --- ## 🚀 **Implementação Mercado Pago** ### **Passo 1: Criar Conta** 1. Acesse: https://www.mercadopago.com.br/developers 2. Crie conta de desenvolvedor 3. Obtenha suas credenciais: - **Public Key** (pk_test_...) - **Access Token** (TEST-...) ### **Passo 2: Instalar SDK** ```bash npm install mercadopago ``` ### **Passo 3: Configurar no .env** ```env # Mercado Pago PIX MERCADOPAGO_ACCESS_TOKEN=TEST-sua_access_token_aqui MERCADOPAGO_PUBLIC_KEY=pk_test_sua_public_key_aqui ``` ### **Passo 4: API Backend** ```javascript // server-supabase.js - Adicionar rota PIX const mercadopago = require('mercadopago'); // Configurar Mercado Pago mercadopago.configurations.setAccessToken(process.env.MERCADOPAGO_ACCESS_TOKEN); // Rota para gerar PIX app.post('/api/pix/gerar', async (req, res) => { try { const { valor, descricao, cliente_email, venda_id } = req.body; const payment_data = { transaction_amount: parseFloat(valor), description: descricao || `Venda #${venda_id} - Liberi Kids`, payment_method_id: 'pix', payer: { email: cliente_email || 'cliente@liberikids.com' }, external_reference: venda_id.toString(), notification_url: `${process.env.BASE_URL}/api/pix/webhook` }; const payment = await mercadopago.payment.create(payment_data); res.json({ success: true, payment_id: payment.body.id, qr_code: payment.body.point_of_interaction.transaction_data.qr_code, qr_code_base64: payment.body.point_of_interaction.transaction_data.qr_code_base64, pix_copy_paste: payment.body.point_of_interaction.transaction_data.qr_code, expiration_date: payment.body.date_of_expiration }); } catch (error) { console.error('Erro ao gerar PIX:', error); res.status(500).json({ success: false, error: error.message }); } }); // Webhook para receber confirmação de pagamento app.post('/api/pix/webhook', async (req, res) => { try { const { type, data } = req.body; if (type === 'payment') { const payment = await mercadopago.payment.get(data.id); if (payment.body.status === 'approved') { const venda_id = payment.body.external_reference; // Atualizar status da venda no banco const { error } = await supabase .from('vendas') .update({ status_pagamento: 'pago', data_pagamento: new Date(), pix_payment_id: payment.body.id }) .eq('id', venda_id); if (!error) { console.log(`Pagamento confirmado para venda #${venda_id}`); } } } res.status(200).send('OK'); } catch (error) { console.error('Erro no webhook PIX:', error); res.status(500).send('Error'); } }); ``` ### **Passo 5: Frontend - Modal PIX** ```javascript // Adicionar ao Vendas.js const [showPixModal, setShowPixModal] = useState(false); const [pixData, setPixData] = useState(null); const [loadingPix, setLoadingPix] = useState(false); const gerarPix = async (venda) => { setLoadingPix(true); try { const response = await fetch('/api/pix/gerar', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ valor: venda.valor_total, descricao: `Venda #${venda.id_venda} - Liberi Kids`, cliente_email: venda.cliente?.email, venda_id: venda.id }) }); const data = await response.json(); if (data.success) { setPixData(data); setShowPixModal(true); } else { toast.error('Erro ao gerar PIX'); } } catch (error) { toast.error('Erro ao gerar PIX'); } setLoadingPix(false); }; // Modal PIX {showPixModal && (
Valor: R$ {parseFloat(pixData.transaction_amount).toFixed(2)}
Válido até: {new Date(pixData.expiration_date).toLocaleString()}
📱 Como pagar:
1. Abra o app do seu banco
2. Escaneie o QR Code ou cole o código PIX
3. Confirme o pagamento