我想为我的Laravel应用程序设置一个webhook.我创建了一个webhook,它会在明信片创建和更新事件中触发,但我总是收到错误代码419或405.此外,我的Laravel日志(log)没有显示任何传入的webhook请求,这表明我的URL从未被调用.这意味着我的系统没有捕获负载或处理webhook事件.
你能帮我解决这个问题吗?
我想为我的Laravel应用程序设置一个webhook.我创建了一个webhook,它会在明信片创建和更新事件中触发,但我总是收到错误代码419或405.此外,我的Laravel日志(log)没有显示任何传入的webhook请求,这表明我的URL从未被调用.这意味着我的系统没有捕获负载或处理webhook事件.
你能帮我解决这个问题吗?
错误405 - Method Not Allowed
表示您正在try 使用不支持的HTTP谓词对资源进行请求.
例如:postgrid可能试图创建一个POST请求到您的webhook端点,但是您的webhook端点只支持GET方法,所以您需要查看postgrid的文档并查看正确的HTTP动词用于您的webhook端点.
关于错误419 - Page Expired
,这个错误通常发生在Laravel中,因为缺少CSRF令牌而没有与请求一起发送,所以这里需要做的是从CSRF判断中排除webhook端点.
这取决于你的Laravel版本:
Laravel 11.x:打开bootstrap/app.php
文件并在withMiddleware()
方法的回调中调用validateCsrfTokens()
方法.此方法接受一个字符串数组,其中每个字符串代表一个路由.这些路由将被排除在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 (and older):在app/Http/Middleware
目录中有一个VerifyCsrfToken
中间件.这个中间件有一个$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'
];
}
Update:实际上,有一个更简单的解决方案:如果你在routes/api.php
文件中定义了webhook端点的路由,那么你就不必手动配置任何与CSRF相关的内容,因为API路由没有这种类型的判断.