Diagnóstico de Webhook WhatsApp

Verificación completa del estado del webhook y configuración

"; echo "

1. Configuración del Sistema

"; $config = [ 'WHATSAPP_TOKEN' => defined('WHATSAPP_TOKEN') ? WHATSAPP_TOKEN : null, 'WHATSAPP_PHONE_NUMBER_ID' => defined('WHATSAPP_PHONE_NUMBER_ID') ? WHATSAPP_PHONE_NUMBER_ID : null, 'WEBHOOK_VERIFY_TOKEN' => defined('WEBHOOK_VERIFY_TOKEN') ? WEBHOOK_VERIFY_TOKEN : null, 'WHATSAPP_API_URL' => defined('WHATSAPP_API_URL') ? WHATSAPP_API_URL : null, ]; echo ""; foreach ($config as $key => $value) { $status = !empty($value) ? 'ok' : 'error'; $icon = !empty($value) ? '✅' : '❌'; $displayValue = !empty($value) ? (strlen($value) > 30 ? substr($value, 0, 30) . '...' : $value) : 'NO CONFIGURADO'; if ($status === 'error') $allOk = false; echo ""; echo ""; echo ""; echo ""; } echo "
$icon $key$displayValue
"; echo "
"; // Test 2: URL del Webhook echo "
"; echo "

2. URL del Webhook

"; $protocol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https' : 'http'; $host = $_SERVER['HTTP_HOST']; $webhookUrl = $protocol . '://' . $host . '/api/webhook.php'; echo "
"; echo "URL para configurar en Meta/Facebook:
"; echo "$webhookUrl"; echo ""; echo "
"; // Verificar si el archivo existe $webhookFile = __DIR__ . '/api/webhook.php'; if (file_exists($webhookFile)) { echo "

✅ Archivo webhook.php existe

"; } else { echo "

❌ Archivo webhook.php NO encontrado

"; $allOk = false; } echo "
"; // Test 3: Verificación GET echo "
"; echo "

3. Test de Verificación (GET)

"; $verifyUrl = $webhookUrl . '?hub.mode=subscribe&hub.verify_token=' . urlencode(WEBHOOK_VERIFY_TOKEN) . '&hub.challenge=test_challenge_12345'; echo "

URL de prueba:

"; echo "
" . htmlspecialchars($verifyUrl) . "
"; echo "
"; echo "💡 Nota: Este test intenta verificar el webhook desde el servidor mismo. "; echo "Si estás en localhost, es normal que falle. Lo importante es que el archivo exista y esté configurado correctamente."; echo "
"; // Intentar hacer la verificación solo si no es localhost $isLocalhost = (strpos($host, 'localhost') !== false || strpos($host, '127.0.0.1') !== false); if (!$isLocalhost) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $verifyUrl); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, 10); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); $error = curl_error($ch); curl_close($ch); if ($httpCode == 200 && $response === 'test_challenge_12345') { echo "

✅ Verificación GET exitosa - El webhook responde correctamente

"; echo "

Respuesta: $response

"; } else { echo "

❌ Error en verificación GET

"; echo "

Código HTTP: $httpCode

"; echo "

Respuesta: " . htmlspecialchars($response) . "

"; if ($error) echo "

Error cURL: $error

"; $allOk = false; } } else { // Test manual para localhost echo "
"; echo "⚠️ Entorno Local Detectado
"; echo "No se puede hacer la verificación automática en localhost. "; echo "En su lugar, puedes probar manualmente:"; echo "
"; echo "
    "; echo "
  1. Haz clic en el botón de abajo para probar el webhook
  2. "; echo "
  3. Deberías ver el texto: test_challenge_12345
  4. "; echo "
"; echo ""; echo " Probar Webhook Manualmente"; echo ""; // Verificar el archivo directamente $webhookFilePath = __DIR__ . '/api/webhook.php'; if (file_exists($webhookFilePath)) { echo "

✅ El archivo webhook.php existe y es accesible

"; // Verificar permisos de lectura if (is_readable($webhookFilePath)) { echo "

✅ El archivo tiene permisos de lectura

"; // Verificar que contenga el código necesario $webhookContent = file_get_contents($webhookFilePath); if (strpos($webhookContent, 'hub_verify_token') !== false && strpos($webhookContent, 'hub_challenge') !== false) { echo "

✅ El archivo contiene el código de verificación correcto

"; } else { echo "

⚠️ El archivo puede no contener el código de verificación

"; } } else { echo "

❌ El archivo no tiene permisos de lectura

"; $allOk = false; } } } echo "
"; // Test 4: Estructura de tablas echo "
"; echo "

4. Estructura de Base de Datos

"; $requiredTables = ['users', 'conversations', 'menus', 'menu_options', 'autoresponses', 'webhook_logs']; echo ""; foreach ($requiredTables as $table) { $exists = $db->fetchAll("SHOW TABLES LIKE '$table'"); $status = !empty($exists) ? 'ok' : 'error'; $icon = !empty($exists) ? '✅' : '❌'; if ($status === 'error') $allOk = false; echo ""; echo ""; if (!empty($exists)) { // Contar registros $count = $db->fetch("SELECT COUNT(*) as total FROM $table"); echo ""; } else { echo ""; } echo ""; } echo "
$icon Tabla: $table{$count['total']} registrosNO EXISTE
"; echo "
"; // Test 5: Últimos mensajes recibidos echo "
"; echo "

5. Mensajes Recibidos Recientemente

"; $recentMessages = $db->fetchAll( "SELECT c.*, u.phone_number, u.name FROM conversations c LEFT JOIN users u ON c.user_id = u.id WHERE c.direction = 'incoming' ORDER BY c.created_at DESC LIMIT 5" ); if (!empty($recentMessages)) { echo "

✅ Se encontraron mensajes entrantes

"; echo ""; echo ""; echo ""; foreach ($recentMessages as $msg) { $date = date('d/m/Y H:i', strtotime($msg['created_at'])); $phone = $msg['phone_number'] ?? 'Desconocido'; $content = htmlspecialchars(substr($msg['content'], 0, 50)); $status = $msg['status']; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; } echo "
FechaUsuarioMensajeEstado
$date$phone$content$status
"; } else { echo "

⚠️ No se encontraron mensajes entrantes. El webhook puede no estar recibiendo datos.

"; echo "
"; echo "Posibles causas:
"; } echo "
"; // Test 6: Webhook Logs echo "
"; echo "

6. Logs del Webhook

"; $webhookLogs = $db->fetchAll( "SELECT * FROM webhook_logs ORDER BY created_at DESC LIMIT 5" ); if (!empty($webhookLogs)) { echo "

✅ Se encontraron logs del webhook

"; echo ""; echo ""; echo ""; foreach ($webhookLogs as $log) { $date = date('d/m/Y H:i:s', strtotime($log['created_at'])); $status = $log['status_code']; $ip = $log['ip_address']; $statusClass = $status == 200 ? 'success' : 'danger'; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; } echo "
FechaStatusIPDetalles
$date$status$ip
"; } else { echo "

ℹ️ No hay logs del webhook registrados

"; } echo "
"; // Test 7: Configuración de Menús y Respuestas echo "
"; echo "

7. Configuración del Bot

"; $menuCount = $db->fetch("SELECT COUNT(*) as total FROM menus WHERE is_active = 1"); $optionCount = $db->fetch("SELECT COUNT(*) as total FROM menu_options WHERE is_active = 1"); $autoResponseCount = $db->fetch("SELECT COUNT(*) as total FROM autoresponses WHERE is_active = 1"); echo "
"; echo "
"; echo "
"; echo "

{$menuCount['total']}

"; echo "

Menús Activos

"; echo "
"; echo "
"; echo "
"; echo "
"; echo "

{$optionCount['total']}

"; echo "

Opciones de Menú

"; echo "
"; echo "
"; echo "
"; echo "
"; echo "

{$autoResponseCount['total']}

"; echo "

Respuestas Automáticas

"; echo "
"; echo "
"; echo "
"; echo "
"; // Resumen final echo "
"; if ($allOk) { echo "
"; echo "

¡Sistema Configurado Correctamente!

"; echo "

El webhook está listo para recibir mensajes de WhatsApp.

"; echo "
"; } else { echo "
"; echo "

Se encontraron problemas

"; echo "

Revisa los errores anteriores y corrígelos antes de continuar.

"; echo "
"; } echo "
"; echo "
Próximos pasos:
"; echo "
    "; echo "
  1. Copia la URL del webhook y configúrala en Meta Developer Console
  2. "; echo "
  3. Usa el token de verificación: " . WEBHOOK_VERIFY_TOKEN . "
  4. "; echo "
  5. Envía un mensaje de prueba desde WhatsApp
  6. "; echo "
  7. Verifica que aparezca en la sección de mensajes recibidos
  8. "; echo "
"; echo "
"; echo "
"; ?>
Volver al Dashboard