#twilio #twilio-api #twilio-php #twilio-twiml
Вопрос:
Я пытаюсь протестировать рабочий процесс в twilio, рабочий процесс выглядит следующим образом:
- Поступает вызов, и мой сервер попадает под действие twilio, запрос действителен в соответствии с документами
- Webhook возвращает Twiml с перенаправлением на другую конечную точку, чтобы поставить вызов в очередь.
- На этой конечной точке веб-крючок недействителен.
Все конечные точки, за исключением этой второй конечной точки, проверяются правильно. Есть ли какой-либо особый случай, который мне нужно учитывать при проверке перенаправлений, подобных этому?
Я использую laravel, если это имеет значение.
[Правка1]
Твимл выглядит так
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Say></Say>
<Redirect>https://example.com/webhook/call/handle-incoming-call?Enqueue=1</Redirect>
</Response>
После перенаправления на этот URL-адрес запрос возвращает ошибку 403.
Для проверки я использую следующий код в промежуточном программном обеспечении для маршрутов в laravel.
<?php
namespace AppHttpMiddleware;
use Closure;
use IlluminateHttpResponse;
use TwilioSecurityRequestValidator;
class TwilioRequestValidator
{
/**
* Handle an incoming request.
*
* @param IlluminateHttpRequest $request
* @param Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
// Be sure TWILIO_TOKEN is set in your .env file.
// You can get your authentication token in your twilio console https://www.twilio.com/console
$requestValidator = new RequestValidator(env('TWILIO_TOKEN'));
$requestData = $request->toArray();
// Switch to the body content if this is a JSON request.
if (array_key_exists('bodySHA256', $requestData)) {
$requestData = $request->getContent();
}
$isValid = false;
if ($request->hasHeader('X-Twilio-Signature')) {
$isValid = $requestValidator->validate(
$request->header('X-Twilio-Signature'),
$request->fullUrl(),
$requestData
);
}
if ($isValid) {
return $next($request);
} else {
return new Response('Invalid Request', 403);
}
}
}
Спасибо.
Комментарии:
1. Не могли бы вы рассказать подробнее? Как выглядит код, возвращающий перенаправление? Как вы проверяете веб-крючки на этих двух конечных точках?
2. Я обновил вопрос дополнительной информацией
3. При вызове
$request->toArray()
это просто возвращает параметры в теле запроса или также включает параметры строки запроса? (Извините, я не разработчик Laravel.) Если он содержит параметры строки запроса, то именно поэтому это неправильно, и вы должны попытаться получить только параметры тела запроса после отправки (возможноrequest->request->all()
?).4. Да, в этом и была проблема, мне пришлось использовать $request->post() вместо метода toArrray. Спасибо за указатель
Ответ №1:
Евангелист-разработчик Twilio здесь.
Вместо того, чтобы использовать request->toArray()
which возвращает все параметры, вам просто нужны параметры тела. Параметры строки запроса уже рассмотрены в разделе request->fullUrl()
.
Вместо этого попробуйте request->post()
получить данные POST.