Laravel возвращает пустой HTTP-ответ
Поэтому я настраиваю webhook с помощью API Xero, и он ожидает пустой ответ без файлов cookie, gzip и т. Д. Я не могу понять, как отправить полностью пустой ответ.
Вот пример моего ответа от ngrok:
HTTP/1.1 401 Unauthorized
Server: nginx/1.13.3
Date: Wed, 12 Dec 2018 02:11:07 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
0
Вот код, который выполняет HTTP-ответ:
http_response_code(401);
exit;
Я также попробовал это:
return response(null, 401);
Но в панели настройки webhook он показывает мне эту ошибку:
Intent To Receive required
Last attempt at 2018-12-12 02:15:57 UTC
Failed to respond in timely manner
Несмотря на то, что время отклика составляет <0,5 с. Я отправил кучу экранных записей в Xero, но похоже, что их поддержка будет работать.
1 ответ
Как говорится в сообщении об ошибке, кажется, что в вашем коде вы не можете ответить вовремя (5 с). сослаться на это Не удалось своевременно ответить на вопрос. Я также сталкивался с этой проблемой при разработке интеграции Xero с использованием laravel. удалось решить эту проблему с помощью очередей, если хэш-совпадения отправляют событие Xero в задание, в противном случае возвращают 400. Поскольку событие обрабатывается в очереди, оно своевременно возвращает ответ.
use App\Jobs\XeroWebhook;
public function getUpdatedInvoiceInXero(Request $request)
{
$paylod = file_get_contents('php://input');
$events = json_decode($request->getContent())->events;
$XeroWebhookKey= "your_webhook_key";
$Hash = base64_encode(hash_hmac('sha256', $paylod, $XeroWebhookKey, true));
if ($Hash === $_SERVER['HTTP_X_XERO_SIGNATURE']) {
XeroWebhook::dispatch($events);
} else {
return response(null, 401);
}
}
Как вы можете видеть здесь, я проверяю только совпадение хешей, я включил другие функции в задание под названием "XeroWebhook". Laravel queues
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
class XeroWebhook implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $events;
public function __construct($events, $tenantId)
{
$this->events = $events;
}
public function handle()
{
// rest of the code
}
}