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
相关产品推荐
相关产品推荐

