Laravel API+Next.js SPA支付回调重定向后会话过期问题求助
解决Laravel Sanctum SPA支付回调后会话过期问题
需要修改的.env配置项
针对本地环境,调整以下关键配置即可修复会话丢失问题:
- 更新SANCTUM_STATEFUL_DOMAINS:添加API域名,确保跨子域场景下会话能被正确识别
SANCTUM_STATEFUL_DOMAINS=mysite.local,api.mysite.local,.mysite.local - 新增SESSION_SAME_SITE:设置为
lax,允许跨子域重定向时携带会话CookieSESSION_SAME_SITE=lax - 明确SESSION_SECURE:本地HTTP环境下设为
false,避免浏览器拒绝非HTTPS环境的CookieSESSION_SECURE=false
其余原有配置保持不变:
APP_URL=http://api.mysite.local SESSION_DRIVER=file SESSION_LIFETIME=120 SESSION_DOMAIN=.mysite.local SPA_URL=http://mysite.local
核心问题根源与额外代码调整
问题本质是支付回调路由在web.php中,而web中间件组默认包含StartSession。第三方支付网关的回调请求不带用户会话Cookie,Laravel会自动创建空会话,重定向时这个空会话的Cookie会覆盖用户原有有效会话,导致登录状态丢失。
需配合调整路由中间件:
- 推荐方案:将回调路由移至
api.php,api中间件组默认不含会话相关中间件,不会触发新会话创建 - 备选方案(保留在
web.php):手动移除StartSession中间件Route::post('/payment/success', [PaymentController::class, 'success']) ->withoutMiddleware(['StartSession']) ->name('payment.success');
内容的提问来源于stack exchange,提问作者Joy Ram Sen Gupta
相关产品推荐
相关产品推荐

