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
    }
}
Другие вопросы по тегам