Files
whatsapp/diagnostico_whatsapp.php
T
2026-01-12 11:06:43 -05:00

264 lines
11 KiB
PHP

<?php
/**
* 🔐 DIAGNÓSTICO TOKEN WHATSAPP - WhatsApp Bot
* Verifica y valida el token de WhatsApp Business API
*/
// Headers para mostrar errores
error_reporting(E_ALL);
ini_set('display_errors', 1);
echo "<!DOCTYPE html><html><head><meta charset='UTF-8'>";
echo "<title>🔐 Diagnóstico Token WhatsApp</title>";
echo "<style>body{font-family:monospace;margin:20px;background:#000;color:#00ff00}";
echo ".ok{color:#00ff00}.error{color:#ff0040}.warning{color:#ffaa00}";
echo ".section{background:#111;padding:15px;margin:10px 0;border:1px solid #333}";
echo "pre{background:#222;padding:10px;color:#ccc;overflow:auto;max-height:300px}";
echo ".token{background:#333;padding:10px;font-family:courier;word-break:break-all}";
echo "</style></head><body>";
echo "<h1>🔐 DIAGNÓSTICO TOKEN WHATSAPP</h1>";
// Cargar configuración
try {
require_once 'config/config.php';
} catch (Exception $e) {
echo "<div class='error'>❌ Error cargando configuración: " . htmlspecialchars($e->getMessage()) . "</div>";
exit;
}
// 1. Verificar constantes de WhatsApp
echo "<div class='section'>";
echo "<h2>📋 CONFIGURACIÓN ACTUAL...</h2>";
$whatsapp_constants = [
'WHATSAPP_TOKEN' => 'Token de acceso de WhatsApp',
'WHATSAPP_PHONE_NUMBER_ID' => 'ID del número de teléfono',
'WHATSAPP_API_URL' => 'URL base de la API',
'WEBHOOK_VERIFY_TOKEN' => 'Token de verificación del webhook'
];
foreach ($whatsapp_constants as $const => $desc) {
if (defined($const)) {
$value = constant($const);
if ($const === 'WHATSAPP_TOKEN') {
// Mostrar información detallada del token
echo "<div class='ok'>✅ $const definido ($desc)</div>";
echo "<div class='warning'>📝 Longitud: " . strlen($value) . " caracteres</div>";
if ($value === 'TU_TOKEN_DE_WHATSAPP_AQUI') {
echo "<div class='error'>❌ CRÍTICO: Token no configurado (valor por defecto)</div>";
} else {
// Verificar formato básico del token
if (preg_match('/^[A-Za-z0-9_-]+$/', $value)) {
echo "<div class='ok'>✅ Formato básico válido (solo caracteres permitidos)</div>";
} else {
echo "<div class='error'>❌ Formato inválido: contiene caracteres no permitidos</div>";
}
// Mostrar primeros y últimos caracteres
$preview = substr($value, 0, 10) . '...' . substr($value, -10);
echo "<div class='warning'>🔍 Vista previa: $preview</div>";
// Verificar longitud típica
if (strlen($value) < 50) {
echo "<div class='warning'>⚠️ Token parece muy corto (típico > 100 caracteres)</div>";
} elseif (strlen($value) > 500) {
echo "<div class='warning'>⚠️ Token parece muy largo (típico < 300 caracteres)</div>";
} else {
echo "<div class='ok'>✅ Longitud parece apropiada</div>";
}
}
} else {
if (in_array($const, ['WEBHOOK_VERIFY_TOKEN'])) {
$display_value = str_repeat('*', min(strlen($value), 20));
} else {
$display_value = $value;
}
echo "<div class='ok'>✅ $const = '$display_value' ($desc)</div>";
}
} else {
echo "<div class='error'>❌ $const no definida ($desc)</div>";
}
}
echo "</div>";
// 2. Test de formato del token
if (defined('WHATSAPP_TOKEN') && WHATSAPP_TOKEN !== 'TU_TOKEN_DE_WHATSAPP_AQUI') {
echo "<div class='section'>";
echo "<h2>🔍 ANÁLISIS DETALLADO DEL TOKEN...</h2>";
$token = WHATSAPP_TOKEN;
// Verificar si parece ser un token de Facebook/Meta
if (preg_match('/^[A-Z]{3,5}[A-Za-z0-9_-]{100,}$/', $token)) {
echo "<div class='ok'>✅ Parece un token válido de Facebook/Meta</div>";
} else {
echo "<div class='warning'>⚠️ No tiene el formato típico de token de Facebook/Meta</div>";
}
// Verificar estructura común
if (strpos($token, 'EAA') === 0) {
echo "<div class='ok'>✅ Comienza con 'EAA' (formato esperado)</div>";
} else {
echo "<div class='warning'>⚠️ No comienza con 'EAA' (formato típico de Facebook)</div>";
}
// Verificar caracteres
$allowed_chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-';
$invalid_chars = [];
for ($i = 0; $i < strlen($token); $i++) {
$char = $token[$i];
if (strpos($allowed_chars, $char) === false) {
$invalid_chars[] = $char;
}
}
if (empty($invalid_chars)) {
echo "<div class='ok'>✅ Solo contiene caracteres permitidos</div>";
} else {
echo "<div class='error'>❌ Caracteres inválidos encontrados: " . implode(', ', array_unique($invalid_chars)) . "</div>";
}
echo "</div>";
// 3. Test de conexión a la API de WhatsApp
echo "<div class='section'>";
echo "<h2>🌐 TEST DE CONEXIÓN API WHATSAPP...</h2>";
if (defined('WHATSAPP_PHONE_NUMBER_ID') && WHATSAPP_PHONE_NUMBER_ID !== 'TU_PHONE_ID_AQUI') {
$phone_id = WHATSAPP_PHONE_NUMBER_ID;
$api_url = WHATSAPP_API_URL . $phone_id;
echo "<div class='warning'>🔗 Probando URL: $api_url</div>";
// Configurar cURL para test
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $api_url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $token,
'Content-Type: application/json'
],
CURLOPT_SSL_VERIFYPEER => true,
CURLOPT_USERAGENT => 'WhatsApp Bot Validator/1.0'
]);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$curl_error = curl_error($ch);
curl_close($ch);
if ($curl_error) {
echo "<div class='error'>❌ Error de conexión cURL: " . htmlspecialchars($curl_error) . "</div>";
} else {
echo "<div class='ok'>✅ Conexión establecida (HTTP $http_code)</div>";
if ($response) {
$json_response = json_decode($response, true);
if ($http_code === 200) {
echo "<div class='ok'>✅ Token válido - API responde correctamente</div>";
if ($json_response) {
echo "<div class='ok'>📋 Respuesta JSON válida</div>";
if (isset($json_response['id'])) {
echo "<div class='ok'>✅ Phone Number ID verificado: " . htmlspecialchars($json_response['id']) . "</div>";
}
}
} elseif ($http_code === 401) {
echo "<div class='error'>❌ ERROR 401: Token inválido o expirado</div>";
if ($json_response && isset($json_response['error'])) {
$error = $json_response['error'];
echo "<div class='error'>📝 Mensaje: " . htmlspecialchars($error['message'] ?? 'Sin mensaje') . "</div>";
echo "<div class='error'>📝 Tipo: " . htmlspecialchars($error['type'] ?? 'Sin tipo') . "</div>";
echo "<div class='error'>📝 Código: " . htmlspecialchars($error['code'] ?? 'Sin código') . "</div>";
}
} elseif ($http_code === 403) {
echo "<div class='error'>❌ ERROR 403: Token válido pero sin permisos</div>";
} else {
echo "<div class='warning'>⚠️ Respuesta inesperada (HTTP $http_code)</div>";
}
if ($json_response && isset($json_response['error'])) {
echo "<div class='warning'>📋 Respuesta completa:</div>";
echo "<pre>" . htmlspecialchars(json_encode($json_response, JSON_PRETTY_PRINT)) . "</pre>";
} elseif (strlen($response) < 500) {
echo "<div class='warning'>📋 Respuesta:</div>";
echo "<pre>" . htmlspecialchars($response) . "</pre>";
}
}
}
} else {
echo "<div class='error'>❌ PHONE_NUMBER_ID no configurado correctamente</div>";
}
echo "</div>";
}
// 4. Instrucciones para obtener token válido
echo "<div class='section'>";
echo "<h2>📖 CÓMO OBTENER UN TOKEN VÁLIDO</h2>";
echo "<div class='warning'><strong>PASOS PARA OBTENER TOKEN:</strong></div>";
echo "<div class='warning'>1. Ve a: <a href='https://developers.facebook.com/' style='color:#ffaa00'>Facebook Developers</a></div>";
echo "<div class='warning'>2. Crea una aplicación de WhatsApp Business</div>";
echo "<div class='warning'>3. Ve a WhatsApp > API Setup</div>";
echo "<div class='warning'>4. Copia el 'Temporary access token'</div>";
echo "<div class='warning'>5. Para producción, genera un token permanente</div>";
echo "<br><div class='warning'><strong>FORMATO CORRECTO:</strong></div>";
echo "<div class='ok'>✅ Debe comenzar con: EAA</div>";
echo "<div class='ok'>✅ Longitud típica: 100-300 caracteres</div>";
echo "<div class='ok'>✅ Solo letras, números, guiones y guiones bajos</div>";
if (defined('WHATSAPP_TOKEN') && WHATSAPP_TOKEN === 'TU_TOKEN_DE_WHATSAPP_AQUI') {
echo "<br><div class='error'><strong>⚠️ ACCIÓN REQUERIDA:</strong></div>";
echo "<div class='error'>Debes reemplazar 'TU_TOKEN_DE_WHATSAPP_AQUI' con tu token real</div>";
echo "<div class='warning'>Edita config/config.php línea ~45 o crea archivo .env</div>";
}
echo "</div>";
// 5. Verificación de Phone Number ID
echo "<div class='section'>";
echo "<h2>📱 VERIFICACIÓN PHONE NUMBER ID</h2>";
if (defined('WHATSAPP_PHONE_NUMBER_ID')) {
$phone_id = WHATSAPP_PHONE_NUMBER_ID;
if ($phone_id === 'TU_PHONE_ID_AQUI') {
echo "<div class='error'>❌ Phone Number ID no configurado</div>";
} else {
echo "<div class='ok'>✅ Phone Number ID: $phone_id</div>";
// Verificar formato (debe ser numérico)
if (preg_match('/^\d+$/', $phone_id)) {
echo "<div class='ok'>✅ Formato correcto (solo números)</div>";
} else {
echo "<div class='error'>❌ Formato incorrecto (debe ser solo números)</div>";
}
// Verificar longitud típica
if (strlen($phone_id) >= 10 && strlen($phone_id) <= 20) {
echo "<div class='ok'>✅ Longitud apropiada</div>";
} else {
echo "<div class='warning'>⚠️ Longitud inusual (" . strlen($phone_id) . " dígitos)</div>";
}
}
}
echo "</div>";
echo "</body></html>";
?>