Laravel 8.x支付网关回调后用户会话清空自动登出问题
问题分析与解决方案
1. 核心问题:回调请求不在用户会话上下文内
支付网关的POST回调是网关服务器主动发起的请求,而非用户浏览器发起的请求,所以这个请求不会携带用户浏览器中的会话Cookie——这不是会话被清空,而是回调请求本身就无法获取用户的原有会话状态,auth('organ')->check()自然返回false。
解决方法
发起支付时,将用户的organ认证ID(如auth('organ')->id())和订单标识一起传给支付网关,让网关在回调时把该ID回传。回调时通过回传的ID手动恢复用户认证状态:
public function callback(Request $request) { // 第一步:必须验证回调签名,确保请求来自合法支付网关 $organId = $request->input('organ_id'); // 假设网关回传该参数 $organ = \App\Models\Organ::find($organId); if ($organ) { auth('organ')->login($organ); } // 后续处理支付结果逻辑 dd(auth('organ')->check()); // 此时应返回true }
2. 会话Cookie SameSite配置问题
如果会话Cookie的SameSite设为Strict,用户跳转至支付网关后返回网站时,浏览器可能不会携带会话Cookie,导致前端显示用户退出登录。
修改config/session.php配置:
'same_site' => 'lax',
Lax模式允许跨站GET请求携带Cookie,用户从支付网关跳转回网站时能恢复原有会话。
3. 回调路由的中间件检查
确保回调路由包含web中间件组(web中间件默认包含会话处理逻辑):
Route::middleware('web')->post('/callback', [PaymentController::class, 'callback']);
若路由归属api中间件组,默认不会启用会话功能,也无法使用用户认证。
4. 会话存储驱动排查
如果使用文件存储驱动,检查storage/framework/sessions目录的读写权限;如果使用Redis等分布式驱动,确认服务连接正常。存储异常会导致会话无法持久化,表现为会话“被清空”。
内容的提问来源于stack exchange,提问作者Pooya Sabramooz
相关产品推荐
相关产品推荐

