尝试执行ajax时出现webhook错误

时间:2017-11-24 09:10:55

标签: php actions-on-google dialogflow

我现在修改了所有这个文件使我的api工作。

auth.php:

<?php
include 'Unirest.php';



function login()
{

    $headers = array('Accept' => 'application/json');
    $data = array(
        "grant_type" => "password",
        "client_id" => "myclientid",
        "client_secret" => "myclientsecret",
        "username" => "username",
        "password" => "password"
    );

    $response = Unirest\Request::post('http://i-scent.fr/api/oauth_token', $headers, $data);
    //    $response->code;
    //    $response->headers;
    return $response->body->access_token;
}

function device_info($device_id,$token){

    $header = array('Accept' => 'application/json', 
                    'Authorization' => 'Bearer '.$token );
    $response = Unirest\Request::get('http://i-scent.fr/api/devices/'.$device_id,$header);
    echo $response->body->name;
    echo "</br>";

}

function diffuse($device_id,$token,$duration,$intensity){

    $header = array('Accept' => 'application/json', 'Authorization' => 'Bearer '.$token );
    $data = array('time' => 1, 'percent' => 50);

    $body = Unirest\Request\Body::form($data);


    $response = Unirest\Request::put('http://i-scent.fr/app_dev.php/api/device/'.$device_id.'/actions/diffusion',$header,$body);
    echo $response->code;
    echo "</br>";


}

当我在一个简单的脚本中使用所有功能时,它在我的网站上完美运行。但是,当我在我的webhook中这样说,我有错误500内部服务器错误。我拥有所有最廉价的图书馆。

<?php
include "auth.php";

function processMessage($update) {
    if($update["result"]["action"] == "sayHello"){

        $token = login();
        $name = device_info("1966",$token);
        diffuse("1966",$token,"0.5","50");

        sendMessage(array(
            "source" => $update["result"]["source"],
            "speech" => "bonjour webhook",
            "displayText" => "bonjour webhook",
            "contextOut" => array()
        ));

    }
}

function sendMessage($parameters) {
    echo json_encode($parameters);
}


$update_response = file_get_contents("php://input");
$update = json_decode($update_response, true);
if (isset($update["result"]["action"])) {

    processMessage($update);
}

错误500应该意味着webhokk的脚本在某处崩溃,但我不知道在哪里以及为什么。

1 个答案:

答案 0 :(得分:2)

更新2

根据您最近的代码,您将包括&#34; auth.php&#34;,它在原始环境中工作(它被称为网页的一部分,听起来像)。

您的代码有两个函数device_info()diffuse(),它们输出结果而不是返回结果。此输出不是JSON,包括HTML标记。这是作为webhook结果的一部分发送的,并且会导致返回的内容无效。

<强>更新

根据您的最新代码,仍有许多逻辑和一些语法问题。

A&#34; 500内部服务器错误&#34;表示您的程序由于某种原因没有正确运行并崩溃。如发布,它会丢失一个结束},如果您的实际代码中没有这个问题可能会出现问题。

即使您解决了这个问题,代码也存在许多问题:

  • 目前还不清楚您打算如何调用您的&#34; test1&#34;脚本。您将它们存储在$data中,并且不对其执行任何操作。

  • 在您查看用户要求您执行的操作之前,您正在调用其他网站(test1)。哪个好,但是为什么你关心用户问你什么?

原始答案

这里有一些错误,但潜在的问题是,您要将运行的内容和调用者的功能混合到您的webhook。

对于Dialogflow webhook,Google / Dialogflow正在发送JSON(您似乎正在处理好),并期待回JSON。虽然您看起来像是send_message()的一部分发回来的,但是当您致电connexion()时,您还会发回一些内容。在这种情况下,您发回的内容是不是 JSON,而是带有JavaScript的HTML。

这导致了第二个问题 - 如果这是生成包含脚本的HTML页面的php,那么你的状态就会很好。但它不是。您必须发回 JSON。

您可以执行以下操作来调用其他API并获取内容:

$body = file_get_contents("http://google-home.exhalia.fr/test1");

$body设置为您所呼叫的页面正文。那时你用它做什么取决于你。但是,您需要在致电send_message()之前拨打此电话,因为您希望将内容表示为您所说的内容的一部分。

(有关您需要进行POST,使用标题信息等的其他可用方法的讨论,请参阅officals docs。)