#!/bin/bash # šŸ¦ Script para Implementar PIX no Liberi Kids # Execute: ./implementar-pix.sh echo "šŸ¦ Implementando PIX no Liberi Kids" echo "==================================" # Cores para output GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' log() { echo -e "${GREEN}[INFO]${NC} $1" } warn() { echo -e "${YELLOW}[WARN]${NC} $1" } info() { echo -e "${BLUE}[PIX]${NC} $1" } # Instalar dependĆŖncia do Mercado Pago log "Instalando SDK do Mercado Pago..." npm install mercadopago # Criar arquivo de configuração PIX log "Criando configuração PIX..." cat > config/mercadopago.js << 'EOF' const mercadopago = require('mercadopago'); class MercadoPagoService { constructor() { if (process.env.MERCADOPAGO_ACCESS_TOKEN) { mercadopago.configurations.setAccessToken(process.env.MERCADOPAGO_ACCESS_TOKEN); } } async gerarPix(dados) { try { const payment_data = { transaction_amount: parseFloat(dados.valor), description: dados.descricao || `Venda #${dados.venda_id} - Liberi Kids`, payment_method_id: 'pix', payer: { email: dados.cliente_email || 'cliente@liberikids.com', first_name: dados.cliente_nome || 'Cliente', identification: { type: 'CPF', number: dados.cliente_cpf || '00000000000' } }, external_reference: dados.venda_id.toString(), notification_url: `${process.env.BASE_URL || 'http://localhost:5000'}/api/pix/webhook`, date_of_expiration: new Date(Date.now() + 30 * 60 * 1000).toISOString() // 30 minutos }; const payment = await mercadopago.payment.create(payment_data); return { 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, transaction_amount: payment.body.transaction_amount, status: payment.body.status }; } catch (error) { console.error('Erro ao gerar PIX:', error); return { success: false, error: error.message }; } } async consultarPagamento(payment_id) { try { const payment = await mercadopago.payment.get(payment_id); return { success: true, status: payment.body.status, status_detail: payment.body.status_detail, transaction_amount: payment.body.transaction_amount, date_approved: payment.body.date_approved, external_reference: payment.body.external_reference }; } catch (error) { console.error('Erro ao consultar pagamento:', error); return { success: false, error: error.message }; } } } module.exports = new MercadoPagoService(); EOF # Criar CSS para PIX log "Criando estilos PIX..." cat > client/src/styles/pix-integration.css << 'EOF' /* PIX Integration Styles */ .pix-modal { max-width: 500px; width: 90vw; } .pix-content { text-align: center; } .qr-code-section { margin-bottom: 20px; padding: 20px; background: #f8f9fa; border-radius: 8px; } .qr-code-image { max-width: 200px; height: auto; border: 2px solid #ddd; border-radius: 8px; padding: 10px; background: white; box-shadow: 0 2px 8px rgba(0,0,0,0.1); } .pix-copy-section { margin-bottom: 20px; } .pix-code-container { display: flex; gap: 10px; margin-top: 10px; } .pix-code-input { flex: 1; padding: 10px; border: 1px solid #ddd; border-radius: 4px; font-family: monospace; font-size: 12px; background: #f8f9fa; } .btn-copy-pix { background: #00d4aa; color: white; border: none; padding: 10px 15px; border-radius: 4px; cursor: pointer; white-space: nowrap; font-weight: bold; transition: all 0.3s ease; } .btn-copy-pix:hover { background: #00b894; transform: translateY(-1px); } .pix-info { background: #e8f5e8; padding: 15px; border-radius: 8px; text-align: left; border-left: 4px solid #00d4aa; } .pix-instructions { margin-top: 10px; font-size: 14px; color: #666; line-height: 1.5; } .btn-pix { background: #00d4aa; color: white; border: none; padding: 8px 12px; border-radius: 4px; cursor: pointer; font-size: 12px; font-weight: bold; transition: all 0.3s ease; } .btn-pix:hover { background: #00b894; transform: translateY(-1px); } .btn-pix:disabled { background: #ccc; cursor: not-allowed; transform: none; } .pix-status { padding: 10px; border-radius: 4px; margin: 10px 0; font-weight: bold; } .pix-status.pending { background: #fff3cd; color: #856404; border: 1px solid #ffeaa7; } .pix-status.approved { background: #d4edda; color: #155724; border: 1px solid #c3e6cb; } .pix-status.rejected { background: #f8d7da; color: #721c24; border: 1px solid #f5c6cb; } .pix-timer { background: #fff3cd; padding: 10px; border-radius: 4px; margin: 10px 0; text-align: center; font-weight: bold; color: #856404; } @media (max-width: 768px) { .pix-modal { width: 95vw; margin: 10px; } .qr-code-image { max-width: 150px; } .pix-code-container { flex-direction: column; } .btn-copy-pix { width: 100%; } } EOF # Atualizar .env.example log "Atualizando .env.example com configuraƧƵes PIX..." cat >> .env.example << 'EOF' # ===================================================== # CONFIGURAƇƕES PIX - MERCADO PAGO # ===================================================== # Access Token do Mercado Pago (TEST para desenvolvimento, PROD para produção) MERCADOPAGO_ACCESS_TOKEN=TEST-sua_access_token_aqui # Public Key do Mercado Pago MERCADOPAGO_PUBLIC_KEY=pk_test_sua_public_key_aqui # URL base para webhooks (importante para produção) BASE_URL=http://localhost:5000 # ===================================================== # INSTRUƇƕES PIX # ===================================================== # 1. Acesse: https://www.mercadopago.com.br/developers # 2. Crie uma conta de desenvolvedor # 3. VĆ” em "Suas integraƧƵes" > "Criar aplicação" # 4. Escolha "Pagamentos online" e "Checkout Pro" # 5. Copie as credenciais de TEST para desenvolvimento # 6. Para produção, use as credenciais PROD # 7. Configure o webhook URL no painel do Mercado Pago EOF # Criar script SQL para PIX log "Criando migração do banco para PIX..." cat > sql/add-pix-fields.sql << 'EOF' -- Adicionar campos PIX na tabela vendas ALTER TABLE vendas ADD COLUMN IF NOT EXISTS status_pagamento VARCHAR(20) DEFAULT 'pendente'; ALTER TABLE vendas ADD COLUMN IF NOT EXISTS data_pagamento TIMESTAMP; ALTER TABLE vendas ADD COLUMN IF NOT EXISTS pix_payment_id VARCHAR(100); ALTER TABLE vendas ADD COLUMN IF NOT EXISTS pix_qr_code TEXT; ALTER TABLE vendas ADD COLUMN IF NOT EXISTS metodo_pagamento VARCHAR(20) DEFAULT 'dinheiro'; -- Criar Ć­ndices para performance CREATE INDEX IF NOT EXISTS idx_vendas_status_pagamento ON vendas(status_pagamento); CREATE INDEX IF NOT EXISTS idx_vendas_pix_payment_id ON vendas(pix_payment_id); -- ComentĆ”rios para documentação COMMENT ON COLUMN vendas.status_pagamento IS 'Status do pagamento: pendente, pago, cancelado, expirado'; COMMENT ON COLUMN vendas.data_pagamento IS 'Data e hora da confirmação do pagamento'; COMMENT ON COLUMN vendas.pix_payment_id IS 'ID do pagamento no Mercado Pago'; COMMENT ON COLUMN vendas.pix_qr_code IS 'Código PIX para copiar e colar'; COMMENT ON COLUMN vendas.metodo_pagamento IS 'MĆ©todo: dinheiro, cartao, pix, transferencia'; EOF echo "" info "šŸŽ‰ Implementação PIX configurada com sucesso!" echo "" warn "šŸ“ PRƓXIMOS PASSOS:" echo "1. Crie conta no Mercado Pago: https://www.mercadopago.com.br/developers" echo "2. Configure as credenciais no arquivo .env" echo "3. Execute a migração do banco: psql -f sql/add-pix-fields.sql" echo "4. Adicione as rotas PIX no server-supabase.js" echo "5. Implemente o modal PIX no frontend" echo "" info "šŸ“– Consulte o arquivo INTEGRACAO-PIX-GUIDE.md para instruƧƵes completas" echo "" log "Arquivos criados:" echo " - config/mercadopago.js (ServiƧo PIX)" echo " - client/src/styles/pix-integration.css (Estilos)" echo " - sql/add-pix-fields.sql (Migração banco)" echo " - .env.example (ConfiguraƧƵes atualizadas)"