up
This commit is contained in:
+11
-1
@@ -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
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user