HEX
Server: Apache/2.4.58 (Ubuntu)
System: Linux ip-172-26-0-120 6.17.0-1009-aws #9~24.04.2-Ubuntu SMP Fri Mar 6 23:50:29 UTC 2026 x86_64
User: ubuntu (1000)
PHP: 8.3.6
Disabled: NONE
Upload Files
File: /var/www/html/owlcrm/app/Http/Controllers/SubscriptionPlanController.php
<?php

namespace App\Http\Controllers;

use App\Models\Payment;
use Razorpay\Api\Api;
use Illuminate\Support\Facades\Log;
use App\Models\SubscriptionPlan;
use App\Models\UserSubscription;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Cookie;

class SubscriptionPlanController extends Controller
{
    public $userId = '';
    public $orderId = '';
    public $amount = '';
    public $status = '';
    public $razorpaySignature = '';
    public $subscriptionPlanId = '';
    public $razorpayPaymentId = '';
    public $subscription = '';
    public $paymentEntity = '';
    public $subscriptionPlanPeriod = '';
    public $subscriptionId ='';
    public $endTime = '';

    public function buy_subscription_plan($id)
    {
        try {
            $plan = SubscriptionPlan::where('subscription_plan_id', $id)->first();
            if (!$plan) {
                return response()->json(['error' => 'Invalid plan selected.'], 400);
            }
    
            $razorpayKeyId = env('RAZORPAY_KEY_ID');
            $razorpayKeySecret = env('RAZORPAY_KEY_SECRET');
            $api = new Api($razorpayKeyId, $razorpayKeySecret);
    
            $subscription = $api->subscription->create([
                'plan_id' => $id,
                'total_count' => 12,
                'notes' => [
                    'name' => auth()->user()->first_name,
                    'email' => auth()->user()->email,
                    'id' => auth()->user()->id,
                    'planAmount' => $plan->price


                ],
            ]);
            if ($subscription) {
                return redirect()->away($subscription->short_url);
            }
        } catch (\Exception $e) {
            Log::error('Subscription Plan Error', ['message' => $e->getMessage()]);
            return response()->json(['error' => 'Unable to process subscription. Please try again later.'], 500);
        }
    }
    public function paymentCallback(Request $request)
    {
        // dd(Auth::check());
        $paymentData = $request->all();
        $razorpayKeyId = env('RAZORPAY_KEY_ID');
        $razorpayKeySecret = env('RAZORPAY_KEY_SECRET');
        $api = new Api($razorpayKeyId, $razorpayKeySecret);
    
        try {
            $attributes = [
                'razorpay_order_id' => $paymentData['razorpay_order_id'],
                'razorpay_payment_id' => $paymentData['razorpay_payment_id'],
                'razorpay_signature' => $paymentData['razorpay_signature'],
            ];
    
            $api->utility->verifyPaymentSignature($attributes);
    
            $payment = Payment::where('razorpay_payment_link_id', $paymentData['razorpay_order_id'])->firstOrFail();
            $payment->status = 'completed';
            $payment->save();
    
            $userSubscription = new UserSubscription;
            $userSubscription->user_id = $payment->user_id;
            $userSubscription->subscription_plan_id = $payment->subscription_plan_id;
            $userSubscription->start_date = now();
            $userSubscription->end_date = now()->addMonths($payment->subscription_plan->duration);
            $userSubscription->status = 'active';
            $userSubscription->save();
    
            return response()->json(['message' => 'Payment verified successfully']);
        } catch (\Exception $e) {
            Log::error('Payment Callback Error', ['message' => $e->getMessage()]);
            return response()->json(['error' => 'Payment verification failed'], 400);
        }
    }
 public function handleWebhook(Request $request)
    {
        $input = $request->all();
        Log::info('Webhook Payload:', $input); // Logs payload for debugging
        // dd($input);
        return $this->handleEvent($input);
    }
    /**
     * Handle the Razorpay subscription event
     */

    private function handleEvent(array $input)
 { 
     Log::info('Webhook event key missing', ['payload' => $input]); 
 
    $this->subscriptionPlanId = $input['payload']['subscription']['entity']['plan_id'] ?? '';
    $this->status = $input['payload']['subscription']['entity']['status'] ?? '';
    $this->subscriptionId = $input['payload']['subscription']['entity']['id'] ?? '';
    $this->amount = $input['payload']['subscription']['entity']['notes']['planAmount'] ?? '';
    $this->userId = $input['payload']['subscription']['entity']['notes']['id'] ?? '';
    $this->razorpayPaymentId = $input['subscription']['payment']['entity']['id'] ?? '';
    $this->orderId = $input['subscription']['payment']['entity']['order_id'] ?? '';
    $this->endTime = $input['subscription']['subscription']['entity']['end_at'] ?? '';
    if ($this->endTime) {
        $this->endTime = Carbon::createFromTimestamp($this->endTime)->toDateTimeString();
    }
    switch ($input['event']) {
        case 'subscription.paused':
            return $this->handleSubscriptionPaused($input); //
        case 'subscription.activated':
            return $this->handleSubscriptionActivated($input);//
        case 'subscription.cancelled':
            return $this->handleSubscriptionCancelled($input); //
        case 'subscription.updated':
            return $this->handleSubscriptionUpdated($input); //
        default:
            Log::info('Unrecognized Razorpay Event', ['event' => $input['event']]);
            return response()->json(['message' => 'Event not recognized']);
    }
 }

    /**
     * Handle subscription authenticated event
     */

    /**
     * Handle subscription paused event
     */
    private function handleSubscriptionPaused(array $input)
    {
        Log::info('Subscription Paused', ['subscription' => $input['payload']]);
         // Extract the subscription ID from the payload
         $subscription = UserSubscription::where('subscription_id', $this->subscriptionId)->first();
         if ($subscription) {
            // Update the subscription status to 'Paused'
            $subscription->status = UserSubscription::Paused;
            $subscription->cancelled_at = now();
            $subscription->save();
    
            return response()->json(['message' => 'Subscription cancellation handled successfully']);
        } 
        return response()->json(['message' => 'Subscription paused handled']);
    }

    /**
     * Handle subscription activated event
     */
    private function handleSubscriptionActivated(array $input)
    {
        Log::info('Subscription Activated', ['subscription' => $input['payload']]);
        Log::info('End Time Value', ['endTime' => $this->endTime]);
        $this->findOrCreate($input);
        try {
            $userSubscription = new UserSubscription;
            $userSubscription->user_id = $this->userId;
            $userSubscription->subscription_plan_id = $this->subscriptionPlanId;
            $userSubscription->start_date = now();
            $userSubscription->end_date = !empty($this->endTime) ? $this->endTime : now()->addMonths(1);
            $userSubscription->status =  UserSubscription::Active;// Set the status to active
            $userSubscription->subscription_id = $this->subscriptionId;
            $userSubscription->save();

            Log::info('User subscription Completed', ['subscription' => $userSubscription]);
            return $userSubscription;
        } catch (\Exception $e) {
            Log::error('Failed to create user subscription', ['error' => $e->getMessage()]);
            throw new \Exception("Failed to create user subscription");
        }
       
        // Add your logic here (e.g., update status to active, start service, etc.)
        return response()->json(['message' => 'Subscription activated handled']);
    }

    /**
     * Handle subscription cancelled event
     */
    private function handleSubscriptionCancelled(array $input)
    {
        Log::info('Subscription Cancelled', ['subscription' => $input['payload']]);
         // Extract the subscription ID from the payload
         $subscription = UserSubscription::where('subscription_id', $this->subscriptionId)->first();
         if ($subscription) {
            // Update the subscription status to 'cancelled'
            $subscription->status = UserSubscription::Cancel;
            $subscription->save();
    
            return response()->json(['message' => 'Subscription cancellation handled successfully']);
        }
        return response()->json(['message' => 'Subscription cancelled handled']);
    }

    /**
     * Handle subscription updated event
     */
    private function handleSubscriptionUpdated(array $input)
    {
        Log::info('Subscription Updated', ['subscription' => $input['payload']]);
        // Add your logic here (e.g., update subscription details, notify user, etc.)
        return response()->json(['message' => 'Subscription updated handled']);
    }

    private function findOrCreate()
    {
        // Save the payment details to the database
        $payment = Payment::firstOrCreate(
            [
                'user_id' => $this->userId,
                'subscription_plan_id' => $this->subscriptionPlanId,
                'razorpay_payment_id' => $this->razorpayPaymentId,
                'razorpay_order_id' => $this->orderId,
                'razorpay_signature' => $this->orderId,
                'amount' => $this->amount,
                'status' => $this->status,
            ]
        );
        Log::info('Payment record saved or updated', ['payment' => $payment]);
    
        return response()->json(['message' => 'Payment verified successfully and subscription created']);
    }
}