Files
cheerstothe_season_2.0/app/Http/Controllers/APIs/Customer_API/StripeWebhookController.php

269 lines
12 KiB
PHP

<?php
namespace App\Http\Controllers\APIs\Customer_API;
use App\Helpers\onesignalhelper;
use App\Http\Controllers\Controller;
use App\Models\IamPrincipal;
use App\Models\ReferralUsers;
use App\Models\SubscriptionProducts;
use App\Models\Subscriptions;
use Illuminate\Http\Request;
use Stripe\Event;
use Stripe\Stripe;
use Carbon\Carbon;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\DB;
use DateTime;
class StripeWebhookController extends Controller
{
//
public function getWebhook(Request $request)
{
// dd("ssssss",$request);
Log::info('Stripe Webhook Received= in getWebhook ');
Log::info('Stripe Webhook Received: ' . $request->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);
}
}