value, PlanTier::Plus->value, PlanTier::Pro->value], true), 404); abort_unless(in_array($cadence, ['monthly', 'annual'], true), 404); $priceId = config("services.stripe.prices.{$tier}.{$cadence}"); abort_if(empty($priceId), 404, "No Stripe price configured for {$tier} {$cadence}"); return $request->user() ->newSubscription('default', $priceId) ->allowPromotionCodes() ->checkout([ 'success_url' => route('billing.success').'?session_id={CHECKOUT_SESSION_ID}', 'cancel_url' => route('billing.cancel'), ]); } /** Redirect the user to the Stripe-hosted Customer Billing Portal. */ public function portal(Request $request): Response|RedirectResponse { return $request->user()->redirectToBillingPortal(route('dashboard')); } public function success(): RedirectResponse { return redirect()->route('dashboard')->with('status', 'subscription_started'); } public function cancel(): RedirectResponse { return redirect()->route('dashboard')->with('status', 'subscription_cancelled'); } }