This commit is contained in:
Lizandro Guarnizo
2026-02-21 07:37:36 -05:00
parent 2f73ee2a1a
commit de4b07c806
14 changed files with 2001 additions and 23 deletions
+38 -12
View File
@@ -108,6 +108,18 @@ class WhatsAppWebhook {
return;
}
// Extraer nombres de contactos del payload (contacts[].profile.name)
$contactNames = [];
if (isset($value['contacts']) && is_array($value['contacts'])) {
foreach ($value['contacts'] as $contact) {
$waId = $contact['wa_id'] ?? null;
$name = $contact['profile']['name'] ?? null;
if ($waId && $name) {
$contactNames[$waId] = $name;
}
}
}
foreach ($items as $message) {
// En algunos payloads la estructura key es 'from' y 'id' (mensajes), en otros puede venir distinta; normalizamos
$phoneNumber = $message['from'] ?? ($message['wa_id'] ?? null);
@@ -131,9 +143,29 @@ class WhatsAppWebhook {
// Obtener o crear usuario
$user = $this->getUserByPhone($phoneNumber);
$contactName = $contactNames[$phoneNumber] ?? null;
if (!$user) {
$userId = $this->createUser($phoneNumber);
$user = $this->getUserById($userId);
// Guardar nombre del contacto de WhatsApp al crear usuario
if ($contactName && $userId) {
try {
$this->db->update('users', ['name' => $contactName], 'id = ? AND (name IS NULL OR name = ?)', [$userId, '']);
$user['name'] = $contactName;
} catch (Exception $e) {
error_log('[webhook] Error guardando nombre contacto: ' . $e->getMessage());
}
}
} else {
// Actualizar nombre si el usuario no tiene uno guardado
if ($contactName && (empty($user['name']))) {
try {
$this->db->update('users', ['name' => $contactName], 'id = ? AND (name IS NULL OR name = ?)', [$user['id'], '']);
$user['name'] = $contactName;
} catch (Exception $e) {
error_log('[webhook] Error actualizando nombre contacto: ' . $e->getMessage());
}
}
}
// Procesar diferentes tipos de mensaje
@@ -178,40 +210,34 @@ class WhatsAppWebhook {
} elseif (isset($message['image'])) {
$messageText = $message['image']['caption'] ?? '';
$messageType = 'image';
// Preferir URL directo si viene en el webhook (evita resolver media_id)
$mediaUrl = $message['image']['url'] ?? ($message['image']['id'] ?? null);
// Preferir media ID (estable) sobre URL (expira en minutos)
$mediaUrl = $message['image']['id'] ?? ($message['image']['url'] ?? null);
$mimeType = $message['image']['mime_type'] ?? null;
$filename = $message['image']['filename'] ?? null;
} elseif (isset($message['audio'])) {
$messageType = 'audio';
$mediaUrl = $message['audio']['url'] ?? ($message['audio']['id'] ?? null);
$mediaUrl = $message['audio']['id'] ?? ($message['audio']['url'] ?? null);
$mimeType = $message['audio']['mime_type'] ?? null;
$filename = $message['audio']['filename'] ?? null;
} elseif (isset($message['video'])) {
$messageText = $message['video']['caption'] ?? '';
$messageType = 'video';
$mediaUrl = $message['video']['url'] ?? ($message['video']['id'] ?? null);
$mediaUrl = $message['video']['id'] ?? ($message['video']['url'] ?? null);
$mimeType = $message['video']['mime_type'] ?? null;
$filename = $message['video']['filename'] ?? null;
} elseif (isset($message['document'])) {
$messageText = $message['document']['filename'] ?? '';
$messageType = 'document';
$mediaUrl = $message['document']['url'] ?? ($message['document']['id'] ?? null);
$mediaUrl = $message['document']['id'] ?? ($message['document']['url'] ?? null);
$mimeType = $message['document']['mime_type'] ?? null;
$filename = $message['document']['filename'] ?? null;
} elseif (isset($message['sticker'])) {
$messageType = 'sticker';
$mediaUrl = $message['sticker']['url'] ?? ($message['sticker']['id'] ?? null);
$mediaUrl = $message['sticker']['id'] ?? ($message['sticker']['url'] ?? null);
$mimeType = $message['sticker']['mime_type'] ?? null;
$filename = $message['sticker']['filename'] ?? null;