'media id requerido']); exit; } $token = getConfigFromDB('whatsapp_token', ''); $apiUrl = rtrim(getConfigFromDB('whatsapp_api_url', 'https://graph.facebook.com/v22.0/'), '/'); $url = "{$apiUrl}/{$mediaId}"; $ch = curl_init(); curl_setopt_array($ch, [ CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . $token ], CURLOPT_TIMEOUT => 10, ]); $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); $err = curl_error($ch); curl_close($ch); if ($err) { http_response_code(502); echo json_encode(['error' => 'Error comunicando con Graph API', 'detail' => $err]); exit; } $decoded = json_decode($response, true); if ($httpCode >= 400 || !$decoded) { http_response_code($httpCode ?: 500); echo json_encode(['error' => 'Graph API error', 'response' => $decoded]); exit; } // Normalmente Graph devuelve field 'url' $mediaUrl = $decoded['url'] ?? ($decoded['data'][0]['url'] ?? null); if (!$mediaUrl) { http_response_code(404); echo json_encode(['error' => 'No se recibió URL del media', 'raw' => $decoded]); exit; } // Si es una petición GET y el cliente no espera JSON, redirigir al URL real para que `` funcione directamente $isGet = $_SERVER['REQUEST_METHOD'] === 'GET'; $accept = $_SERVER['HTTP_ACCEPT'] ?? ''; if ($isGet && strpos($accept, 'application/json') === false) { // Cache corto para navegadores header('Cache-Control: public, max-age=3600'); header('Location: ' . $mediaUrl, true, 302); exit; } // Retornar URL en JSON (cliente puede solicitar directamente) header('Content-Type: application/json; charset=utf-8'); echo json_encode(['success' => true, 'url' => $mediaUrl]);