Aknaproff/app/Http/Controllers/Superadmin/SubscriptionPaymentController.php
2023-09-21 13:45:08 +01:00

332 lines
12 KiB
PHP

<?php
namespace App\Http\Controllers\Superadmin;
use App\Http\Controllers\Controller;
use App\Notifications\NotificationToUserForAccountUpgrade;
use App\Notifications\SendApprovalNotificationToAdminForOfflinePayment;
use App\Package;
use App\PackageSubscription;
use App\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
use Notification;
use Srmklive\PayPal\Services\ExpressCheckout;
use Stripe\Checkout\Session;
use Stripe\Stripe;
class SubscriptionPaymentController extends Controller
{
/**
* Show pay form for a new package.
*
* @return Response
*/
public function subscriptionPay($package_id)
{
return $this->pay($package_id, $register_form = true);
}
/**
* Show pay form for a new package.
*
* @return Response
*/
public function pay($package_id, $register_form = null)
{
try {
$package = Package::find($package_id);
$user = request()->user();
//Check for free package & subscribe it.
if ($package->price == 0) {
DB::beginTransaction();
$paid_via = null;
$payment_transaction_id = 'FREE';
$status = 'approved';
PackageSubscription::createSubscription($user->id, $package_id, $paid_via, $payment_transaction_id, $status);
DB::commit();
if (! empty($register_form)) {
$output = [
'success' => 1,
'msg' => __('messages.registered_and_subscribed'),
];
return redirect()->action([\App\Http\Controllers\SubscriptionsController::class, 'index'])
->with('status', $output);
} else {
$output = [
'success' => 1,
'msg' => __('messages.success'),
];
return redirect()->action([\App\Http\Controllers\SubscriptionsController::class, 'index'])
->with('status', $output);
}
}
$nav = false;
$payment_gateways = $this->paymentGateways();
$stripe_payment_session = [];
if (array_key_exists('stripe', $payment_gateways)) {
Stripe::setApiKey(config('constants.STRIPE_SECRET_KEY'));
$stripe_payment_session = \Stripe\Checkout\Session::create([
'customer_email' => $user->email,
'payment_method_types' => ['card'],
'line_items' => [[
'price_data' => [
'currency' => strtolower(env('CURRENCY_CODE')),
'unit_amount' => $package->price * 100,
'product_data' => [
'name' => $package->name,
'description' => $package->description,
'images' => [],
],
],
'quantity' => 1,
]],
'mode' => 'payment',
'success_url' => action([\App\Http\Controllers\Superadmin\SubscriptionPaymentController::class, 'confirmPayment'], [$package_id]).'?paid_via=stripe&session_id={CHECKOUT_SESSION_ID}',
'cancel_url' => action([\App\Http\Controllers\Superadmin\SubscriptionPaymentController::class, 'pay'], [$package_id]),
]);
}
return view('payments.create')
->with(compact('package', 'nav', 'payment_gateways', 'stripe_payment_session'));
} catch (Exception $e) {
DB::rollBack();
$output = [
'success' => 0,
'msg' => __('messages.something_went_wrong'),
];
return redirect()->action([\App\Http\Controllers\SubscriptionsController::class, 'index'])
->with('status', $output);
}
}
/**
* confirm the payment & Save the payment details and add subscription details
*
* @return Response
*/
public function confirmPayment($package_id, Request $request)
{
try {
DB::beginTransaction();
$user = request()->user();
$paid_via = $request->get('paid_via');
//Call the payment method
$pay_function = 'pay_'.$paid_via;
$payment_transaction_id = null;
$status = 'approved';
if (method_exists($this, $pay_function)) {
$payment_transaction_id = $this->$pay_function($package_id, $request);
}
if (in_array($paid_via, ['offline'])) {
$status = 'waiting';
}
//create subscription
PackageSubscription::createSubscription($user->id, $package_id, $paid_via, $payment_transaction_id, $status);
DB::commit();
$msg = __('messages.success');
if ($request->get('paid_via') == 'offline') {
$msg = __('messages.notification_sent_for_approval');
}
$output = ['success' => 1, 'msg' => $msg];
} catch (Exception $e) {
DB::rollBack();
$output = [
'success' => 0,
'msg' => __('messages.something_went_wrong'),
];
}
return redirect()->action([\App\Http\Controllers\SubscriptionsController::class, 'index'])
->with('status', $output);
}
/**
* Offline payment method
*
* @return Response
*/
protected function pay_offline($package_id, $request)
{
$user = request()->user();
$admin_emails = explode(',', env('SUPERADMIN_EMAILS'));
$superadmins = User::whereIn('email', $admin_emails)
->get();
$package = Package::find($package_id);
$package['paid_via'] = 'Offline';
$package['package_price'] = env('CURRENCY_SYMBOL').number_format($package->price, 2);
Notification::send($superadmins, new SendApprovalNotificationToAdminForOfflinePayment($user, $package));
}
/**
* Paypal payment method
*
* @return Response
*/
protected function pay_paypal($package_id, $request)
{
$provider = new ExpressCheckout();
config(['paypal.currency' => strtoupper(env('CURRENCY_CODE'))]);
$provider = new ExpressCheckout();
$response = $provider->getExpressCheckoutDetails($request->token);
// if response ACK value is not SUCCESS or SUCCESSWITHWARNING return back with error
if (! in_array(strtoupper($response['ACK']), ['SUCCESS', 'SUCCESSWITHWARNING'])) {
return back()
->with('status', ['success' => 0, 'msg' => 'Something went wrong with paypal transaction']);
}
$invoice_id = $response['INVNUM'];
$package = Package::find($package_id);
$data = [];
$data['items'] = [
[
'name' => $package->name,
'price' => (float) $package->price,
'qty' => 1,
],
];
$data['invoice_id'] = $invoice_id;
$data['invoice_description'] = "Order #{$data['invoice_id']} Invoice";
$data['return_url'] = action([\App\Http\Controllers\Superadmin\SubscriptionPaymentController::class, 'confirmPayment'], [$package_id]);
$data['cancel_url'] = action([\App\Http\Controllers\Superadmin\SubscriptionPaymentController::class, 'pay'], [$package_id]);
$data['total'] = (float) $package->price;
$token = $request->get('token');
$PayerID = $request->get('PayerID');
// if payment is not recurring just perform transaction on PayPal and get the payment status
$payment_status = $provider->doExpressCheckoutPayment($data, $token, $PayerID);
$status = isset($payment_status['PAYMENTINFO_0_PAYMENTSTATUS']) ? $payment_status['PAYMENTINFO_0_PAYMENTSTATUS'] : null;
if (! empty($status) && $status != 'Invalid') {
return $invoice_id;
} else {
$error = 'Something went wrong with paypal transaction';
throw new \Exception($error);
}
}
/**
* Paypal payment method - redirect to paypal url for payments
*
* @return Response
*/
public function paypalExpressCheckout($package_id, Request $request)
{
$package = Package::find($package_id);
$data = [];
$data['items'] = [
[
'name' => $package->name,
'price' => (float) $package->price,
'qty' => 1,
],
];
$data['invoice_id'] = Str::random(5);
$data['invoice_description'] = "Order #{$data['invoice_id']} Invoice";
$data['return_url'] = action([\App\Http\Controllers\Superadmin\SubscriptionPaymentController::class, 'confirmPayment'], [$package_id]).'?paid_via=paypal';
$data['cancel_url'] = action([\App\Http\Controllers\Superadmin\SubscriptionPaymentController::class, 'pay'], [$package_id]);
$data['total'] = (float) $package->price;
//send request to paypal & in response get aaray of data and if it has payment link redirect on that
$provider = new ExpressCheckout();
$response = $provider->setCurrency(strtoupper(env('CURRENCY_CODE')))->setExpressCheckout($data);
// if there is no link redirect back with error message
if (! $response['paypal_link']) {
return back()
->with('status', ['success' => 0, 'msg' => 'Something went wrong with paypal transaction']);
}
return redirect($response['paypal_link']);
}
/**
* return transaction id
* after successful payment
*
* @return Response
*/
protected function pay_stripe($package_id, $request)
{
Stripe::setApiKey(config('constants.STRIPE_SECRET_KEY'));
$stripe_payment = Session::retrieve($request->session_id);
return $stripe_payment->payment_intent;
}
/**
* Confirm subscription by admin
*
* @return Response
*/
public function confirmAdminSubscription($package_id, $user_id)
{
if (request()->ajax()) {
return view('superadmin.users.confirm_upgrade')
->with(compact('package_id', 'user_id'));
}
}
/**
* Add subscription details by admin
*
* @return Response
*/
public function adminSubscription($package_id, $user_id, Request $request)
{
try {
DB::beginTransaction();
if (! empty($request->input('disable_all_packages'))) {
PackageSubscription::disableAllPackagesForUser($user_id);
}
$user = User::where('id', $user_id)->first();
$package = Package::find($package_id);
$payment_transaction_id = '';
$status = 'approved';
//create subscription
$subscription_info = PackageSubscription::createSubscription(
$user->id,
$package_id,
'admin',
$payment_transaction_id,
$status
);
Notification::send($user, new NotificationToUserForAccountUpgrade($user, $subscription_info));
DB::commit();
$output = [
'success' => 1,
'msg' => __('messages.success'),
];
} catch (Exception $e) {
DB::rollBack();
$output = [
'success' => 0,
'msg' => __('messages.something_went_wrong'),
];
}
return $output;
}
}