Node.js对接WhatsApp Business API无法回复消息求助
Node.js对接WhatsApp Business API回复逻辑失效问题
问题描述
使用Node.js对接官方WhatsApp Business API时,机器人已正确连接Webhook,消息可正常送达服务器,但回复逻辑无效。本地通过Postman测试所有接口均能正常收发消息;部署到Azure服务后,消息接收正常(服务器返回200响应),但机器人无法回复用户消息。Meta平台配置已按官方要求完成,Webhook相关设置正确,逐行检查代码仍未找到故障点。
相关代码
whatsappController.js
const fs = require("fs"); const myConsole = new console.Console(fs.createWriteStream("./logs.txt")); const whatsappService = require("../services/whatsappService") const VerifyToken = (req, res) => { try { var accessToken = "456E7GR****************************"; var token = req.query["hub.verify_token"]; var challenge = req.query["hub.challenge"]; if(challenge != null && token != null && token == accessToken){ res.send(challenge); } else{ res.status(400).send(); } } catch(e) { res.status(400).send(); } } const ReceivedMessage = (req, res) => { try { var entry = (req.body["entry"])[0]; var changes = (entry["changes"])[0]; var value = changes["value"]; var messageObject = value["messages"]; if(typeof messageObject != "undefined"){ var messages = messageObject[0]; var text = GetTextUser(messages); var number = messages["from"]; myConsole.log("Message: " + text + " from: " + number); whatsappService.SendMessageWhatsApp("The user say: " + text, number); myConsole.log(messages); myConsole.log(messageObject); } res.send("EVENT_RECEIVED"); }catch(e) { myConsole.log(e); res.send("EVENT_RECEIVED"); } } function GetTextUser(messages){ var text = ""; var typeMessage = messages["type"]; if(typeMessage == "text"){ text = (messages["text"])["body"]; } else if(typeMessage == "interactive"){ var interactiveObject = messages["interactive"]; var typeInteractive = interactiveObject["type"]; if(typeInteractive == "button_reply"){ text = (interactiveObject["button_reply"])["title"]; } else if(typeInteractive == "list_reply"){ text = (interactiveObject["list_reply"])["title"]; }else{ myConsole.log("sin mensaje"); } }else{ myConsole.log("sin mensaje"); } return text; } module.exports = { VerifyToken, ReceivedMessage }
whatsappService.js
const https = require("https"); function SendMessageWhatsApp(textResponse, number){ const data = JSON.stringify({ "messaging_product": "whatsapp", "recipient_type": "individual", "to": number, "type": "text", "text": { "preview_url": false, "body": textResponse } }); const options = { host:"graph.facebook.com", path:"/v15.0/1119744*************/messages", method:"POST", body:data, headers: { "Content-Type":"application/json", Authorization:"Bearer EAAWNbICfuWEBAK5ObPbD******************************************************" } }; const req = https.request(options, res => { res.on("data", d=> { process.stdout.write(d); }); }); req.on("error", error => { console.error(error); }); req.write(data); req.end(); } module.exports = { SendMessageWhatsApp };
路由文件
const expres = require("express"); const router = expres.Router(); const whatsappController = require("../controllers/whatsappControllers"); router .get("/", whatsappController.VerifyToken) .post("/", whatsappController.ReceivedMessage) module.exports = router;
入口文件index.js
const express = require("express"); const apiRoute = require("./routes/routes"); const app = express(); const PORT = process.env.PORT || 3000 app.use(express.json()); app.use("/whatsapp", apiRoute); app.listen(PORT, () => (console.log("El puerto es: " + PORT)));
排查建议
- 迁移日志到Azure可观测系统:当前代码将日志写入本地
logs.txt,Azure部署后无法直接访问该文件,建议改用console.log输出日志,或配置Azure应用服务的日志记录功能,排查SendMessageWhatsApp函数是否触发错误。 - 验证API请求参数有效性:检查
whatsappService.js中的账号ID(path中的数字部分)、授权令牌是否与Meta后台一致,确认令牌未过期且拥有whatsapp_business_messaging权限。 - 增强请求错误捕获:在
https.request的响应回调中添加状态码检查,比如:
以此确认请求是否成功发送到Meta服务器,是否返回错误状态码。const req = https.request(options, res => { console.log(`状态码: ${res.statusCode}`); res.on("data", d=> { process.stdout.write(d); }); }); - 检查号码格式:确认
messages["from"]返回的号码是否为带国家代码的完整格式(如+1234567890),若格式不符需做转换。 - 排查Azure网络限制:确认Azure应用服务的出站规则允许访问
graph.facebook.com,无防火墙或NSG规则阻断请求。
内容的提问来源于stack exchange,提问作者TyRex
相关产品推荐
相关产品推荐

