为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
芜湖不芜 2022-07-16 09:41:45
当我的页面收到任何通知时..回调文件无限运行而不会在这里停止是代码: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();    }因此用户将无限地接收相同的消息而不会停止我 在 WebHook 中尝试了无限循环的解决方案任何人都可以帮我解决这个问题,让它只运行一次吗?谢谢你
查看完整描述

2 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

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


解决方案 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-s 保存在数据库中,如果一个已经在处理中,则退出。这是必要的,因为我在 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 的自定义表是否已包含此消息。在logMsg函数中,我存储了 id。然而,它们有点复杂并且依赖于框架,因此您必须自己编写这些函数,因为您认为它们适合您的项目。


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


查看完整回答
反对 回复 2022-07-16
?
aluckdog

TA贡献1847条经验 获得超7个赞

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;


查看完整回答
反对 回复 2022-07-16
  • 2 回答
  • 0 关注
  • 115 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信