# Diagnóstico Final: Erro "produto_id não fornecido" no Checkout

## 🎯 CAUSA RAIZ IDENTIFICADA

### **PROBLEMA 1: FORMULÁRIO DE CARTÃO DE CRÉDITO**

**Localização:** `views/checkout.php` linha 1022  
**Formulário:** `<form id="form-checkout-credit-card">`

**Problema:**
- O formulário **NÃO CONTÉM** um campo `<input type="hidden" name="produto_id">` dentro dele.
- Quando o Mercado Pago submete o formulário, ele adiciona os tokens (`MPHiddenInputToken`, `MPHiddenInputAmount`, etc.) via GET.
- Como não existe um campo `produto_id` no formulário, ele não é incluído na URL de redirecionamento.
- Resultado: A URL gerada é `checkout.php?MPHiddenInputToken=...&MPHiddenInputAmount=...` **SEM** `produto_id`.

**Evidência:**
```html
<form id="form-checkout-credit-card">
    <!-- Campos do Mercado Pago -->
    <div id="form-checkout__cardNumber"></div>
    <!-- ... outros campos ... -->
    <button type="submit">FINALIZAR COMPRA</button>
</form>
<!-- ❌ NÃO TEM: <input type="hidden" name="produto_id" value="..."> -->
```

---

### **PROBLEMA 2: PIX - VARIÁVEL produtoId INDEFINIDA**

**Localização:** `views/js/checkout.js` linha 276 e 893

**Problema:**
- O JavaScript captura `produtoId` da URL: `const produtoId = urlParams.get('produto_id');`
- Se a URL não tiver `produto_id` (ex: usuário acessou diretamente ou perdeu o parâmetro), `produtoId` será `null`.
- Na linha 893, o código envia `id: produtoId` no body do fetch para o backend.
- Na linha 934, redireciona para `pix.php?produto_id=${produtoId}` - se `produtoId` for `null`, a URL fica `produto_id=null`.
- Quando `pix.php` tenta ler `$_GET['produto_id']`, recebe a string `"null"` que não é um número válido.

**Evidência:**
```javascript
// Linha 276
const urlParams = new URLSearchParams(window.location.search);
const produtoId = urlParams.get('produto_id'); // Pode ser null!

// Linha 893 (dentro do fetch do PIX)
product: {
    id: produtoId, // Se for null, envia null
    // ...
}

// Linha 934 (redirecionamento)
window.location.href = `/backend/pix.php?produto_id=${produtoId}&...`;
// Se produtoId for null, a URL fica: pix.php?produto_id=null&...
```

---

### **PROBLEMA 3: FALTA DE PERSISTÊNCIA DE DADOS**

**Problema:**
- O `checkout.php` espera `produto_id` na URL (`$_GET['produto_id']`).
- Não há campos hidden no HTML para armazenar o `produto_id` de forma persistente.
- Se a URL perder os parâmetros (redirecionamento, refresh, submissão de formulário), o sistema quebra.

**Evidência:**
- Linha 956: Existe apenas `<input type="hidden" id="link-entregavel">` mas **NÃO TEM** `<input type="hidden" id="produto-id" value="...">`.

---

## 📊 COMPARAÇÃO: O QUE ESTÁ FALTANDO

### **Formulário de Cartão:**
```html
<form id="form-checkout-credit-card">
    <!-- ❌ FALTA: -->
    <!-- <input type="hidden" name="produto_id" value="<?= $produto_id; ?>"> -->
    <!-- <input type="hidden" id="hidden_produto_id" value="<?= $produto_id; ?>"> -->
    
    <!-- Campos do Mercado Pago -->
    <button type="submit">FINALIZAR COMPRA</button>
</form>
```

### **Formulário PIX:**
```html
<form id="form-checkout-pix">
    <!-- ❌ FALTA: -->
    <!-- <input type="hidden" id="hidden_produto_id" value="<?= $produto_id; ?>"> -->
    
    <button type="submit">GERAR PIX</button>
</form>
```

### **JavaScript:**
```javascript
// ❌ PROBLEMA: Depende apenas da URL
const produtoId = urlParams.get('produto_id'); // Pode ser null!

// ✅ DEVERIA SER:
const hiddenProdutoId = document.getElementById('hidden_produto_id');
const produtoId = hiddenProdutoId ? hiddenProdutoId.value : urlParams.get('produto_id');
```

---

## ✅ SOLUÇÃO PROPOSTA

1. **Adicionar campos hidden no HTML:**
   - Adicionar `<input type="hidden" id="hidden_produto_id" value="<?= $produto_id; ?>">` no corpo da página (fora dos formulários, mas acessível).
   - Adicionar `<input type="hidden" name="produto_id" value="<?= $produto_id; ?>">` **DENTRO** do formulário de cartão (para ser incluído no submit do MP).

2. **Corrigir JavaScript:**
   - Modificar o código para ler do campo hidden primeiro, com fallback para URL.
   - Validar se `produtoId` não é null antes de usar.

3. **Corrigir redirecionamento PIX:**
   - Garantir que o `produto_id` seja válido antes de redirecionar.

---

## 🎯 RESUMO EXECUTIVO

**CAUSA RAIZ:**
1. Formulário de cartão não tem campo `produto_id` dentro, então o Mercado Pago não inclui na URL de submit.
2. JavaScript depende apenas da URL para capturar `produto_id`, que pode ser perdido.
3. Não há persistência de `produto_id` no HTML através de campos hidden.

**IMPACTO:**
- ❌ Pagamento com cartão falha (erro "produto_id não fornecido").
- ❌ PIX falha quando URL perde parâmetros (redireciona para `checkout.php` novamente).
- ❌ Comissão de afiliado pode ser perdida se `produto_id` não for rastreado.

**PRIORIDADE:** 🔴 **CRÍTICA** - Bloqueia todas as vendas para usuários/afiliados.







