Node.js发送WhatsApp flows消息模板遇400错误求助
WhatsApp Flows消息发送400错误排查
以下是你提供的代码(修正了转义引号):
//rest of code //flow let message= { name: "lzgoflow", language: "en_US", category: "MARKETING", components: [ { type: "body", text: "hello there", }, { type: "BUTTONS", buttons: [ { type: "FLOW", text: "lzgo", flow_id: 937561724890552, navigate_screen: "lzgo flow", flow_action: "navigate", }, ], }, ], }; axios({ method: "POST", url: "https://graph.facebook.com/v12.0/" + phone_number_id + "/messages?access_token=" + token, data: message, headers: { "Content-Type": "application/json" }, }) .then((response) => { console.log("Message sent successfully:", response.data); }) .catch((error) => { console.error("Error sending message:", error.message); }); } res.sendStatus(200); } else { res.sendStatus(404); } });
出现400错误的常见排查点:
- 缺失接收者字段:发送模板消息必须在
message对象中添加to字段,值为接收者的WhatsApp手机号(需包含国家代码,格式如+1234567890),这是最容易遗漏的必填项。 - API版本过低:v12.0版本不支持WhatsApp Flows功能,需要升级到v16.0及以上的API版本,否则会因不识别
FLOW类型按钮返回400。 - Flow参数不匹配:
navigate_screen需填写Flow定义中的屏幕ID,而非屏幕显示名称,检查Flow配置里的屏幕ID是否与代码中的值一致。- 确认
flow_id已正确关联到当前使用的WhatsApp手机号,且Flow处于已发布状态。
- 模板状态问题:MARKETING类模板需通过Meta的审核,若模板未审核通过或处于草稿状态,无法发送。
- 权限与身份验证:验证
access_token是否拥有whatsapp_business_messaging权限,phone_number_id是否属于当前授权的Business账户。 - 请求格式问题:检查
components中的type字段大小写,BUTTONS应为小写buttons(Meta API对字段大小写敏感)。
修改后的示例代码(补充必填字段并升级API版本):
let message= { to: "+1234567890", // 接收者手机号 type: "template", // 明确指定消息类型为模板 template: { name: "lzgoflow", language: { code: "en_US" }, // 语言字段格式应为对象 category: "MARKETING", components: [ { type: "body", text: "hello there", }, { type: "buttons", // 改为小写buttons buttons: [ { type: "FLOW", text: "lzgo", flow_id: "937561724890552", // 转为字符串类型 navigate_screen: "your_flow_screen_id", // 替换为实际屏幕ID flow_action: "navigate", }, ], }, ], }, }; axios({ method: "POST", url: `https://graph.facebook.com/v18.0/${phone_number_id}/messages?access_token=${token}`, data: message, headers: { "Content-Type": "application/json" }, }) .then((response) => { console.log("Message sent successfully:", response.data); }) .catch((error) => { // 打印完整错误信息,包含Meta返回的具体错误描述 console.error("Full error details:", error.response.data); });
另外,在catch块中打印error.response.data可以获取Meta返回的具体错误提示,这能更精准定位问题。
内容的提问来源于stack exchange,提问作者Omar Jabban
相关产品推荐
相关产品推荐

