【问题标题】:Facebook Messenger API: Trouble setting up a webhookFacebook Messenger API:设置 webhook 时遇到问题
【发布时间】:2016-08-04 08:37:21
【问题描述】:

我正在尝试在我的 PHP 网络服务器上为新的 Facebook Messenger 机器人平台设置网络挂钩,但收到此错误:

无法验证 URL。响应与挑战不匹配, 期望值='364011207',收到='

资源

https://developers.facebook.com/docs/messenger-platform/quickstart

https://developers.facebook.com/docs/messenger-platform/webhook-reference#common_format

非常感谢任何帮助。

【问题讨论】:

  • “我在服务器上创建了一个 .html 文件”——这就是问题所在。为什么你认为错误消息说它收到了<html> <header> …,但预期的却完全不同?挑战值是您的 URL 应该返回的唯一项;不是 HTML 文档……

标签: javascript php facebook webhooks facebook-messenger


【解决方案1】:

我遇到了一个修复程序。我放弃了我的 js 尝试并使用以下代码创建了一个新的 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 的示例代码正常工作。这要容易得多。
  • 你做错了尝试在你的页面上使用 NodeJS 代码。 Facebook 将在响应正文中查找令牌。在 NodeJS 中, res.send 被用于设置响应正文的内容 - 但您的页面已经这样做了,因为它只是一个普通的 HTML 页面。
  • 尽管这会起作用,但它并没有告诉你应该做什么才能让你的 Node.js 代码工作......看看其他答案。
  • @thebluefox 和 Jamund 在下面的回答解释了普通 HTML 页面中的 JS 脚本和 NodeJS 服务器端脚本之间的区别。如果您不使用 node-js,那么上述答案将适用于 PHP 网络服务器。
  • 对我们来说,关键是:hub.challenge、hub.verify_token 而不是 hub_challenge hub_verify_token。
【解决方案2】:

该代码是 node.js 代码,应该在服务器上运行,而不是在 HTML 中的 &lt;script&gt; 标记中。

下面是使用 node.js 设置 messenger 机器人的简单介绍: https://github.com/voronianski/simon-le-bottle

基本上你需要确保你有一个支持 node.js 应用程序的主机并运行它。它在 HTML 中不起作用。

【讨论】:

    【解决方案3】:

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

    • hub_verify_token
    • hub_mode
    • hub_challenge

    附:

    对不起,这对 PHP 有效

    【讨论】:

    • 谢谢。我最终使用 php 作为解决方案,它可以工作
    • 不,它确实使用点;不是下划线。是 PHP 用下划线代替点。
    【解决方案4】:

    如果您将其作为Node.js 应用程序运行,并且您来自问题中提到的The Facebook Quickstart Guide,则必须将webhook URL 指向[your-server-root]/webhook。注意the tutorial的这一部分:

    // 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);
    });
    

    【讨论】:

      【解决方案5】:

      @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

      希望这会有所帮助!

      【讨论】:

      • 您看到问题中的代码位于&lt;script&gt; 标记中,并且没有在服务器上运行。
      • 这可以在 IIS 上工作吗?我想在 asp.net mvc 上托管一个 webhook
      • 我尝试过类似的事情。我设置了一个 ngrok 服务器并提供了回调 URL mycallbackurl.ngrok.io/webhook/webhook。 “webhook”文档只是一个文本文件,上面有您的“webhook”代码。但是,我仍然遇到与上面 Shane 相同的错误,返回的只是代码的实际文本内容,而不是 Challenge 令牌。有什么想法吗?
      • @MEric 我有类似的问题,但现在已经解决了。请做一件事检查您的 req.query 对象是否包含“hub.challenge”。我使用的是 restify,所以我添加了 queryparser 中间件,它可以工作。
      【解决方案6】:

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

      【讨论】:

        猜你喜欢
        • 2016-10-12
        • 1970-01-01
        • 1970-01-01
        • 2016-08-16
        • 1970-01-01
        • 2016-11-28
        • 2016-11-15
        • 2016-11-09
        相关资源
        最近更新 更多