up
This commit is contained in:
+34
-21
@@ -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'],
|
||||||
|
|||||||
@@ -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);
|
||||||
Reference in New Issue
Block a user