我无法让我的 Messenger 聊天机器人成功回复负载

I can't get my Messenger chatbot to reply successfully to a payload

所以我正在尝试根据此处的文档实施 "quick replies":https://developers.facebook.com/docs/messenger-platform/send-messages/quick-replies#text

我有一个聊天机器人,可以成功回复用户的任何输入。当答案是快速回复负载时,我的主要问题就出现了,所以我把它放在最上面:

$postback = isset($input['entry'][0]['messaging'][0]['postback']['payload']) ? $input['entry'][0]['messaging'][0]['postback']['payload']: '' ;
$message = isset($input['entry'][0]['messaging'][0]['message']['text']) ? $input['entry'][0]['messaging'][0]['message']['text']: '' ;

之后我检查它是哪种类型的消息。如果它是 "message" 则显示一些响应。如果它是 "postback" 那么其他人。但是,在 "message" 中,我还检查了一个快速回复 ($qr),如果该值不为空,它应该进入 if 但它没有这样做,我不知道为什么。

最后,我有一个 replyUser 方法,它接受 $jsonData 并只回复。那工作正常。此外,defaultJSON 回复只是发回纯文本,而 jsonQuickReplies 将 json 格式化为快速回复。我知道这是有效的,因为我可以看到快速回复没有问题,只是在用户选择一个没有任何反应之后。

回发有效负载(即使它被捕获在 $input['entry'][0]['messaging'][0]['message']['quick_reply']['payload'] 中,出于某种原因,它会跳过 if 并且我不知道为什么(所以它总是在 "else" 下向我发送消息.

if($message || $postback) { 

    if($message){

        $qr = isset($input['entry'][0]['messaging'][0]['message']['quick_reply']['payload']) ? $input['entry'][0]['messaging'][0]['message']['quick_reply']['payload']: '' ;

        if(!empty($qr)){
            if(preg_match('[postback payload from qr]', strtolower($qr))){
                $message_to_reply = "Something for the user";
                $jsonData = defaultJSON($sender, $message_to_reply);
            }
        }

        //Some Basic rules to validate ("chat") incoming messages
        if(preg_match('[hey]', strtolower($message))) { 
           $message_to_reply = "welcome message to the user";
           $jsonData = jsonQuickReplies($sender, $message_to_reply);
        }else {
           $message_to_reply = "default message not knowing what the user said";
           $jsonData = defaultJSON($sender, $message_to_reply);
    }else if($postback){
        // If Page receives Postback, process the Postback and prepare content to reply
        if(preg_match('[any postback]', strtolower($postback))){
            $message_to_reply = "process postback";
            $jsonData = defaultJSON($sender, $message_to_reply);
        }
    }
}

变量细分:

$postback 包含由答案分配的任何回发。

$message 可以是用户发送的任何内容。

$qr 是从回传负载中读取的任何快速回复值。

$message_to_reply 是将作为回复发送给用户的短信。

$jsonData 只是发送给 replyUser 以用于响应的最终 json 值。

$sender 是刚刚与聊天机器人互动的用户的用户 ID。

采用的代码路径如下:任何用户发送内容。该消息然后由 $postback$message 变量读取(字面意思是查看 $input。之后是 if,如果它是 $message 则遵循该路由(如果它是 $postback,则相反。在此之后,消息由 defaultJSON()jsonQuickReplies() 方法创建,最后 replyUser 获取值并将其发送到用户。

你的牙套不对。我只是尝试让代码与大括号匹配,使其更加明显。

if($message || $postback) { 

    if($message){

        $qr = isset($input['entry'][0]['messaging'][0]['message']['quick_reply']['payload']) ? $input['entry'][0]['messaging'][0]['message']['quick_reply']['payload']: '' ;

        if(!empty($qr)){
            if(preg_match('[postback payload from qr]', strtolower($qr))){
                $message_to_reply = "Something for the user";
                $jsonData = defaultJSON($sender, $message_to_reply);
            }
        }

        //Some Basic rules to validate ("chat") incoming messages
        if(preg_match('[hey]', strtolower($message))) { 
           $message_to_reply = "welcome message to the user";
           $jsonData = jsonQuickReplies($sender, $message_to_reply);
        }else {
           $message_to_reply = "default message not knowing what the user said";
           $jsonData = defaultJSON($sender, $message_to_reply);
           //MISSING BRACE
        }else if($postback){
            // If Page receives Postback, process the Postback and prepare content to reply
            if(preg_match('[duda]', strtolower($postback))){
                $message_to_reply = "process postback";
                $jsonData = defaultJSON($sender, $message_to_reply);
            }
        }
    }