Sunday, September 4, 2022

[SOLVED] Whatsapp Business Cloud API returning empty string when trying to download media

Issue

I'm using the following lines of code (PHP) after successfuly retriving the media URL and then storing it in the $mediaURL variable for the file request, but it's returning an empty string. Already tried with postman and it returns a 500 internal server error...

** Edited **

self::writeLog('Media URL: '.$mediaURL);
self::writeLog('Preparing to download media - id: '.$media_id);

$curl = curl_init($mediaURL);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

$headers = array(
    "Authorization: Bearer ".self::$auth_token,
);

curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);

curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

if (($resp = curl_exec($curl)) === false) {
    self::writeLog('cURL Error: '.curl_error($curl));
} else if ($resp == '') {
    self::writeLog('Empty string.');
    self::writeLog('URL: '.$mediaURL);
    self::writeLog('Headers: '.$headers[0]);
} else {
    self::writeLog($resp);
}
            
  • writeLog is just a method that I use to write these messages on a txt file.

Solution

i faced this issue before and the reason was not passing User-Agent to the API lead to wrong values returns

I used the following method to download whatsapp-cloud media & it works fine with me

public function grabImage(string $url,string  $saveto) : bool {
    
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 400);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch,CURLOPT_CUSTOMREQUEST , "GET");
    curl_setopt($ch,CURLOPT_ENCODING , "");

    $headers    = [];
    $headers[]  = "Authorization: Bearer " . self::$adminToken;
    $headers[]  = "Accept-Language:en-US,en;q=0.5";
    $headers[]  = "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36";
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    $raw = curl_exec($ch);
    
    $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    
    if((int)$httpcode == 200){
        // here save the $row content of file 
    }
    
    return false;
}


Answered By - Omar Tammam
Answer Checked By - Timothy Miller (WPSolving Admin)