使用WhatsApp Business Media API获取图片时PHP Curl请求报错
WhatsApp Media API PHP请求报错排查
问题描述
我正在使用WhatsApp Media API通过Webhooks获取用户发送给企业号的图片,在Postman中可正常获取图片ID、URL及图片内容,但将Postman生成的Curl请求转为PHP代码后,执行时始终出现Facebook错误:
抱歉,出现了问题。我们正在处理,会尽快修复。
但该请求在Postman中运行正常,请问我哪里操作有误?
用户提供的PHP代码:
<?php $ua = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.16 (KHTML, like Gecko) \ Chrome/24.0.1304.0 Safari/537.16'; $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => 'Image_URL_from_Api', CURLOPT_USERAGENT => $ua, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_SSL_VERIFYPEER => false, CURLOPT_HTTPHEADER => array( 'Authorization: Bearer My_Token' ), )); $response = curl_exec($curl); curl_close($curl); echo $response;
问题排查及修复方案
User-Agent格式错误:代码中User-Agent字符串的换行转义符
\会导致curl发送的请求头部内容异常,Postman使用的是完整单行的User-Agent,而PHP中的转义换行会触发Facebook的验证拦截。
修复:将User-Agent改为完整单行,移除转义符:$ua = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.16 (KHTML, like Gecko) Chrome/24.0.1304.0 Safari/537.16';冗余的GET请求设置:对于GET请求,curl默认会使用GET方法,手动设置
CURLOPT_CUSTOMREQUEST => 'GET'属于冗余操作,可能导致请求格式异常。
修复:移除该行设置。占位符未替换:确认代码中的
Image_URL_from_Api和My_Token已经替换为实际有效的图片URL和API令牌,Postman中使用的是真实值,但PHP代码若保留占位符必然报错。SSL验证建议:虽然关闭
CURLOPT_SSL_VERIFYPEER不是报错直接原因,但生产环境建议开启该验证,避免安全风险。
修改后的完整代码:
<?php $ua = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.16 (KHTML, like Gecko) Chrome/24.0.1304.0 Safari/537.16'; $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => '实际的图片URL', CURLOPT_USERAGENT => $ua, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_SSL_VERIFYPEER => true, // 生产环境建议开启 CURLOPT_HTTPHEADER => array( 'Authorization: Bearer 你的有效Token' ), )); $response = curl_exec($curl); // 添加curl错误排查,方便定位问题 if(curl_errno($curl)){ echo 'Curl错误:' . curl_error($curl); } curl_close($curl); echo $response;
内容的提问来源于stack exchange,提问作者osama developer
相关产品推荐
相关产品推荐

