Files
whatsapp/api/fix_whatsapp_config.php
2026-01-12 11:06:43 -05:00

216 lines
7.8 KiB
PHP

<?php
/**
* Script de corrección rápida para WhatsApp API
* Fecha: 5 de enero de 2026
*/
require_once 'config/config.php';
header('Content-Type: application/json; charset=utf-8');
// Verificar autenticación si es POST
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
requireAuthentication();
}
try {
$method = $_SERVER['REQUEST_METHOD'];
if ($method === 'GET') {
// Obtener configuración actual y diagnóstico
$db = Database::getInstance();
$currentConfig = [];
$configKeys = ['whatsapp_token', 'whatsapp_phone_number_id', 'whatsapp_api_url', 'webhook_verify_token'];
foreach ($configKeys as $key) {
$config = $db->fetch("SELECT config_value FROM system_config WHERE config_key = ?", [$key]);
$currentConfig[$key] = $config['config_value'] ?? null;
}
// Si no hay configuración en BD, usar constantes
if (empty($currentConfig['whatsapp_token'])) {
$currentConfig = [
'whatsapp_token' => WHATSAPP_TOKEN,
'whatsapp_phone_number_id' => WHATSAPP_PHONE_NUMBER_ID,
'whatsapp_api_url' => WHATSAPP_API_URL,
'webhook_verify_token' => WEBHOOK_VERIFY_TOKEN
];
}
// Diagnóstico del problema
$diagnosis = [
'has_valid_token' => $currentConfig['whatsapp_token'] !== 'TU_TOKEN_DE_WHATSAPP_AQUI' && !empty($currentConfig['whatsapp_token']),
'has_valid_phone_id' => $currentConfig['whatsapp_phone_number_id'] !== 'TU_PHONE_ID_AQUI' && !empty($currentConfig['whatsapp_phone_number_id']),
'problematic_phone_id' => $currentConfig['whatsapp_phone_number_id'] === '858157464051987',
'error_message' => 'Object with ID \'858157464051987\' does not exist, cannot be loaded due to missing permissions, or does not support this operation'
];
echo json_encode([
'success' => true,
'current_config' => $currentConfig,
'diagnosis' => $diagnosis
]);
} elseif ($method === 'POST') {
// Actualizar configuración
$input = json_decode(file_get_contents('php://input'), true);
if (!$input) {
throw new Exception('Datos inválidos');
}
$db = Database::getInstance();
// Validar datos requeridos
$token = trim($input['whatsapp_token'] ?? '');
$phoneId = trim($input['whatsapp_phone_number_id'] ?? '');
$apiUrl = trim($input['whatsapp_api_url'] ?? WHATSAPP_API_URL);
$webhookToken = trim($input['webhook_verify_token'] ?? WEBHOOK_VERIFY_TOKEN);
if (empty($token)) {
throw new Exception('Token de WhatsApp es obligatorio');
}
if (empty($phoneId)) {
throw new Exception('Phone Number ID es obligatorio');
}
// Validar formato del token
if (!preg_match('/^EAA[A-Za-z0-9_-]+$/', $token)) {
throw new Exception('Formato de token inválido. Debe empezar con EAA');
}
// Validar formato del Phone Number ID
if (!preg_match('/^\d{10,20}$/', $phoneId)) {
throw new Exception('Phone Number ID debe ser numérico (10-20 dígitos)');
}
// Probar conexión antes de guardar
$testResult = testConnectionWithCredentials($token, $phoneId, $apiUrl);
if (!$testResult['success']) {
throw new Exception('Error al probar conexión: ' . $testResult['message']);
}
// Guardar configuración
$configs = [
'whatsapp_token' => $token,
'whatsapp_phone_number_id' => $phoneId,
'whatsapp_api_url' => $apiUrl,
'webhook_verify_token' => $webhookToken
];
foreach ($configs as $key => $value) {
$existing = $db->fetch("SELECT id FROM system_config WHERE config_key = ?", [$key]);
if ($existing) {
$db->query(
"UPDATE system_config SET config_value = ?, updated_at = NOW() WHERE config_key = ?",
[$value, $key]
);
} else {
$db->query(
"INSERT INTO system_config (config_key, config_value, created_at, updated_at) VALUES (?, ?, NOW(), NOW())",
[$key, $value]
);
}
}
echo json_encode([
'success' => true,
'message' => 'Configuración actualizada y probada correctamente',
'test_result' => $testResult
]);
} elseif ($method === 'PUT') {
// Solo probar conexión con configuración actual
$currentToken = getConfigFromDB('whatsapp_token', WHATSAPP_TOKEN);
$currentPhoneId = getConfigFromDB('whatsapp_phone_number_id', WHATSAPP_PHONE_NUMBER_ID);
$currentApiUrl = getConfigFromDB('whatsapp_api_url', WHATSAPP_API_URL);
$testResult = testConnectionWithCredentials($currentToken, $currentPhoneId, $currentApiUrl);
echo json_encode([
'success' => true,
'test_result' => $testResult
]);
} else {
throw new Exception('Método no permitido');
}
} catch (Exception $e) {
http_response_code(500);
echo json_encode([
'success' => false,
'error' => $e->getMessage()
]);
}
function testConnectionWithCredentials($token, $phoneId, $apiUrl) {
try {
if (empty($token) || empty($phoneId)) {
return ['success' => false, 'message' => 'Token o Phone ID vacío'];
}
// Probar acceso al Phone Number ID
$ch = curl_init();
$url = $apiUrl . $phoneId;
curl_setopt_array($ch, [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $token,
'Content-Type: application/json'
],
CURLOPT_TIMEOUT => 15,
CURLOPT_CONNECTTIMEOUT => 10,
CURLOPT_SSL_VERIFYPEER => true,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_USERAGENT => 'WhatsApp-Bot-Diagnostic/1.0'
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$curlError = curl_error($ch);
curl_close($ch);
if ($curlError) {
return ['success' => false, 'message' => 'Error de conexión: ' . $curlError];
}
$decoded = json_decode($response, true);
if ($httpCode === 200 && $decoded) {
$displayName = $decoded['display_phone_number'] ?? 'N/A';
$verifiedName = $decoded['verified_name'] ?? 'No verificado';
return [
'success' => true,
'message' => "Conexión exitosa. Número: $displayName ($verifiedName)",
'phone_info' => $decoded
];
} else {
$errorMsg = 'Error desconocido';
if ($decoded && isset($decoded['error'])) {
$errorMsg = $decoded['error']['message'] ?? $errorMsg;
$errorCode = $decoded['error']['code'] ?? 'N/A';
$errorType = $decoded['error']['type'] ?? 'N/A';
$errorMsg = "[$errorCode/$errorType] $errorMsg";
}
return [
'success' => false,
'message' => $errorMsg,
'http_code' => $httpCode,
'raw_response' => $response
];
}
} catch (Exception $e) {
return ['success' => false, 'message' => 'Excepción: ' . $e->getMessage()];
}
}
?>