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.');
}
}