Facebook Messenger API:设置Webhook时出现问题

16

2
我在服务器上创建了一个 .html 文件,这就是问题所在。你认为为什么错误信息会说它收到了 <html> <header> …,但期望的是完全不同的东西呢?挑战值是你的 URL 应该返回的 唯一 东西;而不是一个 HTML 文档... - CBroe
6个回答

31

我找到了一个解决方法。我放弃了我的 JavaScript 尝试,并创建了一个具有以下代码的新的 PHP 文件:

<?php

$challenge = $_REQUEST['hub_challenge'];
$verify_token = $_REQUEST['hub_verify_token'];

if ($verify_token === 'my_token_code') {
echo $challenge;
}

我从这个视频的前10分钟中获得了这段代码:https://www.facebook.com/marketingdevelopers/videos/883648801749520/


谢谢这个!我试图让 FB 的示例代码起作用,但简单多了。 - TwisterMc
1
你做错的事情是试图在页面内联使用 NodeJS 代码。Facebook 将在响应正文中查找令牌。在 NodeJS 中,res.send 被用于设置响应正文的内容,但你的页面已经执行了这个操作,因为它只是一个普通的 HTML 页面。 - Tom
尽管这样做可以起作用,但它并没有告诉你应该怎么做才能使你的Node.js代码正常工作...看看其他答案。 - Stéphane Bruckert
@thebluefox和Jamund在下面的答案中解释了JS脚本在普通HTML页面和NodeJS服务器端脚本之间的区别。如果您没有使用node-js,则上述答案适用于PHP Web服务器。 - dsapalo
对我们来说,关键是:hub.challenge、hub.verify_token,而不是hub_challenge和hub_verify_token。 - Naremy
我们应该使用什么值作为验证令牌?这是某个密码吗? - AdamMc331

6

这段代码是 node.js 代码, 应该在服务器上运行,而不是在 HTML 的 <script> 标签中。

以下是使用 node.js 设置 Messenger 机器人的简单步骤:

https://github.com/voronianski/simon-le-bottle

基本上,您需要确保您的主机支持 node.js 应用程序,并将其作为此类运行。 它不能在 HTML 内部工作。


5
如果您正在运行此应用程序作为Node.js应用程序,并且您来自问题中提到的Facebook快速入门指南,则必须将Webhook URL指向[your-server-root]/webhook。请注意教程中的这一部分内容。
// Adds support for GET requests to our webhook
app.get('/webhook', (req, res) => {
    ...
    // Responds with the challenge token from the request
    res.status(200).send(challenge);
});

4

不确定这是否有帮助,但FB发送的查询参数是带有下划线而不是点,例如:

  • hub_verify_token
  • hub_mode
  • hub_challenge

附言:

很抱歉,这仅适用于PHP。


1
谢谢。我最终使用了 PHP 来解决问题,现在它可以正常工作了。 - Shane
不,它使用点号而不是下划线。是 PHP 将点号替换为下划线。 - bfontaine

4

我刚刚通过在回调 URL 中添加“/webhook”来解决了这个问题...


3

@shane

webhook: function(req, res) {

   if (req.query['hub.verify_token'] === 'tokentoken') {
      res.send(req.query['hub.challenge']);
   } else {
      res.send('Error, wrong validation token');    
   }
}

我不确定您具体在做什么,但这是我所做的,而且它有效。

由于我没有域名,所以我使用了ngrok服务器进行测试,回调URL为https://werwrwetwtw.ngrok.io/webhook

希望对您有所帮助!


你看到问题中的代码在 <script> 标签中,没有在服务器上运行。 - Jamund Ferguson
这个能在IIS上运行吗?我想在asp.net mvc上托管一个webhook。 - Muneeb Zulfiqar
我尝试过类似的事情。我设置了一个ngrok服务器,并提供了回调URL https://mycallbackurl.ngrok.io/webhook/webhook。 "webhook"文档只是一个文本文件,其中包含您上面的'webhook'代码。然而,我仍然遇到与Shane相同的错误,即返回的只是代码的实际文本内容,而不是Challenge token。有什么想法吗? - MEric
@MEric 我曾经遇到过类似的问题,但现在已经解决了。请检查你的req.query对象是否包含'hub.challenge'。我当时使用restify,所以添加了queryparser中间件,现在它可以正常工作了。 - Dhiraj Sharma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接