═══════════════════════════════════════════════════════════════════════════════ 📊 ANÁLISE: Reload Automático e Disparos Duplicados do Pixel ═══════════════════════════════════════════════════════════════════════════════ Data: 2026-02-17 Problema: Eventos Purchase sendo disparados a cada 5 segundos ═══════════════════════════════════════════════════════════════════════════════ 1️⃣ O QUE ESTÁ CAUSANDO O RELOAD AUTOMÁTICO ═══════════════════════════════════════════════════════════════════════════════ LOCALIZAÇÃO: Linhas 800-805 do obrigado.php CÓDIGO: CONDIÇÃO: Este código só executa quando: - $produtosAdquiridos está VAZIO (linha 791: ) - Ou seja, quando o pagamento ainda NÃO foi confirmado FLUXO DO PROBLEMA: 1. Cliente acessa obrigado.php após pagamento 2. Pagamento ainda não foi confirmado pelo InfinitePay 3. $produtosAdquiridos está vazio 4. Página mostra "Aguardando confirmação do pagamento..." 5. Após 5 segundos → location.reload() executa 6. Página recarrega → Pixel dispara NOVAMENTE (PageView + Purchase) 7. Se ainda não houver produtos → Loop continua 8. Resultado: Eventos disparados infinitamente a cada 5 segundos ═══════════════════════════════════════════════════════════════════════════════ 2️⃣ PROPÓSITO DO RELOAD AUTOMÁTICO ═══════════════════════════════════════════════════════════════════════════════ OBJETIVO ORIGINAL: ✓ Verificar automaticamente se o pagamento foi confirmado ✓ Exibir os links de download assim que o pagamento for aprovado ✓ Evitar que o cliente precise recarregar manualmente ✓ Melhorar a experiência do usuário PROBLEMA ATUAL: ✗ O reload está funcionando corretamente ✗ MAS o pixel dispara a cada reload ✗ Causando múltiplos eventos na Meta ✗ Afetando métricas e relatórios ═══════════════════════════════════════════════════════════════════════════════ 3️⃣ SOLUÇÕES PARA EVITAR DISPAROS DUPLICADOS ═══════════════════════════════════════════════════════════════════════════════ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ OPÇÃO 1: Usar coluna pixel_enviado (RECOMENDADA) ⭐ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ VANTAGENS: ✅ Já existe no banco de dados ✅ Persiste entre sessões ✅ Funciona mesmo com múltiplos reloads ✅ Evita disparos duplicados de forma confiável ✅ Mantém o reload funcionando (só não dispara pixel) COMO FUNCIONA: 1. Verifica se pixel_enviado = 0 antes de disparar 2. Se 0 → Dispara Purchase e marca como 1 3. Se 1 → Não dispara (mesmo com reloads) 4. Reload continua verificando pagamento, mas pixel não dispara IMPLEMENTAÇÃO: - Restaurar lógica condicional que já existia - Usar $deveDispararPixel baseado em pixel_enviado - Manter reload para verificar pagamento CÓDIGO SUGERIDO: 0): ?> fbq('track', 'Purchase', {...}); ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ OPÇÃO 2: Usar localStorage (JavaScript) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ VANTAGENS: ✅ Não depende do banco de dados ✅ Funciona mesmo sem order_nsu ✅ Rápido de implementar ✅ Persiste entre reloads na mesma sessão DESVANTAGENS: ❌ Pode ser limpo pelo usuário ❌ Não funciona entre dispositivos ❌ Não persiste entre sessões diferentes CÓDIGO: if (!localStorage.getItem('pixel_purchase_sent_' + orderNsu)) { fbq('track', 'Purchase', {...}); localStorage.setItem('pixel_purchase_sent_' + orderNsu, 'true'); } ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ OPÇÃO 3: Usar sessionStorage (JavaScript) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ VANTAGENS: ✅ Mais leve que localStorage ✅ Limpa automaticamente ao fechar aba DESVANTAGENS: ❌ Não persiste entre abas ❌ Limpa ao fechar navegador ❌ Não funciona se usuário abrir nova aba CÓDIGO: if (!sessionStorage.getItem('pixel_sent')) { fbq('track', 'Purchase', {...}); sessionStorage.setItem('pixel_sent', 'true'); } ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ OPÇÃO 4: Usar Event ID para deduplicação (Meta) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ VANTAGENS: ✅ Meta faz deduplicação automática ✅ Não precisa de lógica adicional DESVANTAGENS: ❌ Ainda envia múltiplas requisições (desperdício) ❌ Pode afetar métricas/relatórios ❌ Não é melhor prática COMO FUNCIONA: - Usar mesmo eventID em todos os disparos - Meta deduplica automaticamente - Mas ainda gera tráfego desnecessário ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ OPÇÃO 5: Combinar Banco + JavaScript (MAIS ROBUSTA) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ VANTAGENS: ✅ Dupla proteção ✅ Funciona mesmo se JavaScript falhar ✅ Funciona mesmo se banco falhar COMO FUNCIONA: 1. Verifica pixel_enviado no PHP (banco) 2. Verifica localStorage no JavaScript (cliente) 3. Só dispara se ambos permitirem ═══════════════════════════════════════════════════════════════════════════════ 🎯 RECOMENDAÇÃO FINAL ═══════════════════════════════════════════════════════════════════════════════ RECOMENDO: OPÇÃO 1 (Usar pixel_enviado no banco) MOTIVOS: 1. ✅ Já existe a coluna no banco 2. ✅ Persiste entre sessões 3. ✅ Funciona mesmo com múltiplos reloads 4. ✅ Evita disparos duplicados de forma confiável 5. ✅ Mantém o reload funcionando (só não dispara pixel) IMPLEMENTAÇÃO SUGERIDA: // No PHP, antes de disparar: if ($isPaid && $pixelJaEnviado === 0) { $deveDispararPixel = true; // Marca como enviado ANTES de disparar UPDATE compras SET pixel_enviado = 1 WHERE order_nsu = ? } // No JavaScript: 0): ?> fbq('track', 'Purchase', {...}); RESULTADO: ✓ Reload continua funcionando (verifica pagamento) ✓ Pixel dispara apenas UMA VEZ por compra ✓ Mesmo com múltiplos reloads, não dispara novamente ✓ Métricas corretas na Meta ═══════════════════════════════════════════════════════════════════════════════ 📋 RESUMO ═══════════════════════════════════════════════════════════════════════════════ PROBLEMA: - Reload automático a cada 5s quando pagamento não confirmado - Pixel dispara a cada reload - Eventos duplicados na Meta CAUSA: - Código nas linhas 800-805 recarrega página - Pixel dispara sempre que página carrega - Loop infinito até pagamento ser confirmado SOLUÇÃO RECOMENDADA: - Usar coluna pixel_enviado do banco - Disparar apenas quando pixel_enviado = 0 - Manter reload funcionando (só não dispara pixel) ═══════════════════════════════════════════════════════════════════════════════