You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WhatsApp Cloud API媒体文件上传报错:缺失messaging_product参数

WhatsApp Cloud API媒体文件上传报错排查与解决

开发WhatsApp Cloud API轻量封装工具时,遇到媒体文件上传失败的问题。官方要求该上传接口需提交multipart/form-data格式的请求体。

实现代码

import FormData from 'form-data';
import fs from 'fs';
import axios from 'axios';

const formData = new FormData();

formData.append('file', fs.createReadStream('path/to/my/file.jpg'));
formData.append('messaging_product', 'whatsapp');
formData.append('type', 'image/jpeg');

await axios.post('https://graph.facebook.com/v14.0/PHONE_NO_ID/media', formData, {
  headers: { 'Authorization': ACCESS_TOKEN }
});

返回的错误信息

{
  "error": {
    "message": "(#100) The parameter messaging_product is required.",
    "type": "OAuthException",
    "code": 100,
    "fbtrace_id": "FBTRACE_ID"
  }
}

明明已在formData中添加messaging_product字段,却仍被提示缺失。用官方提供的Postman集合测试可正常上传,一度怀疑fs.createReadStream处理文件的方式与Postman不一致。

问题解决

最终发现问题出在请求头:未将formData生成的请求头(尤其是带boundary的Content-Type)与自定义的Authorization头合并。修改后的代码如下:

import FormData from 'form-data';
import fs from 'fs';
import axios from 'axios';

const formData = new FormData();

formData.append('file', fs.createReadStream('path/to/my/file.jpg'));
formData.append('messaging_product', 'whatsapp');
formData.append('type', 'image/jpeg');

await axios.post('https://graph.facebook.com/v14.0/PHONE_NO_ID/media', formData, {
  headers: {
    ...formData.getHeaders(),
    'Authorization': ACCESS_TOKEN
  }
});

原因是form-data库会自动生成包含boundary的Content-Type头,而axios不会自动为formData对象添加该头,必须手动通过formData.getHeaders()获取并合并到请求头中,否则服务端无法正确解析formData内的字段,进而触发缺失参数的错误。

内容的提问来源于stack exchange,提问作者Yu Yue Ng

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 19:54:19