up
This commit is contained in:
+55
-1
@@ -209,12 +209,54 @@ class WhatsAppWebhook {
|
||||
$mimeType = $message['document']['mime_type'] ?? null;
|
||||
$filename = $message['document']['filename'] ?? null;
|
||||
|
||||
// Do NOT download documents automatically; keep media id so browser will redirect and download
|
||||
}
|
||||
|
||||
// Log debug (temporal) para verificar cómo llegan media_url/filename
|
||||
error_log(sprintf('[webhook] messageId=%s type=%s mediaUrl=%s filename=%s mime=%s', $messageId, $messageType, $mediaUrl ?? 'NULL', $filename ?? 'NULL', $mimeType ?? 'NULL'));
|
||||
|
||||
// ── Descargar media localmente de inmediato ──
|
||||
// Si hay un media ID (numérico) o URL de Graph, descargarlo y guardarlo en uploads/media/
|
||||
$localFile = null;
|
||||
$localThumb = null;
|
||||
if (!empty($mediaUrl) && in_array($messageType, ['image', 'audio', 'video', 'document', 'sticker'])) {
|
||||
try {
|
||||
$mediaService = new MediaService();
|
||||
$subdir = date('Y/m'); // Organizar por año/mes
|
||||
|
||||
// Determinar si es un media ID (numérico) o una URL directa
|
||||
if (preg_match('/^\d+$/', $mediaUrl)) {
|
||||
// Es un media ID de WhatsApp → resolver vía Graph API y descargar
|
||||
$stored = $mediaService->fetchAndStoreFromGraph($mediaUrl, $subdir);
|
||||
} else {
|
||||
// Es una URL directa → descargar directamente
|
||||
$stored = $mediaService->fetchAndStoreFromUrl($mediaUrl, $subdir);
|
||||
}
|
||||
|
||||
if (!empty($stored['local_file'])) {
|
||||
$localFile = $stored['local_file'];
|
||||
error_log("[webhook] Media descargado localmente: {$localFile}");
|
||||
}
|
||||
if (!empty($stored['local_thumb'])) {
|
||||
$localThumb = $stored['local_thumb'];
|
||||
}
|
||||
} catch (Exception $mediaEx) {
|
||||
error_log("[webhook] Error descargando media (se encolará para retry): " . $mediaEx->getMessage());
|
||||
// Encolar en media_queue para reintento posterior
|
||||
try {
|
||||
$this->db->insert('media_queue', [
|
||||
'media_id' => preg_match('/^\d+$/', $mediaUrl) ? $mediaUrl : '',
|
||||
'media_url' => $mediaUrl,
|
||||
'subdir' => date('Y/m'),
|
||||
'status' => 'pending',
|
||||
'created_at' => date('Y-m-d H:i:s')
|
||||
]);
|
||||
error_log("[webhook] Media encolado en media_queue para retry");
|
||||
} catch (Exception $qEx) {
|
||||
error_log("[webhook] Error encolando media: " . $qEx->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Guardar mensaje en base de datos
|
||||
$saveData = [
|
||||
'user_id' => $user['id'],
|
||||
@@ -291,6 +333,18 @@ class WhatsAppWebhook {
|
||||
// Guardar mensaje y conservar el id de la conversación para posibles encolamientos
|
||||
$conversationId = $this->saveMessage($saveData);
|
||||
|
||||
// Si el media se encoló (no se pudo descargar), actualizar media_queue con el conversation_id
|
||||
if (!empty($mediaUrl) && empty($localFile) && in_array($messageType, ['image', 'audio', 'video', 'document', 'sticker'])) {
|
||||
try {
|
||||
$this->db->query(
|
||||
"UPDATE media_queue SET conversation_id = :cid WHERE media_id = :mid AND conversation_id IS NULL ORDER BY id DESC LIMIT 1",
|
||||
['cid' => $conversationId, 'mid' => (preg_match('/^\d+$/', $mediaUrl) ? $mediaUrl : '')]
|
||||
);
|
||||
} catch (Exception $e) {
|
||||
error_log("[webhook] Error actualizando media_queue con conversation_id: " . $e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
// Crear notificación para UI (nuevo mensaje entrante)
|
||||
try {
|
||||
$this->db->insert('notifications', [
|
||||
|
||||
Reference in New Issue
Block a user