I am using Whatsapp cloud API. I have configured the webhook with a valid URL. It is working properly. But the issue is that once I receive a message from the business and if I send back a message immediately, the callback URL not getting invoked instantly. It waits for three minutes to invoke the endpoint. And if I wait for 3 minutes after a response and then send a message then it invokes instantly. Not able to find the reason. Nothing in the documentation also. I want to make it faster. For all the messages, the webhook should be triggered instantly.
https://developers.facebook.com/docs/whatsapp/cloud-api/get-started This is the documentation I followed.
Any help would be highly appreciable. Thanks in advance.
I tried sending back 200 OK for all the requests as per the documentation
My server code looks like this:
const fs = require('fs'); const token = process.env.ACCESS_TOKEN; // Imports dependencies and set up http server const request = require("request"), express = require("express"), body_parser = require("body-parser"), axios = require("axios").default, app = express().use(body_parser.json()); // creates express http server // Sets server port and logs message on success var https = require('https'); var credentials = { key: fs.readFileSync(process.env.key), cert: fs.readFileSync(process.env.cert), ca: fs.readFileSync(process.env.ca, 'utf-8') } var httpsServer = https.createServer(credentials, app); httpsServer.listen(process.env.PORT, async () => { console.log("Whatsapp server listening to port: "+process.env.PORT); // await mysqlConnector.initializeMySql(app); // await redis.initializeRedis(); });
And my webhook post method looks like this:
app.post("/inbound", async (req, res) => { // Parse the request body from the POST let body = req.body; // Check the Incoming webhook message // console.log(JSON.stringify(req.body, null, 2)); // info on WhatsApp text message payload: https://developers.facebook.com/docs/whatsapp/cloud-api/webhooks/payload-examples#text-messages if (req.body.object) { if ( body.entry && body.entry[0].changes && body.entry[0].changes[0] && body.entry[0].changes[0].value.messages && body.entry[0].changes[0].value. Messages[0] ) { res.sendStatus(200); //if the business needs to send a text message //async function call to send a text message (It is a promise function that makes API call to the /message endpoint of WhatsApp business API) // if the business needs to send an interactive message //async function call to send interactive message(promise function) //if the business needs to send a template //async function call to send message template(Promise function) } } }
And the function that send the text message:
sendMessage: async function (message, incomingMessageFrom, outgoingMessageFrom, accessToken) { return new Promise(async function (resolve, reject) { try { axios({ method: "POST", url: "https://graph.facebook.com/v16.0/" + outgoingMessageFrom + "/messages?access_token=" + accessToken, data: { messaging_product: "whatsapp", "to": incomingMessageFrom, "type": "text", "text": { "body": String(message) } }, headers: { "Content-Type": "application/json" } }).then(response => { resolve(response.data) }); } catch (error) { //log Error resolve("error: " + JSON.stringify(error.message)); } }) }
And the function that sends the template:
sendMessageTemplate: async function (templateName, params, incomingMessageFrom, outgoingMessageFrom, accessToken) { await this.bindParams(params, templateName); return new Promise(async function (resolve, reject) { try { //call bind params let data = { "messaging_product": "whatsapp", "to": incomingMessageFrom, "type": "template", "template": templates[templateName] } let url = "https://graph.facebook.com/v12.0/" + outgoingMessageFrom + "/messages?access_token=" + accessToken; axios({ method: "POST", // Required, HTTP method, a string, e.g. POST, GET url:url, data: data, headers: { "Content-Type": "application/json" }, }).then(response => { resolve(response.data) }).catch(err =>{ appLogger.logMessage("error","Failed to call template api due to: "+JSON.stringify(err.message),className,"sendMessageTemplate","ADMIN","Server",moduleName); }); appLogger.logMessage("debug","The request data send is: "+JSON.stringify(data),className,"sendMessageTemplate","ADMIN","SERVER",moduleName); appLogger.logMessage("debug","The request url send is: "+url,className,"sendMessageTemplate","ADMIN","SERVER",moduleName); } catch (error) { appLogger.logMessage("error","error occured while sending message template: "+JSON.stringify(error.message),"sendMessageTemplate","ADMIN","SERVER",moduleName); //logError resolve("error: " + JSON.stringify(error.message)); } }) }