-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSubscriptionController.php
More file actions
63 lines (54 loc) · 1.86 KB
/
Copy pathSubscriptionController.php
File metadata and controls
63 lines (54 loc) · 1.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<?php
namespace App\Http\Controllers\User;
use App\Http\Controllers\Controller;
use App\Models\ClientSubscription;
use App\Models\Invoice;
use App\Models\Payment;
use App\Models\Service;
use App\Models\SubscriptionPlan;
use App\Services\EmailTemplateService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
/**
* Handles subscription plan listing, Stripe Checkout initiation,
* and post-payment activation for recurring subscription plans.
*
* Stripe Checkout flow:
* checkout() → Stripe-hosted page → success() → activate
*
* Dual-path activation: success redirect (primary) + webhook (fallback),
* both idempotent via transaction_ref guard on the Payment table.
*/
class SubscriptionController extends Controller
{
public function pricing()
{
// Load all active SubscriptionPlans grouped by ServiceCategory
// ...
}
public function checkout(Request $request)
{
$request->validate([
'plan_id' => 'required|exists:subscription_plans,id',
]);
$user = auth('user')->user();
$plan = SubscriptionPlan::with('service')->findOrFail($request->plan_id);
// Build Stripe Checkout Session with plan price, metadata, and redirect URLs
// Platinum / contact-only plans are rejected before reaching Stripe
// ...
}
public function success(Request $request)
{
$sessionId = $request->query('session_id');
// Retrieve session from Stripe API to confirm payment status
// Idempotency: skip if Payment already recorded for this session_id
// Activate linked Project + ClientSubscription → record Payment + Invoice
// Send 'subscription-activated' email via EmailTemplateService
// ...
}
public function cancel()
{
// Handle Stripe Checkout cancellation (user clicked "back")
// ...
}
}