up
This commit is contained in:
+34
-21
@@ -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'],
|
||||
|
||||
@@ -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