getContent()); } public function handleWebhook(Request $request) { Log::info("webhook At line 1"); // Verify the webhook signature for security $secret = config('constants.subscription.webhook_secret'); // Your webhook secret key $payload = $request->getContent(); $sigHeader = $request->header('Stripe-Signature'); $event = null; try { $event = Event::constructFrom( json_decode($payload, true), $sigHeader, config('constants.subscription.webhook_secret') ); } catch (\UnexpectedValueException $e) { // Invalid payload return response()->json(['error' => 'Invalid payload'], 400); } catch (\Stripe\Exception\SignatureVerificationException $e) { // Signature verification failed return response()->json(['error' => 'Signature verification failed'], 400); } // $stripeSecret = config('services.stripe.key'); $stripeSecret = (config('constants.subscription.stripe_secret_key')); Log::info("webhook called"); $stripe = new \Stripe\StripeClient($stripeSecret); if ($event->type === 'checkout.session.completed') { try { DB::beginTransaction(); // Handle successful subscription payment // You can access event data like $event->data->object // Session::flush(); $session = $event->data->object; $metadata = $session->metadata; if ($metadata == null || empty($metadata)) { return response('Webhook Metadata received at null ', 200); } $userId = $metadata->userId; $userEmail = $metadata->userEmail; $subscriptionProductId = $metadata->subscriptionProductXid; $isReferralSubscription = $metadata->is_referral_subscription; $referralUserId = $metadata->referral_user_id; if ($isReferralSubscription == 1) { //who has refer the Subscription to Current user Log::info("Referral User Subscription Updating Function Starts"); $referralUserSubscriptionData = Subscriptions::where('iam_principal_xid', $referralUserId)->where('subscription_status', '=', 'active')->first(); // $stripe->subscriptions->update( // $referralUserSubscriptionData->subscription_id, // ['proration_behavior' => 'none'] // ); if ($referralUserSubscriptionData && $referralUserSubscriptionData->is_cancelled_subscription == 0) { //update subscription add 30 days trial period to this subscription $nextPaymentDate = $referralUserSubscriptionData->next_payment_date; // we are setting next payment date based on REFERRAL .. IF USER HAS NOT REFERRED YET.. then it will take next_payment_date //Otherwise IT need to take THE LAST REFERRED DATA // $userLastReferredDate = ReferralUsers::where('iam_principal_xid',$referralUserId)->last(); $userLastReferredDate = ReferralUsers::where('iam_principal_xid', $referralUserId) ->orderBy('referred_date_time', 'desc') ->first(); if ($userLastReferredDate && $userLastReferredDate->referred_date_time) { Log::info("trial date added for multiple time"); $date = new DateTime($userLastReferredDate->referred_date_time); } else { $date = new DateTime($nextPaymentDate); } // $date = new DateTime($nextPaymentDate); // $date->modify('+30 days'); $newDate = $date->format('Y-m-d H:i:s'); Log::info("new Date = "); Log::info($newDate); $timestampForReferralUser = $date->getTimestamp(); $updateSubscription = $stripe->subscriptions->update( $referralUserSubscriptionData->subscription_id, ['trial_end' => $timestampForReferralUser] ); $SubscriptionObject = $stripe->subscriptions->retrieve($referralUserSubscriptionData->subscription_id, []); $upcoming_invoice = $stripe->invoices->upcoming([ 'subscription' => $referralUserSubscriptionData->subscription_id, // use retrieved id from subscription ]); $referralUserSubscriptionData->current_period_start = date('Y-m-d H:i:s', $SubscriptionObject->current_period_start); $referralUserSubscriptionData->current_period_end = date('Y-m-d H:i:s', $SubscriptionObject->current_period_end); $referralUserSubscriptionData->next_payment_date = date('Y-m-d H:i:s', $upcoming_invoice->next_payment_attempt); $referralUserSubscriptionData->save(); Log::info("Referral User Subscription Updated with Referral"); //updated the Referral Users Subscription. } } $subscriptionProductData = SubscriptionProducts::where('id', $subscriptionProductId)->first(); //checkout store in db $subscriptionData = $stripe->checkout->sessions->retrieve($session->id, []); $SubscriptionObject = $stripe->subscriptions->retrieve($subscriptionData->subscription, []); //update proration behavior // $stripe->subscriptions->update( // $subscriptionData->subscription, // ['proration_behavior' => 'none'] // ); //update proration behavior $priceObject = $stripe->prices->retrieve($SubscriptionObject->plan->id, []); $amountSubtotalDollars = $subscriptionData->amount_total / 100; // Log::info('Subscription has been started '); $subscriptionObjectFromInvoice = $stripe->subscriptions->retrieve($subscriptionData->subscription, []); $upcoming_invoice = $stripe->invoices->upcoming([ 'subscription' => $subscriptionData->subscription, // use retrieved id from subscription ]); $id = Subscriptions::updateOrCreate( ['iam_principal_xid' => $userId, 'subscription_product_xid' => $subscriptionProductId], [ 'subscription_id' => $subscriptionData->subscription, 'amount' => $amountSubtotalDollars, 'stripe_customer_id' => $subscriptionData->customer, 'subscription_status' => $subscriptionObjectFromInvoice->status, 'current_period_start' => date('Y-m-d H:i:s', $SubscriptionObject->current_period_start), 'current_period_end' => date('Y-m-d H:i:s', $SubscriptionObject->current_period_end), 'status' => 'complete', 'next_payment_date' => date('Y-m-d H:i:s', $upcoming_invoice->next_payment_attempt) ] ); if ($isReferralSubscription == 1) { Log::info("new User Subscription Updating Function Starts"); //update Current User subscription to add 30 days additional to their subscription end $SubscriptionObject = $stripe->subscriptions->retrieve($subscriptionData->subscription, []); $newUserSubscriptionDetails = Subscriptions::where('iam_principal_xid', $userId) ->where('subscription_product_xid', $subscriptionProductId)->first(); $nextPaymentDate = $newUserSubscriptionDetails->next_payment_date; $date = new DateTime($nextPaymentDate); // $date->modify('+30 days'); $newDate = $date->format('Y-m-d H:i:s'); Log::info("new Date = "); Log::info($newDate); $timestampForReferralUser = $date->getTimestamp(); Log::info(" Updating Function Starts"); $updateSubscription = $stripe->subscriptions->update( $newUserSubscriptionDetails->subscription_id, ['trial_end' => $timestampForReferralUser] ); Log::info(" Updating Function END"); $SubscriptionObject = $stripe->subscriptions->retrieve($newUserSubscriptionDetails->subscription_id, []); $upcoming_invoice = $stripe->invoices->upcoming([ 'subscription' => $newUserSubscriptionDetails->subscription_id, // use retrieved id from subscription ]); $newUserSubscriptionDetails->current_period_start = date('Y-m-d H:i:s', $SubscriptionObject->current_period_start); $newUserSubscriptionDetails->current_period_end = date('Y-m-d H:i:s', $SubscriptionObject->current_period_end); $newUserSubscriptionDetails->next_payment_date = date('Y-m-d H:i:s', $upcoming_invoice->next_payment_attempt); $newUserSubscriptionDetails->save(); Log::info("new User Subscription Updated with Referral"); Log::info("Creating entry in Referral User table"); ReferralUsers::create([ 'iam_principal_xid' => $referralUserId, //Referral User Xid 'referred_user_xid' => $userId, // new user Id 'referred_date_time' => Carbon::now(), ]); Log::info("Created entry in Referral User table"); } $getUserData = IamPrincipal::where('id', $userId)->first(); $title = "Congratulations your subscription is now active"; $message = $getUserData->first_name . " has subscribed for " . $subscriptionProductData->name; $content_type = "new_subscription"; onesignalhelper::sendNotificationApi($getUserData->one_signal_player_id, $title, $message, $content_type, $image = null, $id = null); Log::info('Subscription Taken Successfully by '); DB::commit(); } catch (\Exception $e) { Log::error("An error occurred in " . __METHOD__ . ": " . $e->getMessage()); // return response()->json(['error' => __('something_went_wrong')], 500); Log::error('Customer Subscription Checkout session function failed: ' . $e->getMessage()); DB::rollBack(); } //end } return response('Webhook received', 200); } }