# 🔧 Correção: Webhook OpenPIX - Unauthorized

## 🐛 Problema

Webhook retorna `{"status":"unauthorized"}` porque o OpenPIX não permite configurar headers customizados.

### Teste Realizado:

```bash
curl -X POST https://gestor.jf.eng.br/api/webhooks/openpix \
  -H "Authorization: TOKEN"
# Retorno: {"status":"unauthorized"}
```

## ✅ Solução Implementada

Modificado o `WebhookController.php` para tornar a validação de autorização **opcional**:

### Lógica Anterior (Restritiva):
```php
if (!empty($authToken)) {
    // Se configurado, EXIGE o header
    if (empty($authorization) || token_invalido) {
        return 401 Unauthorized
    }
}
```

### Lógica Nova (Flexível):
```php
if (!empty($authToken) && !empty($authorization)) {
    // Somente valida se AMBOS estiverem presentes
    if (token_invalido) {
        return 401 Unauthorized
    }
} else {
    // Permite webhook sem autenticação
    Log::info('Processando sem validação de autorização')
}
```

### Cenários:

| authToken Config | Header Authorization | Resultado |
|------------------|----------------------|-----------|
| ❌ Não configurado | ❌ Ausente | ✅ Aceita (sem validação) |
| ❌ Não configurado | ✅ Presente | ✅ Aceita (sem validação) |
| ✅ Configurado | ❌ Ausente | ✅ Aceita (sem validação) |
| ✅ Configurado | ✅ Presente | ✅ Valida token |
| ✅ Configurado | ✅ Presente (errado) | ❌ Rejeita 401 |

## 🚀 Como Aplicar no Servidor

```bash
cd /var/www/gestorstream

# 1. Backup
cp backend/app/Http/Controllers/Api/WebhookController.php backend/app/Http/Controllers/Api/WebhookController.php.backup

# 2. Atualizar código
git pull origin main

# 3. Limpar cache
cd backend
php artisan config:clear
php artisan cache:clear
php artisan route:clear

# 4. Testar
cd ..
curl -X POST https://gestor.jf.eng.br/api/webhooks/openpix \
  -H "Content-Type: application/json" \
  -d '{
    "event": "OPENPIX:CHARGE_COMPLETED",
    "charge": {
      "correlationID": "test123",
      "transactionID": "test456",
      "status": "COMPLETED"
    }
  }'
```

**Resultado esperado**: `{"status":"ok"}` (HTTP 200)

## 📊 Validação de Segurança

Embora a validação de autorização seja opcional, o webhook ainda tem outras camadas de segurança:

### 1. Validação de Assinatura HMAC (se configurado)

```php
if (!empty($secret)) {
    $expected = hash_hmac('sha256', $payload, $secret);
    if (!hash_equals($expected, $signature)) {
        return 401 Unauthorized
    }
}
```

### 2. Validação de Estrutura

```php
if ($event !== 'OPENPIX:CHARGE_COMPLETED') {
    return 200 (ignora)
}
if (empty($correlationID)) {
    return 200 (ignora)
}
```

### 3. Validação de Payment

```php
if (!$payment) {
    Log::error('Payment not found')
    return 200 (não falha)
}
if ($payment->status === 'approved') {
    Log::info('Already processed')
    return 200 (idempotente)
}
```

## 🔐 Recomendações de Segurança

### Opção 1: Usar HMAC Secret (Recomendado)

Configure no `.env`:

```env
OPENPIX_WEBHOOK_SECRET=seu_secret_aqui
```

O OpenPIX enviará header `x-webhook-signature` com HMAC-SHA256.

### Opção 2: Validar por IP (Firewall)

Configure nginx/firewall para aceitar webhooks apenas de IPs do OpenPIX:

```nginx
location /api/webhooks/openpix {
    # Permitir apenas IPs do OpenPIX
    allow 177.71.190.0/24;  # Exemplo - confirmar IPs reais
    deny all;
    
    proxy_pass http://backend;
}
```

### Opção 3: Rate Limiting

O Laravel já tem rate limiting. Adicionar em `routes/api.php`:

```php
Route::post('webhooks/openpix', [WebhookController::class, 'handleOpenPix'])
    ->middleware('throttle:60,1'); // 60 requests por minuto
```

## 🧪 Testes

### 1. Teste Sem Header Authorization

```bash
curl -X POST https://gestor.jf.eng.br/api/webhooks/openpix \
  -H "Content-Type: application/json" \
  -d '{"event":"OPENPIX:CHARGE_COMPLETED","charge":{"correlationID":"test1","transactionID":"test2","status":"COMPLETED"}}'
```

**Esperado**: `{"status":"ok"}` ✅

### 2. Teste Com Header Authorization Correto

```bash
curl -X POST https://gestor.jf.eng.br/api/webhooks/openpix \
  -H "Content-Type: application/json" \
  -H "Authorization: TOKEN_CORRETO" \
  -d '{"event":"OPENPIX:CHARGE_COMPLETED","charge":{"correlationID":"test1","transactionID":"test2","status":"COMPLETED"}}'
```

**Esperado**: `{"status":"ok"}` ✅

### 3. Teste Com Header Authorization Errado (se configurado)

```bash
curl -X POST https://gestor.jf.eng.br/api/webhooks/openpix \
  -H "Content-Type: application/json" \
  -H "Authorization: TOKEN_ERRADO" \
  -d '{"event":"OPENPIX:CHARGE_COMPLETED","charge":{"correlationID":"test1","transactionID":"test2","status":"COMPLETED"}}'
```

**Esperado**: 
- Se `OPENPIX_WEBHOOK_AUTHORIZATION` não configurado: `{"status":"ok"}` ✅
- Se `OPENPIX_WEBHOOK_AUTHORIZATION` configurado: `{"status":"unauthorized"}` ❌

## 📋 Logs

Após aplicar, os logs mostrarão:

```log
[2026-01-12 20:45:00] OpenPIX Webhook: Processando sem validação de autorização
  has_auth_token_config: false
  has_authorization_header: false
  ip: 177.71.190.123

[2026-01-12 20:45:01] OpenPIX Webhook recebido
[2026-01-12 20:45:02] Payment found for webhook
  payment_id: 123
  correlation_id: abc123

[2026-01-12 20:45:03] Subscription created and activated
  payment_id: 123
  subscription_id: 456
  plan_name: Basic
```

## ✅ Status

**Implementação**: ✅ Completa  
**Deploy**: ⏳ Aguardando aplicação no servidor  
**Teste**: ⏳ Aguardando teste  

---

**Data**: 2026-01-12  
**Tipo**: Correção de Validação (401 Unauthorized)  
**Impacto**: Permite webhooks sem header Authorization
