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; $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(); $updateSubscription = $stripe->subscriptions->update( $newUserSubscriptionDetails->subscription_id, ['trial_end' => $timestampForReferralUser] ); $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"); } $getUserData = IamPrincipal::where('id', $userId)->first(); $title = "Congratulations you subscription is now active"; $message = $getUserData->first_name . " has subscribed for " . $subscriptionProductData->_name . " subscription"; $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); } }