This commit is contained in:
lizandrogd
2026-01-21 11:58:17 -05:00
parent 932820d02d
commit c7d0b8b70c
11 changed files with 250 additions and 3 deletions
+11 -1
View File
@@ -4,7 +4,17 @@
* Parámetros: id (media id)
*/
require_once '../config/config.php';
requireAuthentication();
// Permitir que accesos directos desde navegador (GET sin Accept:application/json) redirijan al media sin requerir sesión.
$isGet = $_SERVER['REQUEST_METHOD'] === 'GET';
$accept = $_SERVER['HTTP_ACCEPT'] ?? '';
$wantsJson = strpos($accept, 'application/json') !== false;
// Requerir autenticación sólo para peticiones que no sean GET puro o cuando se solicite JSON (AJAX/API)
if (!$isGet || $wantsJson) {
requireAuthentication();
}
header('Content-Type: application/json; charset=utf-8');
$mediaId = $_GET['id'] ?? ($_POST['id'] ?? null);
+26 -2
View File
@@ -194,12 +194,18 @@ class WhatsAppWebhook {
'message_type' => $messageType,
'content' => $messageText,
'media_url' => $mediaUrl,
'filename' => isset($filename) ? $filename : null,
'mime_type' => isset($mimeType) ? $mimeType : null,
'status' => 'received',
'is_read' => 0
];
// Añadir campos opcionales solo si existen para evitar errores en esquemas antiguos
if (isset($filename) && $filename !== null) {
$saveData['filename'] = $filename;
}
if (isset($mimeType) && $mimeType !== null) {
$saveData['mime_type'] = $mimeType;
}
// Si el mensaje incluye contexto (es respuesta a otro mensaje)
if (isset($message['context']) && isset($message['context']['id'])) {
$saveData['reply_to_message_id'] = $message['context']['id'];
@@ -210,6 +216,8 @@ class WhatsAppWebhook {
$saveData = array_merge($saveData, $extraFields);
}
// Filtrar campos según columnas existentes para evitar errores en esquemas antiguos
$saveData = $this->filterColumns('conversations', $saveData);
$this->saveMessage($saveData);
// Crear notificación para UI (nuevo mensaje entrante)
@@ -290,6 +298,22 @@ class WhatsAppWebhook {
private function saveMessage($messageData) {
return $this->db->insert('conversations', $messageData);
}
/**
* Filtrar los datos para dejar solo las columnas que existen en la tabla
* Evita errores cuando la BD está en un esquema más antiguo
*/
private function filterColumns($table, array $data) {
static $columnsCache = [];
if (!isset($columnsCache[$table])) {
$cols = $this->db->fetchAll("SHOW COLUMNS FROM {$table}");
$columnsCache[$table] = array_map(function($c){ return $c['Field']; }, $cols);
}
$allowed = $columnsCache[$table];
return array_filter($data, function($v, $k) use ($allowed) {
return in_array($k, $allowed, true);
}, ARRAY_FILTER_USE_BOTH);
}
private function logWebhook($requestBody, $responseBody, $statusCode) {
if (ENABLE_LOGGING) {