This commit is contained in:
lizandrogd
2026-01-20 23:55:00 -05:00
parent 81708fbb22
commit 4e3e02111b
3 changed files with 57 additions and 8 deletions
+25 -7
View File
@@ -4,7 +4,9 @@
* Fecha: 13 de noviembre de 2025
*/
require_once __DIR__ . '/../config/config_enhanced.php';
require_once __DIR__ . '/../config/config.php';
// Headers para API
header('Content-Type: application/json; charset=utf-8');
@@ -18,12 +20,23 @@ class WhatsAppWebhook {
private $botService;
public function __construct() {
$this->db = Database::getInstance();
$this->whatsappService = new WhatsAppService();
$this->botService = new BotService();
error_log('[webhook] __construct start');
try {
$this->db = Database::getInstance();
$this->whatsappService = new WhatsAppService();
$this->botService = new BotService();
} catch (Throwable $t) {
error_log('[webhook] constructor failed: ' . $t->getMessage());
if (function_exists('writeLog')) {
writeLog('ERROR', 'Webhook constructor failed: ' . $t->getMessage(), ['trace' => $t->getTraceAsString()]);
}
throw $t;
}
error_log('[webhook] __construct end');
}
public function handleRequest() {
error_log('[webhook] handleRequest start, method=' . ($_SERVER['REQUEST_METHOD'] ?? 'unknown'));
$method = $_SERVER['REQUEST_METHOD'];
if ($method === 'GET') {
@@ -251,10 +264,15 @@ if (php_sapi_name() !== 'cli') {
try {
$webhook = new WhatsAppWebhook();
$webhook->handleRequest();
} catch (Exception $e) {
error_log("Fatal error in webhook: " . $e->getMessage());
} catch (Throwable $t) {
// Manejar excepciones fatales y errores (Throwable)
error_log("Fatal error in webhook: " . $t->getMessage());
error_log($t->getTraceAsString());
if (function_exists('writeLog')) {
writeLog('ERROR', 'Fatal error in webhook: ' . $t->getMessage(), ['trace' => $t->getTraceAsString()]);
}
http_response_code(500);
echo json_encode(['error' => 'Error fatal del servidor']);
echo json_encode(['error' => 'Error fatal del servidor', 'detail' => $t->getMessage()]);
}
}
?>
+23 -1
View File
@@ -7,6 +7,7 @@
*/
// Función para cargar archivo .env
if (!function_exists('loadEnvFile')) {
function loadEnvFile($path) {
if (!file_exists($path)) {
return false;
@@ -30,14 +31,17 @@ function loadEnvFile($path) {
return true;
}
}
// Cargar .env si existe
$envLoaded = loadEnvFile(__DIR__ . '/../.env');
$envLoaded = function_exists('loadEnvFile') ? loadEnvFile(__DIR__ . '/../.env') : false;
// Función helper para obtener variables de entorno con fallback
if (!function_exists('env')) {
function env($key, $default = null) {
return $_ENV[$key] ?? getenv($key) ?: $default;
}
}
// Configuración de la base de datos
define('DB_HOST', env('DB_HOST', 'localhost'));
@@ -122,6 +126,7 @@ if (!defined('AUTO_DETECTED_URL')) {
}
// Función para logging centralizado
if (!function_exists('writeLog')) {
function writeLog($level, $message, $context = []) {
if (!ENABLE_LOGGING) return;
@@ -143,18 +148,24 @@ function writeLog($level, $message, $context = []) {
file_put_contents($logDir . '/system.log', $logMessage, FILE_APPEND | LOCK_EX);
}
}
// Función para verificar si la instalación está completada
if (!function_exists('isInstallationCompleted')) {
function isInstallationCompleted() {
return file_exists(dirname(__DIR__) . '/.installation_completed');
}
}
// Función para verificar login
if (!function_exists('isUserLoggedIn')) {
function isUserLoggedIn() {
return isset($_SESSION['admin_logged_in']) && $_SESSION['admin_logged_in'] === true;
}
}
// Función para verificar intentos de login
if (!function_exists('checkLoginAttempts')) {
function checkLoginAttempts($ip) {
$attemptsFile = dirname(__DIR__) . '/.login_attempts.json';
@@ -178,8 +189,10 @@ function checkLoginAttempts($ip) {
return $ipData['attempts'] < MAX_LOGIN_ATTEMPTS;
}
}
// Función para registrar intento de login fallido
if (!function_exists('recordFailedLogin')) {
function recordFailedLogin($ip) {
$attemptsFile = dirname(__DIR__) . '/.login_attempts.json';
@@ -201,8 +214,10 @@ function recordFailedLogin($ip) {
file_put_contents($attemptsFile, json_encode($attempts));
writeLog('WARNING', 'Failed login attempt', ['ip' => $ip, 'attempts' => $attempts[$ip]['attempts']]);
}
}
// Función para limpiar intentos de login exitoso
if (!function_exists('clearLoginAttempts')) {
function clearLoginAttempts($ip) {
$attemptsFile = dirname(__DIR__) . '/.login_attempts.json';
@@ -214,6 +229,7 @@ function clearLoginAttempts($ip) {
writeLog('INFO', 'Successful login', ['ip' => $ip]);
}
}
// Autoloader mejorado
spl_autoload_register(function ($class) {
@@ -236,6 +252,7 @@ spl_autoload_register(function ($class) {
});
// Función para obtener configuración desde base de datos
if (!function_exists('getConfigFromDB')) {
function getConfigFromDB($key, $default = null) {
static $configs = null;
@@ -267,8 +284,10 @@ function getConfigFromDB($key, $default = null) {
return $configs[$key] ?? $default;
}
}
// Función para validar configuración de WhatsApp
if (!function_exists('validateWhatsAppConfig')) {
function validateWhatsAppConfig() {
$errors = [];
@@ -286,14 +305,17 @@ function validateWhatsAppConfig() {
return $errors;
}
}
// Función para crear directorio si no existe
if (!function_exists('ensureDirectoryExists')) {
function ensureDirectoryExists($path) {
if (!is_dir($path)) {
mkdir($path, 0755, true);
writeLog('INFO', 'Directory created', ['path' => $path]);
}
}
}
// Crear directorios necesarios
ensureDirectoryExists(dirname(__DIR__) . '/logs');
+9
View File
@@ -5,6 +5,15 @@
* Fecha: 13 de noviembre de 2025
*/
// Asegurar que las funciones de configuración estén cargadas si este archivo
// se incluye directamente sin pasar por `config.php`.
if (!function_exists('getWhatsAppConfigFromDB')) {
$possible = __DIR__ . '/../config/config.php';
if (file_exists($possible)) {
require_once $possible;
}
}
class WhatsAppService
{
private $token;