我正在使用DIalogflow(api.ai)来创建聊天界面。我从Dialogflow创建了一个webhook到一个包含部署在Heroku上的php脚本的简单应用程序。
因此,我在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";
}
?>
请记住以下内容:
$method
由于某种原因GET
而不是POST
,因为它应该来自Dialogflow。$requestBody
,$json
或$text
,则不会打印任何内容。if
分支已执行,default
分支在switch
处执行。为什么我的PHP脚本不能&#34;看到&#34;来自DIaloflow的webhook并从中获取数据以便做出适当的响应?
P.S。我的问题不是Valid JSON output but still getting error的重复。前者是关于php脚本的输入,而后者是关于php脚本的输出。这两件事不一定构成同样的问题。
答案 0 :(得分:1)
我设法将Dialogflow连接到Heroku上的php脚本。
我在我的php脚本(在Heroku上)和Dialogflow上做了以下更改,这导致了这个结果:
我将条件if($method == 'GET')
替换为条件if($method == 'POST')
,以便预测Dialogflow的POST
请求。
请记住,在我解决整个问题之前,我没有收到任何POST请求,但是我得到了请求所以我认为来自Dialogflow的POST请求导致GET请求,因为我无法真正看到的网页重定向时刻。
我将$text = $json->metadata->intentName->text;
替换为$text = $json->results->metadata->intentName;
,这是正确的json解析,用于检索intentName
的值。 (我已经发布了here来自Dialogflow的json请求,但没有人注意到我的错误)
我通过内置的网络演示和Slack在Dialogflow上发布了我的机器人。这可能听起来完全无关紧要,但Dialogflow论坛上的一个人也表示:&#34;也许它应该在某处提到。 api.ai98没有解析任何参数/值/数据给你服务,直到你的机器人发布!!&#34; (请参阅此处的第二篇文章:https://discuss.api.ai/t/webhook-in-php-example/229)。
答案 1 :(得分:0)
尝试通过代码中的一些修改来执行此类操作。
首先,我建议您使用action
而不是intent name
用于切换案例。
<强>的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放入对话框流中,您可以轻松调试错误和所有。