我想为我的 Laravel 应用程序设置一个 Webhook。我创建了一个在明信片创建和更新事件上触发的 Webhook,但我始终收到错误代码 419 或 405。此外,我的 Laravel 日志不显示任何传入的 Webhook 请求,这表明我的 URL 从未被调用。这意味着我的系统没有捕获有效负载或处理 webhook 事件。
你能帮我解决这个问题吗?
错误
405 - Method Not Allowed
表示您正在尝试使用不受支持的 HTTP 动词向资源发出请求。
例如:postgrid 可能会尝试向您的 webhook 端点创建 POST 请求,但您的 webhook 端点仅支持 GET 方法,因此您需要检查 postgrid 的文档并查看与您的 webhook 端点一起使用的正确 HTTP 动词。
关于错误
419 - Page Expired
,此错误通常在 Laravel 中发生,因为缺少 CSRF 令牌而未与请求一起发送,因此您需要在此处执行的操作是将 webhook 端点从 CSRF 检查中排除。
执行此操作的方法取决于您的 Laravel 版本:
Laravel 11.x: 打开
bootstrap/app.php
文件并在 validateCsrfTokens()
方法的回调中调用 withMiddleware()
方法。此方法接受一个字符串数组,其中每个字符串代表一条路线。这些路由将被排除在 CSRF 检查之外,具体操作方法如下:
<?php
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__.'/../routes/web.php',
commands: __DIR__.'/../routes/console.php',
channels: __DIR__.'/../routes/channels.php',
health: '/up',
)
->withMiddleware(function (Middleware $middleware) {
$middleware->validateCsrfTokens(except: [
'you-webhook-endpoint/action-name'
]);
})->create();
Laravel 10.x(及更早版本):
VerifyCsrfToken
目录中有一个 app/Http/Middleware
中间件。该中间件有一个 $except
属性,您可以使用该属性指定将从 CSRF 检查中排除的端点:
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;
class VerifyCsrfToken extends Middleware
{
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array<int, string>
*/
protected $except = [
'you-webhook-endpoint/action-name'
];
}