我想为我的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路由没有这种类型的判断.

Php相关问答推荐

在PHP中替换数组中的文本并同时使用其他函数

如何修复条带元素中的错误&&客户端_机密&

如何修复警告:当使用WordPress get_the_Terms()时,Foreach()参数必须是ARRAY|OBJECT类型?

在PHP中读取JSON

将数组推送到数组时,数组推送()出现问题

WooCommerce在购买后多次重定向

使用随机生成器在MYSQL中创建唯一ID-定义一个数组来存储已知ID是否安全

在WooCommerce管理中为订单项目添加自定义字段价格值

重命名 WordPress 中现有的自定义分类法名称和标签

如何将不同的 Woocommerce 费用合并为一个名称?

从 XAMPP 运行 shell 脚本时,意外标记(附近出现语法错误

根据小计向 WooCommerce Checkout 添加佣金

在 php 中生成 MAC ISO/IEC 9797-1

同时执行odbc_execute、odbc_fetch_row和odbc_result

使用 Process facade 在外部 Laravel 项目上运行 Artisan 命令会返回主项目的数据库错误

计算组合指数

Laravel 10 单元测试看不到来自 Artisan Command 的数据库更改

使用 PHP ImageMagick 库将 pdf 文件的前 n 页转换为单个 png 图像文件

使用 v-for 的存储链接中的 Img src 在 Laravel vuejs 中不起作用

在管理表单字段中