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

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的响应回调中添加状态码检查,比如:
    const req = https.request(options, res => {
        console.log(`状态码: ${res.statusCode}`);
        res.on("data", d=> {
            process.stdout.write(d);
        });
    });
    
    以此确认请求是否成功发送到Meta服务器,是否返回错误状态码。
  • 检查号码格式:确认messages["from"]返回的号码是否为带国家代码的完整格式(如+1234567890),若格式不符需做转换。
  • 排查Azure网络限制:确认Azure应用服务的出站规则允许访问graph.facebook.com,无防火墙或NSG规则阻断请求。

内容的提问来源于stack exchange,提问作者TyRex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 01:15:31