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) { foreach ($data['entry'] as $entry) {
if (isset($entry['changes'])) { if (isset($entry['changes'])) {
foreach ($entry['changes'] as $change) { 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']); $this->processconversations($change['value']);
} }
} }
@@ -97,42 +98,54 @@ class WhatsAppWebhook {
} }
private function processconversations($value) { 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; return;
} }
foreach ($value['conversations'] as $message) { foreach ($items as $message) {
$phoneNumber = $message['from']; // En algunos payloads la estructura key es 'from' y 'id' (mensajes), en otros puede venir distinta; normalizamos
$messageId = $message['id']; $phoneNumber = $message['from'] ?? ($message['wa_id'] ?? null);
$timestamp = $message['timestamp']; $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 // Verificar si ya procesamos este mensaje
$existing = $this->db->fetch( $existing = $this->db->fetch(
"SELECT id FROM conversations WHERE message_id = :message_id", "SELECT id FROM conversations WHERE message_id = :message_id",
['message_id' => $messageId] ['message_id' => $messageId]
); );
if ($existing) { if ($existing) {
continue; // Ya procesamos este mensaje continue; // Ya procesamos este mensaje
} }
// Obtener o crear usuario // Obtener o crear usuario
$user = $this->getUserByPhone($phoneNumber); $user = $this->getUserByPhone($phoneNumber);
if (!$user) { if (!$user) {
$userId = $this->createUser($phoneNumber); $userId = $this->createUser($phoneNumber);
$user = $this->getUserById($userId); $user = $this->getUserById($userId);
} }
// Procesar diferentes tipos de mensaje // Procesar diferentes tipos de mensaje
$messageText = ''; $messageText = '';
$messageType = 'text'; $messageType = 'text';
$mediaUrl = null; $mediaUrl = null;
if (isset($message['reaction'])) { if (isset($message['reaction']) || (isset($message['type']) && $message['type'] === 'reaction')) {
// Reacción (emoji) a un mensaje anterior // Reacción (emoji) a un mensaje anterior
$messageType = 'reaction'; $messageType = 'reaction';
$emoji = $message['reaction']['emoji'] ?? ''; $emoji = $message['reaction']['emoji'] ?? ($message['emoji'] ?? '');
$reactionTo = $message['reaction']['message_id'] ?? ''; $reactionTo = $message['reaction']['message_id'] ?? ($message['context']['id'] ?? '');
$messageText = json_encode(['emoji' => $emoji, 'message_id' => $reactionTo]); $messageText = json_encode(['emoji' => $emoji, 'message_id' => $reactionTo]);
// Guardar campos específicos para reacciones // Guardar campos específicos para reacciones
@@ -141,26 +154,26 @@ class WhatsAppWebhook {
'reaction_emoji' => $emoji 'reaction_emoji' => $emoji
]; ];
} elseif (isset($message['text'])) { } elseif (isset($message['text']) || ($message['type'] ?? '') === 'text') {
$messageText = $message['text']['body']; $messageText = isset($message['text']['body']) ? $message['text']['body'] : ($message['body'] ?? '');
$messageType = 'text'; $messageType = 'text';
} elseif (isset($message['image'])) { } elseif (isset($message['image'])) {
$messageText = $message['image']['caption'] ?? ''; $messageText = $message['image']['caption'] ?? '';
$messageType = 'image'; $messageType = 'image';
$mediaUrl = $message['image']['id']; $mediaUrl = $message['image']['id'] ?? null;
} elseif (isset($message['audio'])) { } elseif (isset($message['audio'])) {
$messageType = 'audio'; $messageType = 'audio';
$mediaUrl = $message['audio']['id']; $mediaUrl = $message['audio']['id'] ?? null;
} elseif (isset($message['video'])) { } elseif (isset($message['video'])) {
$messageText = $message['video']['caption'] ?? ''; $messageText = $message['video']['caption'] ?? '';
$messageType = 'video'; $messageType = 'video';
$mediaUrl = $message['video']['id']; $mediaUrl = $message['video']['id'] ?? null;
} elseif (isset($message['document'])) { } elseif (isset($message['document'])) {
$messageText = $message['document']['filename'] ?? ''; $messageText = $message['document']['filename'] ?? '';
$messageType = 'document'; $messageType = 'document';
$mediaUrl = $message['document']['id']; $mediaUrl = $message['document']['id'] ?? null;
} }
// Guardar mensaje en base de datos // Guardar mensaje en base de datos
$saveData = [ $saveData = [
'user_id' => $user['id'], '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);