# 🐾 WhatsApp Mascotas TV — Sistema de gestión de mensajes

Panel web propio para que el equipo de producción lea, responda y descargue los vídeos y fotos
recibidos en el número de WhatsApp Business del programa. **No requiere abrir la app de WhatsApp**,
todo se gestiona desde el navegador.

---

## Arquitectura

```
Espectador (WhatsApp)
        │  envía foto/vídeo
        ▼
Meta WhatsApp Cloud API  (gratuita)
        │  POST webhook
        ▼
webhook.php  ──────► MySQL (mensajes, contactos)
                         │
                         ▼
              dashboard.php  ◄──── Personal productora
              (panel web)   ──────► api.php ──► serve_media.php
```

---

## Requisitos del servidor OVH

| Requisito       | Mínimo           |
|-----------------|------------------|
| PHP             | 8.1+             |
| Extensiones PHP | pdo_mysql, finfo |
| MySQL           | 5.7+ / MariaDB 10.3+ |
| HTTPS           | **Obligatorio** (Let's Encrypt gratuito) |
| Espacio disco   | Según volumen de vídeos (~30 MB/vídeo) |

---

## Instalación paso a paso

### 1. Crear la aplicación en Meta for Developers

1. Ve a [developers.facebook.com](https://developers.facebook.com) e inicia sesión con la cuenta de Facebook Business.
2. Crea una nueva aplicación → tipo **Business**.
3. En **Productos**, añade **WhatsApp**.
4. En *WhatsApp > Configuración de la API*:
   - Anota el **Phone Number ID** y el **WhatsApp Business Account ID**.
   - Genera un **Token de acceso permanente** (System User con rol Admin).
5. En *WhatsApp > Configuración*, añade el webhook:
   - **URL de devolución de llamada**: `https://publica.cluster100.hosting.ovh.net/webhook.php`
   - **Token de verificación**: el mismo valor que pondrás en `WA_VERIFY_TOKEN`.
   - Suscripciones: marca **messages**.

### 2. Subir archivos al servidor OVH

```bash
# Sube la carpeta completa a tu hosting (FTP o SSH)
# Ruta recomendada: /htdocs/whatsapp-mascotas/  o  /www/whatsapp-mascotas/
```

Asegúrate de que `media/` tenga permisos de escritura:
```bash
chmod 750 media/
```

### 3. Crear la base de datos

En el panel OVH (phpMyAdmin):
1. Crea la base de datos `mascotas_wa` con cotejamiento `utf8mb4_unicode_ci`.
2. Crea el usuario `mascotas_user` con contraseña segura y permisos sobre esa BD.
3. Importa el fichero `database.sql`.

### 4. Configurar `config.php`

Edita el fichero y rellena todos los valores:

```php
define('WA_VERIFY_TOKEN',    'EligeUnTokenAleatorioLargo');
define('WA_ACCESS_TOKEN',    'EAAAABm...token de Meta...');
define('WA_PHONE_NUMBER_ID', '1234567890');
define('DB_PASS',            'contraseña_mysql');
define('APP_SECRET',         'CadenaAleatoria32caracteres');
```

### 5. Generar hashes de contraseñas del panel

```bash
# Edita generate_hash.php con las contraseñas que quieras
php generate_hash.php

# Copia los hashes al array PANEL_USERS de config.php
# Luego BORRA generate_hash.php del servidor
```

### 6. Verificar el webhook en Meta

En el panel de Meta, pulsa **Verificar y guardar** en la configuración del webhook.
Deberías ver ✅ en la consola.

### 7. Acceder al panel

```
https://tudominio.com/whatsapp-mascotas/login.php
```

---

## Estructura de ficheros

```
whatsapp-mascotas/
├── config.php          ← Configuración (no subir a repositorio público)
├── db.php              ← Conexión PDO
├── auth.php            ← Gestión de sesiones
├── webhook.php         ← Recibe mensajes de Meta
├── api.php             ← API JSON interna del panel
├── login.php           ← Formulario de acceso
├── dashboard.php       ← Panel de gestión (SPA)
├── serve_media.php     ← Sirve fotos/vídeos de forma segura
├── generate_hash.php   ← Utilidad (borrar tras usar)
├── database.sql        ← Esquema de la BD
└── media/
    └── .htaccess       ← Bloquea acceso directo a la carpeta
```

---

## Uso del panel

| Función | Descripción |
|---------|-------------|
| Lista de conversaciones | Sidebar izquierdo, ordenado por último mensaje |
| Leer mensajes | Click en cualquier conversación |
| Responder | Cuadro de texto inferior, Enter para enviar |
| Ver foto/vídeo | Se muestra directamente en el chat |
| Descargar archivo | Enlace "⬇ Descargar" bajo cada media |
| Reintento descarga | Botón "⬇ Descargar ahora" si falló automáticamente |
| Editar contacto | Botón ✏️ en la cabecera del chat |
| Buscar | Campo de búsqueda en el sidebar |

---

## Seguridad implementada

- ✅ Verificación de firma HMAC-SHA256 en todos los webhooks de Meta
- ✅ Autenticación de sesión con `session_regenerate_id` en login
- ✅ Cookies `HttpOnly + SameSite=Strict + Secure`
- ✅ Contraseñas con `bcrypt` (cost 12)
- ✅ Consultas SQL con PDO prepared statements (anti SQL-injection)
- ✅ Salida HTML escapada con `htmlspecialchars` (anti XSS)
- ✅ Validación de nombre de archivo por whitelist de extensiones
- ✅ Detección de MIME real con `finfo` (anti path traversal)
- ✅ Carpeta `media/` bloqueada con `.htaccess`
- ✅ Archivos de media solo accesibles vía `serve_media.php` con sesión activa

---

## Límites de la WhatsApp Cloud API (plan gratuito)

- **1.000 conversaciones iniciadas por usuario/mes** gratuitas.
- Las conversaciones entrantes (espectadores que escriben primero) son gratuitas.
- Para volúmenes altos consulta los precios en [business.whatsapp.com](https://business.whatsapp.com).
- Meta elimina los archivos multimedia **30 días** después de recibirlos;
  el sistema los descarga automáticamente para conservarlos indefinidamente.

---

## Variables de entorno (alternativa a editar config.php)

En el `.htaccess` raíz del proyecto puedes definir:

```apache
SetEnv WA_VERIFY_TOKEN    tu_token
SetEnv WA_ACCESS_TOKEN    tu_access_token
SetEnv WA_PHONE_NUMBER_ID tu_phone_id
SetEnv DB_PASS            tu_pass_mysql
SetEnv APP_SECRET         tu_app_secret
```

---

## Soporte

Para regenerar contraseñas, edita `generate_hash.php` de nuevo (o usa PHP en CLI):
```bash
php -r "echo password_hash('nueva_clave', PASSWORD_BCRYPT, ['cost'=>12]);"
```
