Facebook Messenger webhook 设置,但未触发

Facebook Messenger webhook setup, but not triggered

所以我正在尝试为新的 Facebook Messenger 设置一个机器人 API。

我正在关注 the quickstart

我设置了 webhook,并在我的 webhook 中看到了它,

我称之为:

https://graph.facebook.com/v2.6/me/subscribed_apps?access_token=%3Ctoken%3E

它没有抛出任何错误,

但是当我转到生成访问令牌的页面并发送消息时,它不会调用我的 webhook。 我检查了 httpaccess,它没有调用它。

有什么调试方法或任何想法吗?

此外,我仍然困惑的一件事是如何支持从一个 Facebook 应用程序管理多个页面?任何人都知道这个问题的答案,或者您是否需要创建一个新的应用程序并获得每个页面的权限?

我最近使用了新的聊天机器人 API,其中有很多地方可能会出错。所以,这里有一些想法。

  • 确保您已经在产品设置选项卡下验证了您的网络钩子。
  • 使用您的页面访问令牌将您的应用程序订阅到该页面。 returns {"success" : "true"} 如果一切顺利的话。

重要

  • 确保您发送消息的 Facebook 用户被列为 AdminDeveloper测试员 在您的应用角色中 (https://developers.facebook.com/apps/YOUR_APP_ID/roles/)。除非您的应用获得批准并公开发布,否则来自其他用户的消息将无效。

  • 你收到facebook的回电了吗api?还是只是消息?查看您的 Web 服务器的日志,并检查您是否在 webhook 上获得任何点击。还要检查错误日志。

  • 尝试手动点击您的 webhook 并查看它是否响应。您可以使用 curl 生成手动请求。这是来自的请求 Facebook 看起来像:

命令:

curl -i -X POST -H 'Content-Type: application/json' -d '{"object":"page","entry":[{"id":43674671559,"time":1460620433256,"messaging":[{"sender":{"id":123456789},"recipient":{"id":987654321},"timestamp":1460620433123,"message":{"mid":"mid.1460620432888:f8e3412003d2d1cd93","seq":12604,"text":"Testing Chat Bot .."}}]}]}' https://www.YOUR_WEBHOOK_URL_HERE

所以我的问题是我在尝试订阅时调用的是 GET 而不是 POST

https://graph.facebook.com/v2.6/:pageid/subscribed_apps?access_token=:token

GET 将 return 当前订阅(空 {[]}),POST returns {"success" : "true"}

我遇到的其他一些陷阱是,

我仍然困惑的一件事是如何支持从一个 Facebook 应用程序管理多个页面?任何人都知道这个问题的答案,或者您是否需要创建一个新的应用程序并获得每个页面的权限?

几天前我在做一个机器人时也遇到了同样的问题。按照这个 gist 修改代码如下,一切正常。

public function index()
    {

        $challenge = $_REQUEST['hub_challenge'];
        $verify_token = $_REQUEST['hub_verify_token'];
        // Set this Verify Token Value on your Facebook App
        if ($verify_token === 'MyVerifyToken!') {
            echo $challenge;
        }
        $input = json_decode(file_get_contents('php://input'), true);
        // Get the Senders Graph ID
        $sender = $input['entry'][0]['messaging'][0]['sender']['id'];
        // Get the returned message
        $message = $input['entry'][0]['messaging'][0]['message']['text'];
        //$senderName = $input['entry'][0]['messaging'][0]['sender']['name'];

        $reply="Sorry, I don't understand you";

        switch($message)
        {
            case 'hello':
                $reply = "Hello, Greetings from MyApp.";
                break;
            case 'pricing':
                $reply = "Sample reply for pricing";
                break;
            case 'contact':
                $reply = "Sample reply for contact query";
                break;
            case 'webinar':
                $reply = "Sample reply for webinar";
                break;
            case 'support':
                $reply = "sample reply for support";
                break;
            default:
                $reply="Sorry, I don't understand you";
        }
        //API Url and Access Token, generate this token value on your Facebook App Page
        $url = 'https://graph.facebook.com/v2.6/me/messages?access_token=MYACCESSTOKEN';
        //Initiate cURL.
        $ch = curl_init($url);
        //The JSON data.
        $jsonData = '{
        "recipient":{
        "id":"' . $sender . '"
        },
        "message":{
            "text":"'.$reply.'"
            }
        }';
//Tell cURL that we want to send a POST request.
        curl_setopt($ch, CURLOPT_POST, 1);
//Attach our encoded JSON string to the POST fields.
        curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);
//Set the content type to application/json
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
//Execute the request but first check if the message is not empty.
        if (!empty($input['entry'][0]['messaging'][0]['message'])) {
            $result = curl_exec($ch);
        }

    }

注意 : 确保应用程序页面中的用户角色可以从 web 挂钩中获取响应。我已经设置了管理员和测试用户。只有那里能够得到回应。一旦发布,其他用户将获得。此外,相应地更改验证令牌和页面令牌。

发布应用程序时,有一个选项会询问有关此机器人将被使用的企业数量。但我不知道如何使用它。不过还在搜索。

如果您使用框架,则从 CSRF 验证中排除您的船路会有所帮助。这对我有帮助 (Laravel 5.4, app/Http/Middleware/VerifyCsrfToken.php):

protected $except = [
        '/your_bot_route'
    ];

另一种可能会阻止某些响应被发送到您的 webhook 的情况是当消息类型在队列中被阻塞时。

如果将特定类型的消息传送到您的网络钩子,但在 20 秒内未收到 200 响应,它将在数小时内继续尝试再次向您发送该消息。

此外,Facebook Messenger 将停止向您发送更多该类型的消息,直到第一个消息被确认。它实质上是将它们放入队列中。

在此期间,其他消息类型将继续正常发送。

当我不小心在处理标准消息的代码中引入了一个未声明的变量时,我就遇到了这种情况。这意味着回发消息都可以正常工作,但快速回复和普通消息永远不会发送到我的 webhook。一旦你修复了错误,它们就会立刻堆积起来。

正如其他人所提到的,使用 POSTMAN 等服务将消息发送到您的 webhook 是发现此类错误的好方法,否则,Messenger 只会默默地失败。

如果您仍然无法解决您的问题,请尝试检查并更新您的隐私政策link。

我将 worry link 更新为隐私政策,Facebook 显示 404 错误,即使 webhoob 已验证...

您可以 link 您的应用程序的多个页面,在 Messenger 设置的“添加或删除页面”选项卡下