@@ -2,356 +2,148 @@
|
||||
|
||||
namespace App\Http\Controllers\APIs\Customer_API;
|
||||
|
||||
use App\Helpers\onesignalhelper;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\IamPrincipal;
|
||||
use App\Models\SubscriptionProducts;
|
||||
use App\Models\Subscriptions;
|
||||
use App\Services\APIs\CustomerAPIs\RulesApiServices;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Illuminate\Http\Request;
|
||||
use Stripe\Event;
|
||||
use Stripe\Stripe;
|
||||
|
||||
|
||||
use Illuminate\Support\Facades\Session;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
|
||||
use Illuminate\Support\Facades\Redirect;
|
||||
|
||||
class SubscriptionController extends Controller
|
||||
class StripeWebhookController extends Controller
|
||||
{
|
||||
//
|
||||
|
||||
|
||||
//created by; Hritik
|
||||
//On - 28th June ,2024
|
||||
//use - to get Data of User in Webview and show list of product
|
||||
|
||||
public function mySubscription(Request $request)
|
||||
{
|
||||
try {
|
||||
// dd($request->header('access-token'));
|
||||
// $token = readHeaderToken();
|
||||
// dd("acc",$token);
|
||||
$token = true;
|
||||
|
||||
// dd($token, Session::get('vendorToken'));
|
||||
if ($token) {
|
||||
$user_id = 12;
|
||||
// $user_id = $token['sub'];
|
||||
|
||||
$dateTime = now();
|
||||
$formattedDateTime = $dateTime->format('Y-m-d H:i:s');
|
||||
$isSubscribedUser = Subscriptions::where('iam_principal_xid', $user_id)
|
||||
->where('next_payment_date', '>=', $formattedDateTime)
|
||||
->first();
|
||||
|
||||
$userData = IamPrincipal::where('id', $user_id)->first();
|
||||
|
||||
// $request['iam_principal_id'] = $user_id;
|
||||
|
||||
|
||||
$products = SubscriptionProducts::where('is_active', '1')->get();
|
||||
|
||||
if ($isSubscribedUser) {
|
||||
|
||||
return view("Admin.pages.subscriptions.my-subscription", compact('user_id', 'userData', 'isSubscribedUser', 'products'));
|
||||
}
|
||||
$productList = SubscriptionProducts::where('is_active', 1)->first();
|
||||
|
||||
return view('Admin.pages.subscriptions.list-of-products', compact('productList', 'userData'));
|
||||
} else {
|
||||
return jsonResponseWithErrorMessageApi(__('auth.user_deleted'), 409);
|
||||
}
|
||||
|
||||
} catch (\Exception $e) {
|
||||
Log::error("An error occurred in " . __METHOD__ . ": " . $e->getMessage(), ['exception' => $e]);
|
||||
return jsonResponseWithErrorMessage(__('auth.something_went_wrong'));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//created by; Hritik
|
||||
//On - 28th June ,2024
|
||||
//use - to get Data of User in Webview and show list of product
|
||||
|
||||
|
||||
public function listOfProduct(Request $request)
|
||||
{
|
||||
try {
|
||||
$productList = SubscriptionProducts::where('is_active', 1)->first();
|
||||
|
||||
return view('Admin.pages.subscriptions.list-of-products', compact('productList'));
|
||||
|
||||
} catch (\Exception $e) {
|
||||
Log::error("An error occurred in " . __METHOD__ . ": " . $e->getMessage(), ['exception' => $e]);
|
||||
return jsonResponseWithErrorMessage(__('auth.something_went_wrong'), 500);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
//created by; Hritik
|
||||
//On - 02th July ,2024
|
||||
//use - to Create Subscription Product & price for Monthly
|
||||
|
||||
public function createStripeProduct(Request $request)
|
||||
{
|
||||
|
||||
|
||||
public function getWebhook(Request $request){
|
||||
// dd("ssssss",$request);
|
||||
Log::info(' Received= in getWebhook ');
|
||||
|
||||
}
|
||||
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 {
|
||||
|
||||
DB::beginTransaction();
|
||||
|
||||
$stripeSecret = (config('constants.subscription.stripe_secret_key'));
|
||||
$event = Event::constructFrom(
|
||||
json_decode($payload, true),
|
||||
$sigHeader,
|
||||
config('constants.subscription.webhook_secret')
|
||||
);
|
||||
|
||||
|
||||
// $stripeSecret = env('STRIPE_SECRET');
|
||||
$stripe = new \Stripe\StripeClient($stripeSecret);
|
||||
// dd($stripeSecret,$stripe,$request->all());
|
||||
|
||||
$validator = $this->validateSubscriptionsproductForm($request);
|
||||
|
||||
if ($validator->fails()) {
|
||||
$validationErrors = $validator->errors()->all();
|
||||
Log::error("Stripe subscriptions plan validation error: " . implode(", ", $validationErrors));
|
||||
return jsonResponseWithErrorMessageApi($validationErrors, 203);
|
||||
}
|
||||
|
||||
$id = SubscriptionProducts::create([
|
||||
'product_name' => $request->product_name,
|
||||
'product_value' => $request->product_value,
|
||||
'product_details' => $request->product_details,
|
||||
]);
|
||||
|
||||
$productCreate = $stripe->products->create([
|
||||
'name' => $request->product_name,
|
||||
]);
|
||||
|
||||
$updateCreatedPlan = SubscriptionProducts::where('id', $id->id)->update([
|
||||
'stripe_product_id' => $productCreate->id
|
||||
]);
|
||||
|
||||
|
||||
$totalPrice = $request->product_value;
|
||||
if ($totalPrice && $totalPrice != 0 && $totalPrice != null) {
|
||||
$productPrice1 = $stripe->prices->create([
|
||||
'unit_amount' => $totalPrice * 100,
|
||||
// amount entered by Admin (in cents)
|
||||
'currency' => 'usd',
|
||||
'recurring' => ['interval' => 'month'],
|
||||
'product' => $productCreate->id,
|
||||
'nickname' => 'Monthly Price',
|
||||
|
||||
]);
|
||||
|
||||
$updateCreatedPlan = SubscriptionProducts::where('id', $id->id)->update([
|
||||
'stripe_price_id' => $productPrice1->id
|
||||
]);
|
||||
}
|
||||
|
||||
DB::commit();
|
||||
return jsonResponseWithSuccessMessage(__('success.save_data'), 200);
|
||||
} catch (\Exception $ex) {
|
||||
DB::rollBack();
|
||||
Log::error('Favourite Restaurant service failed: ' . $ex->getMessage());
|
||||
return jsonResponseWithErrorMessageApi(__('auth.something_went_wrong'), 500);
|
||||
} 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);
|
||||
|
||||
public function validateSubscriptionsproductForm(Request $request)
|
||||
{
|
||||
return Validator::make(
|
||||
$request->all(),
|
||||
[
|
||||
if ($event->type === 'checkout.session.completed') {
|
||||
try {
|
||||
|
||||
'product_name' => 'required',
|
||||
'product_value' => 'required',
|
||||
'product_details' => 'required',
|
||||
]
|
||||
);
|
||||
}
|
||||
DB::beginTransaction();
|
||||
// Handle successful subscription payment
|
||||
// You can access event data like $event->data->object
|
||||
|
||||
// Session::flush();
|
||||
$session = $event->data->object;
|
||||
|
||||
|
||||
//created by; Hritik
|
||||
//On - 02th July ,2024
|
||||
//use - to Create Subscription
|
||||
|
||||
public function subscriptionToPlan(Request $request)
|
||||
{
|
||||
// dd($request->all());
|
||||
|
||||
try {
|
||||
|
||||
$userId = $request->user_id;
|
||||
$subscriptionProductXid = $request->subscription_product_xid;
|
||||
|
||||
$stripeSecret = (config('constants.subscription.stripe_secret_key'));
|
||||
|
||||
$stripe = new \Stripe\StripeClient($stripeSecret);
|
||||
// $taxId = (config('services.stripe.tax_id'));
|
||||
|
||||
$userData = IamPrincipal::where('id', $userId)->first();
|
||||
|
||||
if ($userData) {
|
||||
|
||||
$subscriptionPlan = SubscriptionProducts::where('id', $subscriptionProductXid)->first();
|
||||
|
||||
|
||||
if ($subscriptionPlan && $subscriptionPlan->stripe_price_id && $subscriptionPlan->stripe_price_id != null) {
|
||||
$checkout = $stripe->checkout->sessions->create([
|
||||
'customer_email' => $userData->email_address,
|
||||
'line_items' => [
|
||||
[
|
||||
'price' => $subscriptionPlan->stripe_price_id,
|
||||
'quantity' => 1,
|
||||
// 'tax_rates'=>[$taxId],
|
||||
],
|
||||
],
|
||||
'mode' => 'subscription',
|
||||
// 'allow_promotion_codes' => true,
|
||||
// 'tax_id_collection' => ['enabled' => true],
|
||||
'metadata' => [
|
||||
'userId' => $userData->id,
|
||||
|
||||
'userEmail' => $userData->email_address,
|
||||
'subscriptionProductXid' => $subscriptionProductXid
|
||||
],
|
||||
'success_url' => route('thankyou'),
|
||||
|
||||
// 'cancel_url' => "http://localhost/cheerstothe_season_2_o/my-subscription-page",
|
||||
]);
|
||||
|
||||
return Redirect::away($checkout->url);
|
||||
//note:-for now i am just sending the cveonly=0 and lmacve=1 for reference .'&lmacve=1&cveonly=0'
|
||||
} else {
|
||||
return redirect()->back()->with(['error' => "Something went wrong while subscription!"]);
|
||||
|
||||
$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;
|
||||
|
||||
$subscriptionProductData = SubscriptionProducts::where('id', $subscriptionProductId)->first();
|
||||
|
||||
//checkout store in db
|
||||
$subscriptionData = $stripe->checkout->sessions->retrieve($session->id, []);
|
||||
$SubscriptionObject = $stripe->subscriptions->retrieve($subscriptionData->subscription, []);
|
||||
$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)
|
||||
|
||||
]
|
||||
);
|
||||
|
||||
$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();
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
} catch (\Exception $e) {
|
||||
Log::error("An error occurred in " . __METHOD__ . ": " . $e->getMessage(), ['exception' => $e]);
|
||||
return jsonResponseWithErrorMessage(__('auth.something_went_wrong'));
|
||||
// return redirect()->back()->with(['error' => "Something went wrong while subscription!" . $e->getMessage()]);
|
||||
|
||||
//end
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
return response('Webhook received', 200);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public function thankyou(Request $request)
|
||||
{
|
||||
|
||||
return view('Admin.pages.subscriptions.thank-you');
|
||||
}
|
||||
|
||||
//created by; Hritik
|
||||
//On - 28th May ,2024
|
||||
//use - To cancel the subscription of user on end of subscription end period
|
||||
|
||||
public function cancelSubscription(Request $request)
|
||||
{
|
||||
try {
|
||||
Log::info("Razorpay Cancel subscriptions Begin: ");
|
||||
DB::beginTransaction();
|
||||
|
||||
$validator = $this->validateCancelSubscriptionForm($request);
|
||||
|
||||
if ($validator->fails()) {
|
||||
$validationErrors = $validator->errors()->all();
|
||||
Log::error("Razorpay Cancel subscriptions validation error: " . implode(", ", $validationErrors));
|
||||
return jsonResponseWithErrorMessageApi($validationErrors, 203);
|
||||
}
|
||||
|
||||
$iamPrincipalId = $request->iam_principal_xid;
|
||||
$razorpaySubscriptionId = $request->subscription_id;
|
||||
$subscriptionXid = $request->subscription_xid;
|
||||
|
||||
$getSubscriptionData = RazorpaySubscriptions::where(['id' => $subscriptionXid, 'iam_principal_xid' => $iamPrincipalId, 'subscription_id' => $razorpaySubscriptionId, 'isCancelledSubscription' => 0])->first();
|
||||
|
||||
|
||||
if (!$getSubscriptionData) {
|
||||
return response()->json(['status' => 502, 'message' => 'Something went wrong while cancelling Subscription']);
|
||||
}
|
||||
|
||||
$api = new Api(config('constants.razorpay.key_id'), config('constants.razorpay.key_secret'));
|
||||
|
||||
$options = ['cancel_at_cycle_end' => 1];
|
||||
// Call the subscription create method with request parameters
|
||||
$response = $api->subscription->fetch($razorpaySubscriptionId)->cancel($options);
|
||||
|
||||
$endAt = date('Y-m-d H:i:s', $response->end_at);
|
||||
$dateTime = now();
|
||||
$currentDateTime = $dateTime->format('Y-m-d H:i:s');
|
||||
$getSubscriptionData->isCancelledSubscription = 1;
|
||||
$getSubscriptionData->cancelled_at = $currentDateTime;
|
||||
$getSubscriptionData->save();
|
||||
|
||||
DB::commit();
|
||||
Log::info("Razorpay Cancel subscriptions end: ");
|
||||
|
||||
return response()->json(['status' => 200, 'end_date' => $endAt]);
|
||||
// return response()->json(['status' => 200, 'message' => 'Your Subscription has been cancelled Sucessfully']);
|
||||
|
||||
|
||||
} catch (Exception $e) {
|
||||
DB::rollBack();
|
||||
Log::error("An error occurred in " . __METHOD__ . ": " . $e->getMessage(), ['exception' => $e]);
|
||||
return jsonResponseWithErrorMessage(__('auth.something_went_wrong'), 500);
|
||||
}
|
||||
}
|
||||
public function validateCancelSubscriptionForm(Request $request)
|
||||
{
|
||||
return Validator::make(
|
||||
$request->all(),
|
||||
[
|
||||
'iam_principal_xid' => 'required',
|
||||
'subscription_id' => 'required',
|
||||
'subscription_xid' => 'required',
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
// public function subscriptionUpgrade(Request $request)
|
||||
// {
|
||||
// // dd($request->all());
|
||||
|
||||
// $razorPaysubscriptionProductXid = $request->razorpay_plan_id;
|
||||
// $productTypeId = $request->product_type_xid;
|
||||
// $productTierId = $request->product_tier_xid;
|
||||
// $iamId = $request->iam_principal_xid;
|
||||
|
||||
// $user_id = 12; // Change this to dynamic user ID
|
||||
|
||||
// // Retrieve the current monthly subscription
|
||||
// $currentSubscription = RazorpaySubscriptions::where('iam_principal_xid', $user_id)->first();
|
||||
|
||||
// if (!$currentSubscription) {
|
||||
// return response()->json(['status' => 502, 'message' => 'Something went wrong current user Subscription not found']);
|
||||
// }
|
||||
|
||||
// $products = Products::where('product_type_xid', $productTypeId)
|
||||
// ->where('product_tier_xid', $productTierId)
|
||||
// ->where('razorpay_plan_id', $razorPaysubscriptionProductXid)
|
||||
// ->where('is_active', '1')->first();
|
||||
|
||||
// if (!$products) {
|
||||
// return response()->json(['status' => 502, 'message' => 'Something went wrong current product not found']);
|
||||
// }
|
||||
|
||||
// $api = new Api(config('constants.razorpay.key_id'), config('constants.razorpay.key_secret'));
|
||||
// $plan_id = $products->razorpay_plan_id;
|
||||
|
||||
// // Call the subscription create method with request parameters
|
||||
|
||||
// }
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user