新闻中心

解决 Lar*el 与 Mollie Webhook 集成失效问题

2025-11-16
浏览次数:
返回列表

解决 laravel 与 mollie webhook 集成失效问题

本文旨在解决 Lar*el 应用中 Mollie Webhook 不工作的问题。核心原因是 Lar*el 默认的 CSRF 保护机制会阻止外部 POST 请求,包括 Mollie 的 webhook 调用。教程将详细指导如何通过在 `VerifyCsrfToken` 中间件的 `$except` 数组中添加 webhook URL 来豁免 CSRF 保护,并提供相关代码示例及生产环境下的安全最佳实践。

理解 Webhook 与 Lar*el CSRF 保护

Webhook 是一种通过 HTTP 回调机制实现应用间实时通信的方式。在支付场景中,如 Mollie 支付网关,当交易状态发生变化(例如支付成功)时,Mollie 会向预设的 webhookUrl 发送一个 HTTP POST 请求,通知您的 Lar*el 应用进行后续处理,如更新订单状态、生成发票等。

Lar*el 框架为了防止跨站请求伪造(CSRF)攻击,默认对所有 POST、PUT、PATCH 和 DELETE HTTP 请求实施 CSRF 保护。这意味着,除非请求包含有效的 CSRF token,否则这些请求将被拒绝。然而,Mollie 等第三方服务发送的 webhook 请求不会携带 Lar*el 生成的 CSRF token,因此会被 Lar*el 的 CSRF 保护机制错误地拦截,导致 webhook 处理器无法被调用,且通常不会抛出明确的错误信息。

Mollie 支付集成中的 Webhook 设置

在 Lar*el 应用中集成 Mollie 支付时,通常会在创建支付请求时指定 webhookUrl。例如:

use Mollie\Lar*el\Facades\Mollie;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Auth;

public function order()
{
    $user = Auth::user();
    $payment = Mollie::api()->payments()->create([
        'amount' => [
            'currency' => 'EUR',
            'value' => number_format($this->service->price, 2, '.', '')
        ],
        'description' => 'Order #' . Str::random(6),
        'redirectUrl' => route('service.order.callback'),
        'webhookUrl' => route('service.order.webhook'), // 关键:指定 webhook URL
        'metadata' => [
            'user' => [
                'id' => $user->id,
                'name' => $user->name,
            ],
            'invoice' => [
                'id' => 0
            ]
        ]
    ]);

    return $this->redirect($payment->getCheckoutUrl(), 303);
}

对应的 webhook 路由定义在 web.php 中,通常是一个 POST 请求:

use App\Http\Controllers\Payment\Invoice;

Route::post('/service/order/webhook', [Invoice::class, 'webhook'])->name('service.order.webhook');

而 Invoice 控制器中的 webhook 方法,负责处理 Mollie 发送的回调:

use App\Models\Payment\Invoice as InvoiceModel;
use Carbon\Carbon;

public function webhook()
{
    // 此时 Mollie 的数据应通过请求体传入,这里仅为示例
    // 实际应用中需要从请求中获取 Mollie Payment ID,并使用 Mollie API 验证支付状态
    $invoiceUser = InvoiceModel::create([
        'status' => 'paid',
        'number' => '1',
        'date' => Carbon::now(),
        'billing_detail_id' => 1,
        'payment_id' => 1 // 实际应为 Mollie 支付 ID
    ]);

    // 重要的是,此方法需要被成功调用
}

当上述 webhook 方法未被调用时,通常意味着请求在到达控制器之前就被拦截了。

解决方案:豁免 Webhook URL 的 CSRF 保护

解决 Mollie Webhook 不工作问题的关键在于,将您的 webhook URL 添加到 Lar*el CSRF 保护的例外列表中。这通过修改 app/Http/Middleware/VerifyCsrfToken.php 文件来实现。

  1. 打开 app/Http/Middleware/VerifyCsrfToken.php 文件。
  2. 找到 $except 属性。 这是一个受保护的数组,用于存放不需要 CSRF 验证的 URI。
  3. 将您的 webhook URL 添加到 $except 数组中。 请确保使用与路由定义中完全匹配的 URI 路径。
<?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 = [
        // ... 其他可能已有的例外
        '/service/order/webhook', // 添加您的 Mollie Webhook URL
    ];
}

完成此修改后,当 Mollie 向 /service/order/webhook 发送 POST 请求时,Lar*el 将不再对其进行 CSRF token 验证,从而允许请求正常到达您的 Invoice 控制器中的 webhook 方法。

Zyro AI Background Remover Zyro AI Background Remover

Zyro推出的AI图片背景移除工具

Zyro AI Background Remover 145 查看详情 Zyro AI Background Remover

生产环境下的安全最佳实践

虽然豁免 CSRF 保护解决了 webhook 调用问题,但在生产环境中,还需要考虑额外的安全措施:

  1. 验证 Webhook 签名: Mollie 等许多支付服务会在 webhook 请求中包含一个签名或哈希值。您的应用应该使用 Mollie 提供的密钥来验证这个签名,以确保请求确实来自 Mollie,而不是恶意第三方。这可以防止伪造的 webhook 请求。

    • Mollie 通常会在请求头中提供签名,您可以使用 Mollie PHP SDK 或手动计算并比对。
  2. 幂等性处理: Webhook 请求可能会因为网络问题或其他原因被重复发送。您的 webhook 处理器应该设计成幂等性的,即多次处理同一个 webhook 请求不会导致重复的副作用(例如,不会多次扣款或创建多张发票)。通常,这可以通过存储已处理的 Mollie Payment ID 并检查其是否已存在来实现。

  3. 异步处理 Webhook: Webhook 处理逻辑可能涉及数据库操作、外部 API 调用等耗时任务。为了避免 Mollie 服务器因等待响应超时而重试发送 webhook,建议将 webhook 的实际处理逻辑放入队列中异步执行。您的 webhook 处理器可以快速地接收请求、验证签名,然后将任务推送到队列中,并立即返回一个 200 OK 响应。

  4. 详细日志记录: 记录所有接收到的 webhook 请求的详细信息,包括请求头、请求体、处理结果等。这对于调试和审计至关重要。

  5. 限流与监控: 监控 webhook 端点的访问情况,并考虑实施限流策略,以防止潜在的拒绝服务攻击。

总结

在 Lar*el 中集成 Mollie Webhook 时,最常见的“不工作”问题源于 Lar*el 默认的 CSRF 保护机制。通过在 VerifyCsrfToken 中间件的 $except 数组中添加 webhook URL,可以有效地解决这一问题。同时,为了确保生产环境下的安全性和稳定性,务必结合验证 webhook 签名、实现幂等性、采用异步处理以及详细日志记录等最佳实践。遵循这些指导原则,将确保您的 Lar*el 应用能够可靠且安全地处理来自 Mollie 的支付通知。

以上就是解决 Lar*el 与 Mollie Webhook 集成失效问题的详细内容,更多请关注php中文网其它相关文章!


# laravel  # php  # 您的  # red  # 网络问题  # 路由  # ai  # app  # cad  # 处理器  # 网站营销推广公司怎么做  # 亳州非遗网站建设  # 花卉产业网站建设  # 亳州企业网站推广多少钱  # 网站推广 是干什么  # 关键词外推排名优化方法  # 营销与推广方案设计  # 新河网站优化推广  # 胶州 机械 网站建设  # 青羊区集团网站建设运营  # 的是  # 键值  # 回调  # 这可  # 来实现  # 第三方  # 组中  # 多维  # 会在 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: J*a实现学校排课程序_面向对象结构化项目示例  Excel中VLOOKUP的第四个参数是干什么用的_Excel VLOOKUP第四参数作用解析  Spring Boot嵌入式服务器与J*a EE:功能支持深度解析  qq游戏网页版直接玩_qq游戏免下载快速入口  写好的html代码怎么运行出来_运行写好的html代码方法【教程】  小猿搜题在线学习页面在哪_小猿搜题在线学习中心入口  C++如何操作大型数据集_使用C++流式处理(Streaming)技术避免一次性加载大文件  MAC怎么在地图App里使用“四处看看”_MAC体验部分城市的3D实景街景  如何使用Go和Martini动态服务解码后的图片  Spyder启动失败:字体文件权限拒绝错误解决方案  CSS子选择器:如何区分并样式化嵌套列表的子层级  sublime怎么设置启动时打开的窗口_sublime会话管理与热退出  Win11怎么查看显卡显存 Win11显示适配器属性及专用视频内存查询  漫画星球免费下拉式入口 漫画星球免费漫画在线阅读网站  微博网页版主页入口 微博官方网站免登录访问  Lar*el 递归关系中排除指定分支的教程  腾讯视频怎么举报不良内容_腾讯视频内容举报流程与违规信息处理方法  Golang如何通过reflect操作map_Golang reflect map操作与遍历技巧  c++项目目录结构应该如何组织_c++工程化项目结构规范  必由学官方平台入口 必由学在线课堂登录地址  126邮箱网页版官方入口 126邮箱账号在线登录平台  Centos/Linux 系统下安装 composer 的完整步骤  支付宝碰一碰设备是REDMI手机吗 博主拆机辟谣:处理器、内存都不一样  微信聊天记录怎么加密_微信聊天记录加密方法  QQ邮箱官网登录入口 QQ邮箱网页版邮箱快速登录  R星幕后开发视频泄露 包含《GTA6》等多款大作  windows10怎么查看本机ip_windows10命令提示符ipconfig使用  AO3访问入口汇总 AO3网页版同人作品一键直达  Fabric模组开发:自定义物品与物品组的现代管理方法  将HTML Canvas内容转换为可上传的图像文件(File对象)  Mudbox图层蒙版怎么用_Mudbox图层蒙版数字雕刻应用技巧  QQ邮箱登录官网首页 腾讯QQ邮箱网页入口  C++的std::forward_list怎么用_C++ STL中单向链表容器的特点与应用  Win10如何清理注册表垃圾 Win10手动清理无效注册表【技巧】  整合Supabase认证与Django模型:跨模式迁移的解决方案  Lar*el Excel导入时生成自定义递增ID的策略与实践  漫蛙漫画登录站点 漫蛙2正版漫画快速访问  vivo手机互传视频怎么操作_vivo手机互传视频详细传输方法  iwriter统一登录平台 iwrite账号密码登录页面  《刺客信条:影》PS5 Pro和Switch 2画面对比  12306几点到几点不能订票? | 官方最新系统维护时间全解析  AO3最新镜像入口 Archive of Our Own官方平台访问  百度网盘网页版入口 百度网盘网页版官方登录网址  免费抖音短视频入口_抖音网页版短视频免费通道  React/Next.js中实现列表项的动态选择与移动  Win10如何开启蓝牙功能_Windows10找不到蓝牙开关解决方法  Angular中父组件异步更新子组件复选框状态的实践指南  如何将一个大型PHP应用拆分为多个Composer包_微服务与模块化架构的Composer实践  Django表单提交验证失败后保持字段值不刷新  Win10怎么设置静态IP地址 Win10手动配置IP地址步骤【指南】 

搜索