如何强制买家用户完成Stripe支付后跳转至指定成功路由?
问题解决:买家Stripe支付后无法跳转至成功路由
问题背景
系统包含卖家(is_seller = 1)和买家(is_seller = 0)两类用户,集成Stripe实现余额充值功能。卖家支付流程正常,但买家完成支付后,直接跳转至买家仪表盘,无法进入Stripe成功路由完成余额更新、交易记录生成等后续逻辑。
问题根源
- 固定的成功路由地址:
StripeController的store方法中,successUrl硬编码为卖家路由user.deposit.stripe.success,该路由受SellerMiddleware保护,买家访问会被直接拦截跳转至买家仪表盘。 - 买家路由语法错误:
buyerRoute.php中成功路由的方法名存在空格(' success'),导致路由无法正常匹配。 - 缺失关键元数据:Stripe会话的
metadata未传递currency_id,导致成功路由中无法正确获取货币信息。
解决方案
1. 修复买家路由的语法错误
打开buyerRoute.php,移除success方法名前的空格:
Route::middleware('auth')->group(function () { Route::middleware(BuyerMiddleware::class)->group(function () { Route::post('/deposit/stripe-submit', [StripeController::class, 'store'])->name('buyer.deposit.stripe.submit'); // 移除方法名前的空格 Route::get('/deposit/stripe-submit', [StripeController::class,'success'])->name('buyer.deposit.stripe.success'); }); });
2. 根据用户类型动态生成成功路由
修改StripeController的store方法,根据当前用户身份生成对应身份的成功路由地址:
// 替换原有的$successUrl定义部分 $user = auth()->user(); // 根据用户类型选择对应的成功路由 if ($user->is_seller == 1) { $successUrl = route('user.deposit.stripe.success') . '?session_id={CHECKOUT_SESSION_ID}'; } else { $successUrl = route('buyer.deposit.stripe.success') . '?session_id={CHECKOUT_SESSION_ID}'; }
3. 补充Stripe会话的关键元数据
在store方法的Stripe会话创建代码中,添加currency_id到metadata:
$response = $this->stripe->checkout->sessions->create([ 'submit_type' => 'pay', 'locale' => 'auto', 'metadata' => [ 'user_id' => auth()->user()->id, 'deposit_number' => $item_number, 'currency_code' => $request->currency_code, 'currency_id' => $request->currency_id, // 新增:传递货币ID ], 'success_url' => $successUrl, // 其他参数保持不变 ]);
4. 修复成功路由中的货币信息获取
修改StripeController的success方法,从Stripe会话的metadata中获取currency_id:
public function success(Request $request) { $sessionId = $request->get('session_id'); $session = $this->stripe->checkout->sessions->retrieve($sessionId); // 新增:从metadata获取currency_id $request['currency_id'] = $session->metadata['currency_id']; $request['currency_sign'] = $session->metadata['currency_sign'] ?? ''; $request['currency_value'] = $session->metadata['currency_value'] ?? ''; $request['currency_code'] = $session->metadata['currency_code']; $request['deposit_number'] = $session->metadata['deposit_number']; // 后续逻辑保持不变 }
验证效果
完成上述修改后,买家发起支付后,Stripe回调将跳转至买家专属的成功路由,执行余额更新、交易记录生成、邮件通知等逻辑,最终跳转至买家充值页面并显示成功提示。
内容的提问来源于stack exchange,提问作者Nic D
相关产品推荐
相关产品推荐

