This commit is contained in:
lizandrogd
2026-01-21 09:29:59 -05:00
parent 532d46c458
commit fd9c718a44
2 changed files with 40 additions and 21 deletions
+34 -21
View File
@@ -80,7 +80,8 @@ class WhatsAppWebhook {
foreach ($data['entry'] as $entry) {
if (isset($entry['changes'])) {
foreach ($entry['changes'] as $change) {
if ($change['field'] === 'conversations') {
// Soportar payloads con field 'conversations' y 'messages' (WhatsApp puede variar)
if ($change['field'] === 'conversations' || $change['field'] === 'messages' || isset($change['value']['messages'])) {
$this->processconversations($change['value']);
}
}
@@ -97,42 +98,54 @@ class WhatsAppWebhook {
}
private function processconversations($value) {
if (!isset($value['conversations'])) {
// Aceptar tanto payloads con 'conversations' como con 'messages' (WhatsApp varía según la integración)
$items = [];
if (isset($value['conversations']) && is_array($value['conversations'])) {
$items = $value['conversations'];
} elseif (isset($value['messages']) && is_array($value['messages'])) {
$items = $value['messages'];
} else {
return;
}
foreach ($value['conversations'] as $message) {
$phoneNumber = $message['from'];
$messageId = $message['id'];
$timestamp = $message['timestamp'];
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);
$messageId = $message['id'] ?? ($message['message_id'] ?? null);
$timestamp = $message['timestamp'] ?? null;
// Si falta lo crítico, saltar
if (empty($phoneNumber) || empty($messageId)) {
continue;
}
// Verificar si ya procesamos este mensaje
$existing = $this->db->fetch(
"SELECT id FROM conversations WHERE message_id = :message_id",
['message_id' => $messageId]
);
if ($existing) {
continue; // Ya procesamos este mensaje
}
// Obtener o crear usuario
$user = $this->getUserByPhone($phoneNumber);
if (!$user) {
$userId = $this->createUser($phoneNumber);
$user = $this->getUserById($userId);
}
// Procesar diferentes tipos de mensaje
$messageText = '';
$messageType = 'text';
$mediaUrl = null;
if (isset($message['reaction'])) {
if (isset($message['reaction']) || (isset($message['type']) && $message['type'] === 'reaction')) {
// Reacción (emoji) a un mensaje anterior
$messageType = 'reaction';
$emoji = $message['reaction']['emoji'] ?? '';
$reactionTo = $message['reaction']['message_id'] ?? '';
$emoji = $message['reaction']['emoji'] ?? ($message['emoji'] ?? '');
$reactionTo = $message['reaction']['message_id'] ?? ($message['context']['id'] ?? '');
$messageText = json_encode(['emoji' => $emoji, 'message_id' => $reactionTo]);
// Guardar campos específicos para reacciones
@@ -141,26 +154,26 @@ class WhatsAppWebhook {
'reaction_emoji' => $emoji
];
} elseif (isset($message['text'])) {
$messageText = $message['text']['body'];
} elseif (isset($message['text']) || ($message['type'] ?? '') === 'text') {
$messageText = isset($message['text']['body']) ? $message['text']['body'] : ($message['body'] ?? '');
$messageType = 'text';
} elseif (isset($message['image'])) {
$messageText = $message['image']['caption'] ?? '';
$messageType = 'image';
$mediaUrl = $message['image']['id'];
$mediaUrl = $message['image']['id'] ?? null;
} elseif (isset($message['audio'])) {
$messageType = 'audio';
$mediaUrl = $message['audio']['id'];
$mediaUrl = $message['audio']['id'] ?? null;
} elseif (isset($message['video'])) {
$messageText = $message['video']['caption'] ?? '';
$messageType = 'video';
$mediaUrl = $message['video']['id'];
$mediaUrl = $message['video']['id'] ?? null;
} elseif (isset($message['document'])) {
$messageText = $message['document']['filename'] ?? '';
$messageType = 'document';
$mediaUrl = $message['document']['id'];
$mediaUrl = $message['document']['id'] ?? null;
}
// Guardar mensaje en base de datos
$saveData = [
'user_id' => $user['id'],
+6
View File
@@ -0,0 +1,6 @@
<?php
require_once __DIR__ . '/../config/config.php';
$db = Database::getInstance();
$rows = $db->fetchAll('SELECT id, created_at, request_body FROM webhook_logs ORDER BY created_at DESC LIMIT 5');
header('Content-Type: application/json');
echo json_encode($rows, JSON_PRETTY_PRINT);