Я изменил все это теперь у меня есть этот файл, который заставляет мой 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 где-то потерпел крах, но я не знаю, где и почему.
Обновление 2
Основываясь на вашем самом последнем коде, вы включаете в себя «auth.php», который работает в исходной среде (которая называется как часть веб-страницы, похоже).
Ваш код имеет две функции, device_info()
а также diffuse()
, которые выводят свои результаты, а не возвращают их. Этот вывод не является JSON и включает в себя разметку HTML. Это отправляется как часть результата вашего веб-крюка и приведет к тому, что возвращаемое будет недействительным.
Обновить
Основываясь на вашем последнем коде, все еще остается много логических и несколько синтаксических проблем.
«500 Internal Server Error» означает, что ваша программа не работала правильно и по какой-то причине зависала. Как уже сообщалось, в нем отсутствует закрывающее}, что может быть проблемой, если этого нет в вашем реальном коде.
Даже если вы это исправите, есть много проблем с кодом:
Непонятно, что вы намерены делать с результатами вызова вашего скрипта «test1». Вы храните их в $data
и ничего с этим не делать.
Вы звоните на другой веб-сайт (test1), прежде чем посмотреть, что пользователь попросил вас сделать. Что хорошо, но тогда почему вас волнует, что спрашивает пользователь?
Оригинальный ответ
Здесь есть несколько ошибок, но основная проблема заключается в том, что вы путаете то, что происходит, и возможности вызывающей стороны для вашего webhook.
Для веб-крючка Dialogflow Google / Dialogflow отправляет JSON (с которым вы, похоже, хорошо справляетесь) и ожидаете возврата JSON. Хотя похоже, что вы отправляете это обратно как часть send_message()
, вы также отправляете что-то обратно, когда звоните connexion()
, В этом случае вы отправляете обратно не JSON, но HTML с JavaScript.
Что приводит ко второй проблеме — если бы это был php, который генерировал HTML-страницу, включающую скрипт, вы были бы в хорошей форме. Но это не так. Вы должны отправить обратно только JSON.
Вы можете сделать что-то вроде этого, чтобы вызвать другой API и получить обратно содержимое:
$body = file_get_contents("http://google-home.exhalia.fr/test1");
Который установит $body
к телу страницы, которую вы назвали. То, что вы делаете с этим, зависит от вас. Но вам нужно сделать этот звонок до ваш звонок в send_message()
потому что вы хотите представить содержимое как часть того, что вы говорите.
(Увидеть Как отправить запрос GET из PHP? для обсуждения других методов, доступных вам в случае, если вам нужно сделать POST, использовать информацию заголовка и т. д.)
Других решений пока нет …