fix: archivos >200KB usan URL publica, evita uploadMedia() con OpenSSL 3.x

El contenedor falla al subir a Facebook archivos >~200KB por renegociacion
TLS de OpenSSL 3.x (errno 55). Solucion sin rebuild:
- Archivos <=200KB: uploadMedia() como antes (funciona OK)
- Archivos >200KB: enviar URL publica - WhatsApp descarga desde el servidor
  directamente, sin pasar por el contenedor ni por OpenSSL

Aplica a imagenes, documentos, videos y audios.
This commit is contained in:
Lizandro Guarnizo
2026-02-21 12:30:56 -05:00
parent edcefbe67c
commit b57fc16ab3
+37 -23
View File
@@ -188,24 +188,21 @@ try {
}
if ($isLocalUrl) {
error_log("send_media_message.php - URL local detectada, subiendo archivo a WhatsApp primero");
set_time_limit(300); // Tiempo extra para archivos grandes
error_log("send_media_message.php - URL local detectada, procesando archivo");
set_time_limit(300);
// Obtener la ruta local del archivo
$parsedUrl = parse_url($mediaUrl);
$relativePath = $parsedUrl['path'];
// Construir ruta absoluta usando el path completo (no solo basename)
$docRoot = __DIR__ . '/..';
$localFilePath = $docRoot . $relativePath;
// Si no existe, intentar con solo el basename en uploads/
if (!file_exists($localFilePath)) {
$uploadDir = __DIR__ . '/../uploads/';
$localFilePath = $uploadDir . basename($relativePath);
}
// Último intento: buscar recursivamente en uploads/
if (!file_exists($localFilePath)) {
$searchName = basename($relativePath);
$found = glob(__DIR__ . '/../uploads/**/' . $searchName);
@@ -213,33 +210,39 @@ try {
$localFilePath = $found[0];
}
}
error_log("send_media_message.php - Ruta local del archivo: " . $localFilePath . " - existe: " . (file_exists($localFilePath) ? 'SI' : 'NO') . " - size: " . (file_exists($localFilePath) ? filesize($localFilePath) : 'N/A'));
error_log("send_media_message.php - Ruta local: {$localFilePath} - existe: " . (file_exists($localFilePath) ? 'SI' : 'NO') . " - size: " . (file_exists($localFilePath) ? filesize($localFilePath) : 'N/A'));
smm_log("Local file: {$localFilePath} exists=" . (file_exists($localFilePath) ? 'yes' : 'no') . " size=" . (file_exists($localFilePath) ? filesize($localFilePath) : 'N/A'));
if (!file_exists($localFilePath)) {
throw new Exception('Archivo no encontrado en el servidor: ' . $localFilePath);
}
// Detectar MIME type
$mimeType = mime_content_type($localFilePath);
error_log("send_media_message.php - MIME type detectado: " . $mimeType);
// Subir archivo a WhatsApp
$mimeType = mime_content_type($localFilePath);
$fileBytes = filesize($localFilePath);
// ── Estrategia de envío según tamaño del archivo ────────────────────────
// El contenedor usa OpenSSL 3.x que hace renegociación TLS con Facebook
// al subir payloads >~200 KB → errno 55 "Connection reset by peer".
// Solución: para archivos grandes, enviar la URL pública y dejar que
// WhatsApp descargue el archivo directamente desde nuestro servidor.
// Solo archivos pequeños (≤200 KB) usan uploadMedia() desde el contenedor.
$UPLOAD_SIZE_LIMIT = 200 * 1024; // 200 KB
if ($fileBytes <= $UPLOAD_SIZE_LIMIT) {
// ── Ruta A: subir vía API (archivo pequeño, sin riesgo TLS) ─────────
error_log("send_media_message.php - Archivo pequeño ({$fileBytes}B ≤ {$UPLOAD_SIZE_LIMIT}B), usando uploadMedia()");
smm_log("Ruta A: uploadMedia size={$fileBytes}");
try {
$uploadResult = $whatsapp->uploadMedia($localFilePath, $mimeType);
error_log("send_media_message.php - Archivo subido a WhatsApp: " . json_encode($uploadResult));
smm_log("Upload result: " . json_encode($uploadResult));
if (isset($uploadResult['id'])) {
// Usar el media_id de WhatsApp en lugar de URL
$mediaId = $uploadResult['id'];
// Save uploaded media id for DB and debugging
$uploaded_media_id = $mediaId;
error_log("send_media_message.php - Media ID obtenido: " . $mediaId);
smm_log("Media ID obtained: " . $mediaId);
// Enviar mensaje usando media_id (pasar isVoice para audio)
$response = sendMediaByIdToWhatsApp($whatsapp, $recipient, $mediaId, $mediaType, $caption, $filename, $isVoice);
smm_log("Send media by id response: " . json_encode($response));
} else {
@@ -250,6 +253,17 @@ try {
error_log("send_media_message.php - Error subiendo a WhatsApp: " . $e->getMessage());
throw new Exception('Error al subir archivo a WhatsApp: ' . $e->getMessage());
}
} else {
// ── Ruta B: archivo grande → enviar URL pública (WhatsApp descarga) ──
// Evita uploadMedia() desde el contenedor (falla por OpenSSL 3.x >200KB).
// WhatsApp descargará el archivo directamente desde nuestro servidor público.
error_log("send_media_message.php - Archivo grande ({$fileBytes}B > {$UPLOAD_SIZE_LIMIT}B), usando URL pública: {$mediaUrl}");
smm_log("Ruta B: URL pública size={$fileBytes} url={$mediaUrl}");
$response = sendMediaByLinkToWhatsApp($whatsapp, $recipient, $mediaUrl, $mediaType, $caption, $filename);
smm_log("Send by link response: " . json_encode($response));
}
} else {
// URL pública, usar método normal con link
error_log("send_media_message.php - URL pública detectada, usando link directo: " . $mediaUrl);