# Diagnóstico: PIX Funciona com Admin mas Não com Usuário

## 🔍 PROBLEMA IDENTIFICADO

**Admin:** ✅ Funciona - Redireciona para `backend/pix.php?produto_id=26&valor_total=1&qr_code_base64=...`  
**Usuário:** ❌ Não funciona - Redireciona para `views/checkout.php?` (sem parâmetros) e mostra "Erro: produto_id não fornecido!"

---

## 📊 ANÁLISE DO FLUXO

### **1. FLUXO CORRETO (Admin - Funciona):**

1. Usuário clica em "GERAR PIX"
2. JavaScript captura `produtoId` dos campos hidden (linha 882-887)
3. Envia POST para `/backend/process_payment_pix.php` com `product: { id: produtoId }`
4. Backend processa e retorna JSON: `{ status: 'success', qr_code_base64: '...', transaction_id: '...' }`
5. JavaScript constrói URL: `/backend/pix.php?produto_id=26&valor_total=1&qr_code_base64=...`
6. Redireciona para `backend/pix.php` ✅

### **2. FLUXO QUEBRADO (Usuário - Não Funciona):**

1. Usuário clica em "GERAR PIX"
2. JavaScript tenta capturar `produtoId` dos campos hidden
3. **PROBLEMA:** Campos hidden podem não existir ou ter valor inválido
4. JavaScript envia POST mas `produtoId` pode estar `null` ou `undefined`
5. Backend pode retornar erro (status !== 'success')
6. JavaScript detecta erro e deveria redirecionar para `reprovado.php`
7. **MAS:** Usuário está vendo `checkout.php?` sem parâmetros
8. `checkout.php` valida no topo: `if (!$safe_produto_id) { die("Erro: produto_id não fornecido!"); }`
9. Exibe erro ❌

---

## 🎯 CAUSA RAIZ HIPOTÉTICA

### **HIPÓTESE 1: Campos Hidden Não Estão Sendo Renderizados**

**Possibilidade:**
- Os campos hidden (`hidden_produto_id` e `hidden_afiliado_id`) estão sendo adicionados DEPOIS da validação do PHP.
- Se o `checkout.php` for acessado sem `produto_id` na URL, ele morre ANTES de renderizar os campos hidden.
- Mas o JavaScript ainda tenta acessá-los.

**Evidência:**
```php
// Linha 74-84: Validação ANTES de renderizar HTML
if (!$safe_produto_id) {
    die("Erro: produto_id não fornecido!"); // PARA AQUI - Não renderiza HTML
}

// Linha 968-969: Campos hidden só são renderizados se passar a validação acima
<input type="hidden" id="hidden_produto_id" value="<?= $safe_produto_id; ?>">
```

**Conclusão:** Se o usuário acessar `checkout.php` sem `produto_id` na URL, os campos hidden NÃO EXISTEM.

---

### **HIPÓTESE 2: Backend Retorna Erro e JavaScript Redireciona Incorretamente**

**Possibilidade:**
- O backend `process_payment_pix.php` retorna um erro (ex: produto_id inválido no JSON)
- O JavaScript detecta `result.status !== 'success'` (linha 974)
- Redireciona para `reprovado.php` (linha 977)
- Mas por algum motivo (erro 404, redirecionamento do servidor), acaba em `checkout.php?`

**Evidência:**
```javascript
// Linha 974-977
} else {
    const errorMessage = (result && result.message) ? result.message : 'Erro desconhecido ao processar pagamento Pix';
    alert('Erro: ' + errorMessage);
    window.location.href = `/views/reprovado.php?reason=${encodeURIComponent(errorMessage)}`;
}
```

**Conclusão:** Se o backend retornar erro, deveria ir para `reprovado.php`, não `checkout.php`.

---

### **HIPÓTESE 3: JavaScript Captura produtoId Como null/undefined**

**Possibilidade:**
- Os campos hidden existem, mas têm valor vazio ou inválido
- A validação na linha 907 deveria impedir, mas talvez não esteja funcionando
- O backend recebe `product: { id: null }` ou `product: { id: undefined }`
- Backend retorna erro
- Algo redireciona de volta para `checkout.php` sem parâmetros

**Evidência:**
```javascript
// Linha 906-911: Validação que deveria impedir
if (!produtoId || produtoId === '0' || produtoId === 'null' || produtoId === 'undefined') {
    alert('Erro: ID do produto não encontrado. Por favor, recarregue a página.');
    document.getElementById('processing-popup').style.display = 'none';
    return; // DEVERIA PARAR AQUI
}
```

**Conclusão:** Se a validação estiver funcionando, o usuário deveria ver um alert, não ser redirecionado.

---

### **HIPÓTESE 4: Diferença na URL Inicial Entre Admin e Usuário**

**Possibilidade:**
- Admin acessa `checkout.php?produto_id=26` (URL correta)
- Usuário acessa `checkout.php?produto_id=26&ref=123` ou outra variação
- Algo na URL do usuário está causando problema na captura

**Evidência:**
```php
// Linha 75-79: Captura com fallback
$safe_produto_id = filter_input(INPUT_GET, 'produto_id', FILTER_SANITIZE_NUMBER_INT);
$safe_afiliado_id = filter_input(INPUT_GET, 'ref', FILTER_SANITIZE_NUMBER_INT);
if (!$safe_afiliado_id) {
    $safe_afiliado_id = filter_input(INPUT_GET, 'af', FILTER_SANITIZE_NUMBER_INT);
}
```

**Conclusão:** A captura parece correta, mas pode haver problema se a URL vier de forma diferente.

---

## 🔎 PONTO CRÍTICO DESCOBERTO

### **O PROBLEMA MAIS PROVÁVEL:**

Quando o usuário acessa `checkout.php` inicialmente COM `produto_id` na URL, tudo funciona.  
MAS quando o JavaScript do PIX faz o fetch e algo dá errado, o redirecionamento pode estar acontecendo para `checkout.php` SEM parâmetros.

**Cenário:**
1. Usuário está em `checkout.php?produto_id=26`
2. Clica em "GERAR PIX"
3. JavaScript faz fetch para `process_payment_pix.php`
4. Backend retorna erro (ex: JSON inválido, produto não encontrado, etc.)
5. JavaScript tenta redirecionar para `reprovado.php`
6. **MAS:** Por algum motivo (404, erro de rota, etc.), o navegador redireciona para `checkout.php?` (sem parâmetros)
7. `checkout.php` valida e exibe "Erro: produto_id não fornecido!"

---

## ✅ SOLUÇÕES PROPOSTAS

### **SOLUÇÃO 1: Garantir que Campos Hidden Sempre Existem**

Adicionar campos hidden **ANTES** da validação do PHP, ou garantir que sempre tenham valor padrão mesmo se URL estiver vazia.

**Localização:** `views/checkout.php` linha 968-969

**Problema:** Se a validação falhar, os campos não são renderizados.

---

### **SOLUÇÃO 2: Melhorar Tratamento de Erro no JavaScript**

Adicionar mais validações e garantir que erros não causem redirecionamentos inesperados.

**Localização:** `views/js/checkout.js` linha 980-985 (catch)

**Ação:** Adicionar `console.log` para debug e garantir que erros não redirecionem para `checkout.php`.

---

### **SOLUÇÃO 3: Validar produtoId ANTES do Fetch**

Garantir que `produtoId` seja válido ANTES de fazer o fetch para o backend.

**Localização:** `views/js/checkout.js` linha 906-911

**Ação:** A validação já existe, mas pode não estar capturando todos os casos.

---

### **SOLUÇÃO 4: Adicionar Logging no Backend**

Verificar o que o backend `process_payment_pix.php` está recebendo e retornando.

**Localização:** `backend/process_payment_pix.php`

**Ação:** Adicionar logs para verificar se `product.id` está chegando correto.

---

## 🎯 DIAGNÓSTICO FINAL

**CAUSA MAIS PROVÁVEL:**

O backend `process_payment_pix.php` está retornando um erro quando processa o PIX para usuários (possivelmente relacionado a `product.id` sendo `null` ou inválido), e o JavaScript está tentando redirecionar para `reprovado.php`, mas por algum motivo (404, erro de rota, ou outro redirecionamento) está caindo em `checkout.php?` sem parâmetros.

**PONTOS A VERIFICAR:**

1. ✅ Os campos hidden estão sendo renderizados corretamente?
2. ✅ O `produtoId` está sendo capturado corretamente no JavaScript?
3. ✅ O backend está recebendo `product.id` correto?
4. ✅ O backend está retornando erro? Qual erro?
5. ✅ Por que o redirecionamento vai para `checkout.php?` em vez de `reprovado.php`?

**PRÓXIMOS PASSOS:**

1. Adicionar `console.log` no JavaScript para ver o valor de `produtoId` antes do fetch
2. Verificar os logs do backend para ver o que está sendo recebido
3. Verificar se o arquivo `reprovado.php` existe e está acessível
4. Adicionar validação mais robusta no backend para retornar erro claro se `product.id` estiver ausente







