Facebook Messenger webhook设置,但未触发

时间:2016-04-22 21:26:54

标签: facebook facebook-graph-api webhooks facebook-messenger

所以我试图为新的Facebook Messenger API设置机器人。

我跟随the quickstart

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

我打电话给:

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

它并没有抛出任何错误,

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

有什么方法可以调试这个或任何想法吗?

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

7 个答案:

答案 0 :(得分:42)

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

  • 确保您已在产品设置标签下验证了您的webhook。
  • 使用您的网页访问令牌将您的应用订阅到该页面。如果一切正常,它会返回9953593875

重要

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

  • 您是否收到过facebook api的回电?或者只是消息?查看您的Web服务器的日志,并检查您是否在webhook上获得任何点击。另请查看错误日志。

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

<强>命令:

{"success" : "true"}

答案 1 :(得分:8)

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

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

GET将返回当前订阅(空{[]}),POST返回{&#34;成功&#34; :&#34; true&#34;}

我遇到的其他一些问题是,

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

答案 2 :(得分:5)

可以阻止某些响应发送到您的webhook的另一件事是在队列中阻止消息类型。

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

在第一个消息类型被确认之前,facebook messenger将不再向您发送该消息类型。它基本上将它们放入队列中。

与此同时,其他消息类型将继续正常发送。

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

正如其他人所提到的,使用POSTMAN之类的服务向你的webhook发送消息是找到这种错误的好方法,否则,messenger就会无声地失败。

答案 3 :(得分:4)

如果您使用框架,那么从CSRF验证中排除您的bot溃败可能会有所帮助。这对我有帮助(Laravel 5.4,app / Http / Middleware / VerifyCsrfToken.php):

protected $except = [
        '/your_bot_route'
    ];

答案 4 :(得分:0)

几天前,当我在机器人上工作时,我也遇到了同样的问题。按照这个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挂钩获取响应。我已经设置了Administrator和Tester用户。只有能够得到答复。其他用户将在发布后获得。此外,相应地更改验证令牌和页面标记。

在发布应用程序时会询问有关此机器人将要使用的业务数量的选项。但我不知道如何使用它。仍然在搜索。

答案 5 :(得分:0)

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

我更新了有关隐私权政策的担忧链接,即使Webhoob已通过验证,Facebook也显示404错误...

答案 6 :(得分:-1)

您可以在Messenger设置的“添加或删除页面”标签下,将多个页面链接到您的应用程序