Facebook webhook 验证响应结构

spi*_*x4k 4 facebook facebook-ads-api facebook-webhooks facebook-ads facebook-nodejs-business-sdk

这是我第一次发布问题,因此请提供反馈以改进问题。

Facebook webhook 提到,在 webhook 端点可以接收任何事件通知之前,应首先验证端点。

验证请求的文档未提供 API 的响应结构。它只是告诉我们发回 hub.challenge 参数。

当我使用 NodeJS 时,我正在尝试使用下面的代码。但是,它不会验证来自 Facebook 仪表板的 Webhook。

我们应该如何发回响应来验证 webhook?

 app.get('/webhook', (req, res) => {
  const challenge = req.query['hub.challenge'];
  const verify_token = req.query['hub.verify_token'];
  
  if (verify_token === process.env.FACEBOOK_VERIFICATION_TOKEN) {
    return res.status(200).send({message: "Success", challenge: challenge});
  }
  return res.status(400).send({message: "Bad request!"});
})
Run Code Online (Sandbox Code Playgroud)

sub*_*ika 5

Facebook 的验证端点要求响应 Content-Type 为 text/html。文档中没有提到这一点;他们应该提供一个结构。您可以设置标头以text/html显式使用。

但是,当您使用express时,您可以直接返回挑战值。

app.get('/webhook', (req, res) => {
  const challenge = req.query['hub.challenge'];
  const verify_token = req.query['hub.verify_token'];
  
  if (verify_token === process.env.FACEBOOK_VERIFICATION_TOKEN) {
    return res.status(200).send(challenge);  // Just the challenge
  }
  return res.status(400).send({message: "Bad request!"});
})
Run Code Online (Sandbox Code Playgroud)

如果您使用 fastify 集:

      res.header('Content-Type', 'text/html; charset=utf-8');
      return res.send('' + challenge);
Run Code Online (Sandbox Code Playgroud)