Laravel 6集成Transbank使用ngrok时关闭CSRF仍报419错误如何解决?
问题修复步骤
419页面过期错误本质是Laravel的CSRF令牌校验失败,或跨代理会话校验异常,按以下顺序排查修复即可:
1. 修正CSRF排除路径配置
你当前在VerifyCsrfToken中填写的排除路径是控制器方法路径,和实际路由URI不匹配,导致校验规则未生效,修改为如下配置:
class VerifyCsrfToken { use InteractsWithTime; protected $except = [ '/confirm_pay', '/started' ]; }
Laravel的CSRF排除规则匹配的是请求的URI地址,和控制器方法名无关,你之前填写的confirm_pay/confirmPay路径不存在,所以校验仍然生效。
2. 修复控制器变量名笔误
你的confirmPay方法存在变量名拼写错误,会导致支付成功后逻辑报错,修改如下:
public function confirmPay(Request $request){ $confirm = (new Transaction)->commit($request->get('token_ws')); // 原代码使用了未定义的$confirmacion变量,替换为实际定义的$confirm if($confirm->isApproved()){ return 'is Approved'; }else{ return 'is not Approved'; } }
3. 配置信任代理适配ngrok
ngrok属于反向代理,Laravel默认不信任非本地代理请求,会导致会话校验异常,修改app/Http/Middleware/TrustProxies.php文件:
protected $proxies = '*';
开发环境可以直接配置*信任所有代理,生产环境请替换为实际的代理IP段。
4. 调整会话配置匹配ngrok域名
修改项目根目录.env文件,适配ngrok的访问地址:
APP_URL=https://你的ngrok域名.ngrok.io SESSION_DOMAIN=你的ngrok域名.ngrok.io SESSION_SECURE_COOKIE=true
修改后执行php artisan config:clear清除配置缓存后重启服务即可。
可选优化
Transbank的支付回调同时支持GET和POST请求,你可以直接将confirm_pay路由改为GET类型,彻底绕开CSRF校验:
Route::get('/confirm_pay', 'WebPayPlussController@confirmPay')->name('front');
内容的提问来源于stack exchange,提问作者Nautilus
相关产品推荐
相关产品推荐

