Laravel Cashier处理SCA卡IncompletePayment无需webhook执行业务逻辑问题
Laravel Cashier SCA跳转后业务逻辑处理方案
核心思路:SCA验证完成后的跳转链路完全可控,你可以直接在你指定的回跳路由bookingconfirmation中完成支付状态校验和后续数据写入,无需依赖webhook。
具体实现步骤
第一步:给回跳路由追加业务上下文参数
你当前触发SCA跳转时没有携带业务标识,验证完成后回跳会无法关联对应订单/业务数据。修改跳转逻辑的redirect参数,把需要的业务参数(比如订单ID)透传过去:if ($e instanceof \Laravel\Cashier\Exceptions\PaymentActionRequired) { // 示例追加order_id参数,你可以根据业务需要传其他必要标识 return redirect()->route('cashier.payment', [ $e->payment->id, 'redirect' => route('bookingconfirmation', ['order_id' => $yourOrderId]) ]); }敏感参数也可以先存入session,回跳后从session读取,避免暴露在URL中。
第二步:在
bookingconfirmation路由对应的控制器方法中完成支付校验和业务逻辑
Cashier处理完SCA验证后跳转到你指定的路由时,会自动携带payment_intent参数,你可以直接用这个参数查询支付状态,执行后续逻辑:use Illuminate\Http\Request; use Laravel\Cashier\Payment; public function bookingConfirmation(Request $request) { // 校验必要参数是否存在 if (!$request->has('payment_intent') || !$request->has('order_id')) { return redirect()->route('booking.pay')->with('error', '无效的支付请求'); } // 查询支付详情 $payment = Payment::find($request->input('payment_intent')); $order = Order::find($request->input('order_id')); // 防止重复处理 if ($order->status == 'paid') { return view('booking.confirmation', compact('order')); } // 支付成功则执行业务逻辑 if ($payment->isSucceeded()) { // 这里直接写你原来//continue后的业务逻辑,比如更新订单、写入额外数据 $order->update([ 'status' => 'paid', 'transaction_id' => $payment->id, 'paid_at' => now() ]); // 其他业务逻辑调用 return view('booking.confirmation', compact('order')); } // 支付失败处理 return redirect()->route('booking.pay')->with('error', '支付未完成,请重试'); }第三步:复用业务逻辑(可选)
你可以把非SCA支付和SCA回跳后都要执行的公共业务逻辑抽成独立方法,两边调用即可,避免代码重复。
注意事项
- 确保
bookingconfirmation路由配置了web中间件组,保证session和用户认证状态正常 - 支付状态校验必须走Stripe官方接口查询,不要信任URL中的其他参数判断支付结果
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

