2026-01-05 23:51:50 +01:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
|
|
|
|
|
|
use Illuminate\Http\RedirectResponse;
|
|
|
|
|
use Illuminate\Http\Request;
|
2026-01-06 20:59:16 +01:00
|
|
|
use Laravel\Cashier\Cashier;
|
|
|
|
|
use Symfony\Component\HttpFoundation\Response;
|
2026-01-05 23:51:50 +01:00
|
|
|
|
|
|
|
|
class SubscriptionController extends Controller
|
|
|
|
|
{
|
2026-01-06 20:59:16 +01:00
|
|
|
public function checkout(Request $request)
|
2026-01-05 23:51:50 +01:00
|
|
|
{
|
|
|
|
|
$planner = $request->user();
|
|
|
|
|
|
2026-01-06 20:59:16 +01:00
|
|
|
if ($planner->subscribed()) {
|
2026-01-05 23:51:50 +01:00
|
|
|
return redirect()->route('dashboard');
|
|
|
|
|
}
|
|
|
|
|
|
2026-01-06 20:59:16 +01:00
|
|
|
$plan = $request->input('plan', 'monthly');
|
|
|
|
|
$priceId = $plan === 'yearly'
|
|
|
|
|
? env('STRIPE_PRICE_YEARLY')
|
|
|
|
|
: env('STRIPE_PRICE_MONTHLY');
|
|
|
|
|
|
|
|
|
|
return $planner->newSubscription('default', $priceId)
|
|
|
|
|
->checkout([
|
|
|
|
|
'success_url' => route('subscription.success') . '?session_id={CHECKOUT_SESSION_ID}',
|
|
|
|
|
'cancel_url' => route('subscription.index'),
|
|
|
|
|
]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function success(Request $request): RedirectResponse
|
|
|
|
|
{
|
|
|
|
|
$sessionId = $request->query('session_id');
|
|
|
|
|
|
|
|
|
|
if ($sessionId) {
|
|
|
|
|
$planner = $request->user();
|
|
|
|
|
$session = Cashier::stripe()->checkout->sessions->retrieve($sessionId, [
|
|
|
|
|
'expand' => ['subscription'],
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
if ($session->subscription && ! $planner->subscribed()) {
|
|
|
|
|
$subscription = $session->subscription;
|
|
|
|
|
|
|
|
|
|
$planner->subscriptions()->create([
|
|
|
|
|
'type' => 'default',
|
|
|
|
|
'stripe_id' => $subscription->id,
|
|
|
|
|
'stripe_status' => $subscription->status,
|
|
|
|
|
'stripe_price' => $subscription->items->data[0]->price->id ?? null,
|
|
|
|
|
'quantity' => $subscription->items->data[0]->quantity ?? 1,
|
|
|
|
|
'trial_ends_at' => $subscription->trial_end ? now()->setTimestamp($subscription->trial_end) : null,
|
|
|
|
|
'ends_at' => null,
|
|
|
|
|
]);
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-01-05 23:51:50 +01:00
|
|
|
|
|
|
|
|
return redirect()->route('dashboard')->with('success', 'Subscription activated!');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function cancel(Request $request): RedirectResponse
|
|
|
|
|
{
|
2026-01-06 20:59:16 +01:00
|
|
|
$planner = $request->user();
|
2026-01-05 23:51:50 +01:00
|
|
|
|
2026-01-06 20:59:16 +01:00
|
|
|
if (! $planner->subscribed()) {
|
2026-01-05 23:51:50 +01:00
|
|
|
return back()->with('error', 'No active subscription found.');
|
|
|
|
|
}
|
|
|
|
|
|
2026-01-06 20:59:16 +01:00
|
|
|
$planner->subscription()->cancel();
|
2026-01-05 23:51:50 +01:00
|
|
|
|
|
|
|
|
return back()->with('success', 'Subscription canceled. Access will continue until the end of your billing period.');
|
|
|
|
|
}
|
|
|
|
|
}
|