diff --git a/api/webhook.php b/api/webhook.php index 4a31de6..bffaa18 100644 --- a/api/webhook.php +++ b/api/webhook.php @@ -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'], diff --git a/scripts/show_recent_webhook_logs.php b/scripts/show_recent_webhook_logs.php new file mode 100644 index 0000000..486a70a --- /dev/null +++ b/scripts/show_recent_webhook_logs.php @@ -0,0 +1,6 @@ +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);