Facebook - 消息传递 webhook 不断循环回调 php 文件

Facebook - Messaging webhook keeps infinitely looping the callback php file

当我的页面收到任何通知时.. 回调文件会无限地 运行 自己而不停止 这是代码:

require_once 'vendor/autoload.php';   
$fb = new \Facebook\Facebook([
  'app_id' => '{app-id}',           
  'app_secret' => '{app_secret}',   
  'graph_api_version' => 'v5.0',
]);
$feedData = file_get_contents('php://input');
$data = json_decode($feedData);
if ($data->object == "page") {   
  try {
    $response = $fb->post(
      '/me/messages',
      array (
        'recipient' => '{
          "id": "{id}"
        }',
        'message' => '{
          "text": "{text}"
        }'
      ),
     $accesstoken
    );
  } catch(FacebookExceptionsFacebookResponseException $e) {
    echo 'Graph returned an error: ' . $e->getMessage();
    exit;
  } catch(FacebookExceptionsFacebookSDKException $e) {
    echo 'Facebook SDK returned an error: ' . $e->getMessage();
    exit;
  }
  $graphNode = $response->getGraphNode();  
  }

因此用户将不停地无限接收同一条消息

我试过这里的解决方案

任何人都可以帮我解决这个问题 运行 只做一次吗? 谢谢

这可能不是您要找的答案,但我在开发自己的聊天机器人时也遇到过同样的问题。有 2 个解决方案的组合解决了这个问题:

解决方案 1: 如果没有输入,或者没有消息文本和有效负载,则代码退出。这是我的代码的摘录:

$input = json_decode(file_get_contents('php://input'), true);
if(empty($input))
    exit();

$messageText = $input['entry'][0]['messaging'][0]['message']['text'];
$messagePayload = $input['entry'][0]['messaging'][0]['postback']['payload'];

if(empty($messageText) && empty($messagePayload)) {
    exit();
}

这是必要的,因为聊天机器人似乎一直在用空请求一遍又一遍地向我的入口点发送垃圾邮件。然而...

解决方案2:我把所有的消息id都保存在数据库中,如果有一个正在处理就退出。这是必要的,因为我在 API 中不断收到某些消息 2 或 3 次,而且我不得不避免两次回复相同的消息。这是一个简短的摘录:

$mid = $input['entry'][0]['messaging'][0]['message']['mid'];
$received = $this->user->isReceived($mid); // To avoid reacting to the same message twice
if($received) {
    exit();
} else {
    $this->user->logMsg($mid);
}

isReceived函数中,我检查消息id-s的自定义table是否已经包含这条消息。在 logMsg 函数中,我存储了 id。然而,它们有点复杂并且依赖于框架,因此您必须自己编写这些函数,因为您认为它们适合您的项目。

祝你好运,我希望有人能提出更好的解决方案。

try {
  // Returns a `FacebookFacebookResponse` object
  $response = $fb->get(
    '/{to_id}?fields=conversations{messages{message}}',
    $accesstoken
  );
} catch(FacebookExceptionsFacebookResponseException $e) {
  echo 'Graph returned an error: ' . $e->getMessage();
  exit;
} catch(FacebookExceptionsFacebookSDKException $e) {
  echo 'Facebook SDK returned an error: ' . $e->getMessage();
  exit;
}
$idchk = $response->getGraphNode();
$datachk = json_decode($idchk);
if (($data->object == "page")&&(strpos($idchk,'hey')=="")) {   
  try {
    $response = $fb->post(
      '/me/messages',
      array (
        'recipient' => '{
          "id": "{to_id}"
        }',
        'message' => '{
          "text": "hey"
        }'
      ),
     $accesstoken
    );

    exit;
  } catch(FacebookExceptionsFacebookResponseException $e) {
    echo 'Graph returned an error: ' . $e->getMessage();

    exit;

  } catch(FacebookExceptionsFacebookSDKException $e) {

    echo 'Facebook SDK returned an error: ' . $e->getMessage();

}}

    exit;