Laravel中如何仅为单个POST路由禁用CSRF令牌?
解决Paytabs支付回调POST路由的CSRF令牌验证问题
问题场景
我在集成Paytabs支付网关API时遇到了个棘手的问题:交易完成后API会以POST请求跳转到我设置的回调URL,但原本的GET路由不支持POST请求,改成POST路由后又触发了TokenMismatchException in VerifyCsrfToken.php line 68错误——因为Paytabs的回调请求根本不会携带我们系统的CSRF令牌。我想知道能不能只给这一个POST路由禁用CSRF验证?
踩过的坑(已尝试方案)
我之前照着网上的建议修改了VerifyCsrfToken类,结果直接报Class 'Middleware' not found:
class VerifyCsrfToken extends Middleware { protected $except = [ 'signup/complete', ]; }
正确的解决步骤
这个错误其实是因为基类引用错了!在Laravel框架里,VerifyCsrfToken中间件的正确基类是Illuminate\Foundation\Http\Middleware\VerifyCsrfToken,而不是凭空的Middleware类。
你只需要把代码改成下面这样就可以了:
<?php namespace App\Http\Middleware; // 先引入正确的基类,并且可以给它起个别名方便使用 use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware; class VerifyCsrfToken extends Middleware { /** * 不需要验证CSRF令牌的URI列表 * * @var array<int, string> */ protected $except = [ 'signup/complete', // 这里替换成你的Paytabs回调路由路径 ]; }
几个关键注意点
- 路由路径要完全匹配:比如你的回调路由是
/paytabs/callback,就别写成paytabs/callback(少了斜杠),否则还是会触发验证 - 只加信任的路由:千万别把无关路由加到
$except里,这会带来安全风险,只放Paytabs的回调地址就好 - 如果用了路由前缀(比如
api/),记得把前缀也加上,比如api/paytabs/callback
内容的提问来源于stack exchange,提问作者nerdyDev
相关产品推荐
相关产品推荐

