使用WhatsApp Cloud API上传本地文件遇OAuthException错误求助
问题分析与解决方案
你的核心问题是本地文件上传的cURL请求格式错误,导致WhatsApp Cloud API无法正确解析文件数据。以下是具体问题点和修复方案:
问题根源
- 旧版文件上传语法失效:PHP 5.5及以上版本已废弃用
@前缀指定文件的方式,需改用CURLFile类处理文件上传。 - POST数据格式错误:使用
http_build_query()会将POST数据编码为application/x-www-form-urlencoded,但文件上传需要multipart/form-data格式——直接传递数组给CURLOPT_POSTFIELDS时,cURL会自动处理为正确的多部分表单格式。 - 缺少必填的
type字段:API要求明确指定文件的MIME类型,你的请求遗漏了该字段。
修复后的代码
$this->endpoint = 'PHONE_NUMBER_ID/media'; $this->config->default_access_token = 'XXXXXXXX'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://graph.facebook.com/v14.0/'.$this->endpoint); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); // 使用CURLFile替代旧的@语法,指定文件路径与MIME类型 $pdfFile = new CURLFile('/var/www/html/6218062.pdf', 'application/pdf'); $post = array( 'file' => $pdfFile, 'messaging_product' => 'whatsapp', 'type' => 'application/pdf' // 添加必填的文件类型字段 ); // 直接传递数组,无需用http_build_query处理 curl_setopt($ch, CURLOPT_POSTFIELDS, $post); $headers = array(); $headers[] = 'Authorization: Bearer '.$this->config->default_access_token; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $result = curl_exec($ch); // 检查cURL自身错误(可选,用于调试) if(curl_errno($ch)){ echo 'CURL错误:' . curl_error($ch); } print_r($result); curl_close($ch);
额外检查项
- 确认本地文件
/var/www/html/6218062.pdf存在,且PHP进程拥有读取权限(可通过is_readable('/var/www/html/6218062.pdf')验证)。 - 确保你的access token拥有
whatsapp_business_messaging权限,且电话号ID填写正确。 - 若仍报错,可开启cURL调试模式查看请求详情:
curl_setopt($ch, CURLOPT_VERBOSE, 1);
内容的提问来源于stack exchange,提问作者Ezequiel Villarreal
相关产品推荐
相关产品推荐

