Warning: session_start(): Session cannot be started after headers have already been sent in /home/tvrreohg/public_html/manga.php on line 13
 Plan::where('is_active', true)->orderBy('sort_order')->get(), 'subscriptions' => $request->user()->subscriptions()->with('plan')->latest()->get(), 'payments' => $request->user()->payments()->with('plan')->latest()->take(20)->get(), ]); } public function checkout(Request $request, Plan $plan) { abort_unless($plan->is_active, 404); if ($plan->amount_cents === 0) { Subscription::updateOrCreate( ['user_id' => $request->user()->id, 'plan_id' => $plan->id], [ 'status' => 'active', 'amount_cents' => 0, 'currency' => $plan->currency, 'starts_at' => now(), ] ); return back()->with('success', 'Your free package is active.'); } if (! config('services.stripe.secret')) { return back()->withErrors(['billing' => 'Stripe is not configured. Add STRIPE_SECRET to the environment.']); } try { $stripe = new StripeClient(config('services.stripe.secret')); $user = $request->user(); if (! $user->stripe_customer_id) { $customer = $stripe->customers->create(['email' => $user->email, 'name' => $user->name]); $user->update(['stripe_customer_id' => $customer->id]); } $priceData = [ 'currency' => $plan->currency, 'unit_amount' => $plan->amount_cents, 'product_data' => ['name' => $plan->name, 'description' => $plan->description ?: 'URP CaseReady package'], ]; if ($plan->interval !== 'one_time') { $priceData['recurring'] = ['interval' => $plan->interval]; } $session = $stripe->checkout->sessions->create([ 'mode' => $plan->interval === 'one_time' ? 'payment' : 'subscription', 'customer' => $user->stripe_customer_id, 'line_items' => [['price_data' => $priceData, 'quantity' => 1]], 'client_reference_id' => (string) $user->id, 'metadata' => ['user_id' => $user->id, 'plan_id' => $plan->id], 'success_url' => route('billing.success').'?session_id={CHECKOUT_SESSION_ID}', 'cancel_url' => route('billing.index'), ]); Subscription::create([ 'user_id' => $user->id, 'plan_id' => $plan->id, 'stripe_checkout_session_id' => $session->id, 'status' => 'pending', 'amount_cents' => $plan->amount_cents, 'currency' => $plan->currency, ]); Payment::create([ 'user_id' => $user->id, 'plan_id' => $plan->id, 'stripe_checkout_session_id' => $session->id, 'amount_cents' => $plan->amount_cents, 'currency' => $plan->currency, 'status' => 'pending', 'description' => $plan->name, ]); return redirect()->away($session->url); } catch (Throwable) { return back()->withErrors(['billing' => 'Unable to begin checkout. Please verify the Stripe configuration.']); } } public function success(Request $request) { $sessionId = $request->string('session_id')->toString(); abort_if(! $sessionId, 404); try { $session = (new StripeClient(config('services.stripe.secret')))->checkout->sessions->retrieve($sessionId); abort_unless((int) $session->client_reference_id === $request->user()->id, 403); $subscription = Subscription::where('stripe_checkout_session_id', $sessionId)->first(); $subscription?->update([ 'stripe_subscription_id' => is_string($session->subscription) ? $session->subscription : null, 'status' => $session->payment_status === 'paid' ? 'active' : $session->status, 'starts_at' => now(), ]); Payment::where('stripe_checkout_session_id', $sessionId)->update([ 'stripe_payment_intent_id' => is_string($session->payment_intent) ? $session->payment_intent : null, 'status' => $session->payment_status, 'paid_at' => $session->payment_status === 'paid' ? now() : null, 'subscription_id' => $subscription?->id, ]); } catch (Throwable) { return redirect()->route('billing.index')->withErrors(['billing' => 'Payment is processing. Refresh shortly to see the latest status.']); } return redirect()->route('billing.index')->with('success', 'Your package is active. Thank you.'); } }