【问题标题】:Why my PHP script does not "see" the webhook from Dialogflow?为什么我的 PHP 脚本没有“看到”来自 Dialogflow 的 webhook?
【发布时间】:2018-03-21 10:03:06
【问题描述】:

我正在使用 DIAlogflow (api.ai) 创建聊天界面。我创建了一个从 Dialogflow 到包含部署在 Heroku 上的 php 脚本的简单应用程序的 webhook。

因此,我在 Dialogflow 的 webhook 表单中放置了我的 Heroku 应用程序的 url,类似于:https://my_heroku_app_name.herokuapp.com

我的最终目标是从数据库中获取一些数据(通过 php 脚本),然后将它们提供给 Dialogflow。目前,我只是尝试通过 webhook 将 Heroku 应用程序(php 脚本)与 Dialogflow 连接起来。

Heroku 应用的 php 脚本如下:

<?php

$method = $_SERVER['REQUEST_METHOD'];

if($method == 'GET'){
    $requestBody = file_get_contents('php://input');
    $json = json_decode($requestBody);

    $text = $json->metadata->intentName->text;

    switch ($text) {
        case 'Name':
            $speech = "This question is too personal";
            break;    
        default:
            $speech = "Sorry, I didnt get that.";
            break;
    }

    $response = new \stdClass();
    $response->speech = $speech;
    $response->displayText = $speech;
    $response->source = "webhook";
    echo json_encode($response);
}
else
{
    echo "Method not allowed";
}

?>

请记住以下几点:

  • 出于某种原因,$methodGET,而不是应该来自 Dialogflow 的 POST
  • 如果您尝试回显任何变量 $requestBody$json$text,则不会打印任何内容。
  • 我测试了if分支被执行,default分支在switch执行。

为什么我的 PHP 脚本无法“看到”来自 DIaloflow 的 webhook 并从中获取数据以便做出适当的响应?

附:我的问题不是Valid JSON output but still getting error 的重复。前者是关于 php 脚本的输入,而后者是关于 php 脚本的输出。这两件事不一定构成相同的问题。

【问题讨论】:

  • "$method 出于某种原因是 GET,而不是应该来自 Dialogflow 的 POST。"这似乎是关键问题:如果您应该处理 POST 请求,为什么要寻找 GET? GET 请求不太可能包含您期望的有效负载。您如何测试执行的代码分支?
  • 无论如何,please don't repost questions。可能需要一些时间才能获得关于 SO 的答案。

标签: php heroku webhooks dialogflow-es


【解决方案1】:

尝试通过对您的代码进行一些修改来做类似的事情。 首先,我建议您使用action 而不是使用intent name 作为switch case。

index.php

<?php

require 'get_wardinfo.php';
function processMessage($input) {
    $action = $input["result"]["action"];
    switch($action){
        case 'wardinfo':
            $param = $input["result"]["parameters"]["number"];
            getWardInfo($param);
            break;
        default :
            sendMessage(array(
                "source" => "RMC",
                "speech" => "I am not able to understand. what do you want ?",
                "displayText" => "I am not able to understand. what do you want ?",
                "contextOut" => array()
            ));
    }
}
function sendMessage($parameters) {
    header('Content-Type: application/json');
    $data = str_replace('\/','/',json_encode($parameters));
    echo $data;
}
$input = json_decode(file_get_contents('php://input'), true);
if (isset($input["result"]["action"])) {
    processMessage($input);
}
?>

get_wardinfo.php

<?php
    require 'config.php';
function getWardInfo($param){
    $wardinfo="";
    $Query="SELECT * FROM public.wardinfo WHERE wardno=$param";
    $Result=pg_query($con,$Query);
    if(isset($Result) && !empty($Result) && pg_num_rows($Result) > 0){
    $row=pg_fetch_assoc($Result);
    $wardinfo= "Here is details that you require:  Name: " . $row["name"]. " --- Address: " . $row["address"]. " --- MobileNo: " . $row["contact"];

        $arr=array(
            "source" => "RMC",
            "speech" => $wardinfo,
            "displayText" => $wardinfo,
        );
        sendMessage($arr);
    }else{
        $arr=array(
            "source" => "RMC",
            "speech" => "Have some problem .",
            "displayText" => "Have some problem .",
        );
        sendMessage($arr);
    }
}
?>

您似乎知道每个参数和所有关于对话框流的信息以及它如何与 PHP 数组一起使用,如果您对上述代码或方法有任何困惑,请发表评论。

我会建议你不要直接使用Heroku,首先尝试使用ngrok,它会使你的本地服务器生效,并将 URL 作为 webhook 放入 dialogflow 中,你可以轻松调试错误等等。

【讨论】:

  • 非常感谢您的扩展回答。最后,我解决了它,我将发布(在我的一篇文章中)我所做的更改,即使我不完全确定为什么会遇到这个问题。我没有使用ngrok,而是使用hurl.it(不是本地)发送一些请求,并更清楚地看到发生了什么。
【解决方案2】:

我设法将 Dialogflow 连接到 Heroku 上的 php 脚本。

我对我的 php 脚本(在 Heroku 上)和 Dialogflow 进行了以下更改,导致了这个结果:

  1. 我将条件if($method == 'GET') 替换为条件if($method == 'POST') 以预期Dialogflow 的POST 请求。 请记住,在我解决整个问题之前,我没有收到任何 POST 请求,但我收到了 GET 请求,所以我认为来自 Dialogflow 的 POST 请求会导致 GET 请求,因为我当时看不到网页重定向时刻。

  2. 我用$text = $json-&gt;results-&gt;metadata-&gt;intentName; 替换了$text = $json-&gt;metadata-&gt;intentName-&gt;text;,这是检索intentName 值的正确json 解析。 (我已经发布了here Dialogflow 的 json 请求,但没有人注意到我的错误)

  3. 我通过其内置的网络演示和 Slack 在 Dialogflow 上发布了我的机器人。这听起来可能无关紧要,但 Dialogflow 论坛上的一个人表示:“也许它应该在某处重新提及。在你的机器人发布之前,api.ai98 不会解析任何参数/值/数据给你的服务!!” (请参阅此处的第二个帖子:https://discuss.api.ai/t/webhook-in-php-example/229)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    相关资源
    最近更新 更多