<?php namespace App\Http\Controllers; use Adrianbarbos\Mobilpay\Mobilpay; use App\DepositRecord; use Brian2694\Toastr\Facades\Toastr; use Bryceandy\Laravel_Pesapal\Facades\Pesapal; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Log; use Modules\BankPayment\Http\Controllers\BankPaymentController; use Modules\Instamojo\Http\Controllers\InstamojoController; use Modules\MercadoPago\Http\Controllers\MercadoPagoController; use Modules\Midtrans\Http\Controllers\MidtransController; use Modules\Mobilpay\Http\Controllers\MobilpayController; use Modules\Payeer\Http\Controllers\PayeerController; use Modules\PaymentMethodSetting\Entities\PaymentMethod; use Modules\Paytm\Http\Controllers\PaytmController; use Modules\RazerMS\Http\Controllers\RazerMSController; use Modules\Razorpay\Http\Controllers\RazorpayController; use Modules\Sslcommerz\Http\Controllers\SslcommerzController; use Netopia\Payment\Address; use Netopia\Payment\Invoice; use Netopia\Payment\Request\Card; use Omnipay\Omnipay; use Unicodeveloper\Paystack\Facades\Paystack; class DepositController extends Controller { public $payPalGateway; public function __construct() { $this->middleware('maintenanceMode'); $this->payPalGateway = Omnipay::create('PayPal_Rest'); $this->payPalGateway->setClientId(getPaymentEnv('PAYPAL_CLIENT_ID')); $this->payPalGateway->setSecret(getPaymentEnv('PAYPAL_CLIENT_SECRET')); $this->payPalGateway->setTestMode(getPaymentEnv('IS_PAYPAL_LOCALHOST') == 'true'); //set it to 'false' when go live } public function depositSelectOption(Request $request) { $data = $request->validate([ 'deposit_amount' => 'required|numeric', ]); $amount = $request->deposit_amount; $records = DepositRecord::where('user_id', Auth::user()->id)->paginate(5); $methods = PaymentMethod::where('active_status', 1)->where('method', '!=', 'Wallet')->get(['method', 'logo']); return view(theme('depositSelect'), compact('records', 'methods', 'amount')); } public function depositSubmit(Request $request) { $data = $request->validate([ 'deposit_amount' => 'required|numeric', 'method' => 'required', ]); if ($data['method'] == "Sslcommerz") { $ssl = new SslcommerzController(); $ssl->deposit($data['deposit_amount']); } elseif ($data['method'] == "PayPal") { $response = $this->payPalGateway->purchase(array( 'amount' => convertCurrency(Settings('currency_code') ?? 'BDT', Settings('currency_code'), $data['deposit_amount']), 'currency' => Settings('currency_code'), 'returnUrl' => route('paypalDepositSuccess'), 'cancelUrl' => route('paypalDepositFailed'), ))->send(); if ($response->isRedirect()) { $response->redirect(); // this will automatically forward the customer } else { Toastr::error($response->getMessage(), trans('common.Failed')); return \redirect()->back(); } } elseif ($data['method'] == "Midtrans") { try { $midtrans = new MidtransController(); $request->merge(['type' => 'Deposit']); $response = $midtrans->makePayment($request); if ($response) { return $response; } else { Toastr::error('Something went wrong', 'Failed'); return \redirect()->back(); } } catch (\Exception $e) { GettingError($e->getMessage(), url()->current(), request()->ip(), request()->userAgent()); } } elseif ($data['method'] == "Payeer") { try { $payeer = new PayeerController(); $request->merge(['type' => 'Deposit']); $response = $payeer->makePayment($request); if ($response) { return \redirect()->to($response); } else { Toastr::error('Something went wrong', 'Failed'); return \redirect()->back(); } } catch (\Exception $e) { GettingError($e->getMessage(), url()->current(), request()->ip(), request()->userAgent()); } } elseif ($data['method'] == "MercadoPago") { $mercadoPagoController = new MercadoPagoController(); $response = $mercadoPagoController->payment($request->all()); return response()->json(['target_url' => $response]); } elseif ($data['method'] == "Instamojo") { $instamojo = new InstamojoController(); $response = $instamojo->depositProcess($request); if ($response) { return \redirect()->to($response); } else { Toastr::error('Something went wrong', 'Failed'); return \redirect()->back(); } } elseif ($data['method'] == "Stripe") { if (empty($request->get('stripeToken'))) { Toastr::error('Something went wrong', 'Failed'); return redirect(route('studentDashboard')); } $token = $request->stripeToken; $gatewayStripe = Omnipay::create('Stripe'); $gatewayStripe->setApiKey(getPaymentEnv('STRIPE_SECRET')); $response = $gatewayStripe->purchase(array( 'amount' => convertCurrency(Settings('currency_code') ?? 'BDT', Settings('currency_code'), $data['deposit_amount']), 'currency' => Settings('currency_code'), 'token' => $token, ))->send(); if ($response->isRedirect()) { // redirect to offsite payment gateway $response->redirect(); } elseif ($response->isSuccessful()) { // payment was successful: update database $amount = number_format(convertCurrency(strtoupper($response->getData()['currency'],), strtoupper(Settings('currency_code') ?? 'BDT'), $response->getData()['amount'] / 100), 2); $payWithStripe = $this->depositWithGateWay($amount, $response, "Stripe"); if ($payWithStripe) { Toastr::success('Payment done successfully', 'Success'); return redirect(route('studentDashboard')); } else { Toastr::error('Something Went Wrong', 'Error'); return redirect(route('studentDashboard')); } } else { if ($response->getCode() == "amount_too_small") { $amount = number_format(convertCurrency(Settings('currency_code'), strtoupper(Settings('currency_code') ?? 'BDT'), 0.5), 2); $message = "Amount must be at least " . Settings('currency_symbol') . ' ' . $amount; Toastr::error($message, 'Error'); } else { Toastr::error($response->getMessage(), 'Error'); } return redirect()->back(); } } elseif ($data['method'] == "RazorPay") { if (empty($request->razorpay_payment_id)) { Toastr::error('Something Went Wrong', 'Error'); return \redirect()->back(); } $payment = new RazorpayController(); $response = $payment->payment($request->razorpay_payment_id); if ($response['type'] == "error") { Toastr::error($response['message'], 'Error'); return \redirect()->back(); } $amount = number_format(convertCurrency(strtoupper($response['response']['currency'],), strtoupper(Settings('currency_code') ?? 'BDT'), $response['response']['amount'] / 100), 2); $payWithRazorPay = $this->depositWithGateWay($amount, $response['response'], "RazorPay"); if ($payWithRazorPay) { Toastr::success('Payment done successfully', 'Success'); return redirect(route('studentDashboard')); } else { Toastr::error('Something Went Wrong', 'Error'); return redirect(route('studentDashboard')); } } elseif ($data['method'] == "PayTM") { $phone = Auth::user()->phone; $email = Auth::user()->email; if (empty($phone)) { Toastr::error('Phone number is required. Please update your profile ', 'Error'); return redirect()->back(); } $payment = new PaytmController(); $userData = [ 'user' => Auth::user()->id, 'mobile' => $phone, 'email' => $email, 'amount' => convertCurrency(Settings('currency_code') ?? 'BDT', 'INR', $data['deposit_amount']), 'order' => Auth::user()->phone . "_" . rand(1, 1000), ]; return $payment->deposit($userData); } elseif ($data['method'] == "PayStack") { try { return Paystack::getAuthorizationUrl()->redirectNow(); } catch (\Exception $e) { GettingError($e->getMessage(), url()->current(), request()->ip(), request()->userAgent()); } } elseif ($data['method'] == "RazerMS") { try { $payment = new RazerMSController(); $url = $payment->generatePaymentUrl($data['deposit_amount'], 'deposit'); return redirect($url); } catch (\Exception $e) { GettingError($e->getMessage(), url()->current(), request()->ip(), request()->userAgent()); } } elseif ($data['method'] == "Bank Payment") { $rules = [ 'bank_name' => 'required', 'branch_name' => 'required', 'type' => 'required', 'account_number' => 'required', 'account_holder' => 'required', 'image' => 'mimes:jpeg,jpg,png,gif|required', ]; $this->validate($request, $rules, validationMessage($rules)); try { $payment = new BankPaymentController(); $result = $payment->store($request); if ($result) { return redirect(route('studentDashboard')); } else { return redirect()->back(); } } catch (\Exception $e) { GettingError($e->getMessage(), url()->current(), request()->ip(), request()->userAgent()); } } elseif ($data['method'] == "Pesapal") { try { $paymentData = [ 'amount' => $request->deposit_amount, 'currency' => Settings('currency_code'), 'description' => 'Deposit', 'type' => 'MERCHANT', 'reference' => 'Deposit|' . $request->deposit_amount, 'first_name' => Auth::user()->first_name, 'last_name' => Auth::user()->last_name, 'email' => Auth::user()->email, ]; $iframe_src = Pesapal::getIframeSource($paymentData); return view('laravel_pesapal::iframe', compact('iframe_src')); } catch (\Exception $e) { GettingError($e->getMessage(), url()->current(), request()->ip(), request()->userAgent()); } } elseif ($data['method'] == "Mobilpay") { $mobilpay = new MobilpayController(); return $mobilpay->depositProcess($request); } } public static function depositWithGateWay($amount, $response, $gateWayName, $user = null) { try { if (Auth::check()) { $user = Auth::user(); } if ($user) { DB::beginTransaction(); $user->balance += $amount; $user->save(); Log::info($user); $depositRecord = new DepositRecord(); $depositRecord->user_id = $user->id; $depositRecord->method = $gateWayName; $depositRecord->amount = $amount; $depositRecord->response = json_encode($response); $depositRecord->save(); Toastr::success('Deposit done successfully', 'Success'); DB::commit(); return true; } else { Log::info('Something Went Wrong'); Toastr::error('Something Went Wrong', 'Error'); return false; } } catch (\Exception $e) { GettingError($e->getMessage(), url()->current(), request()->ip(), request()->userAgent(), true); } } public function paypalDepositSuccess(Request $request) { // Once the transaction has been approved, we need to complete it. if ($request->input('paymentId') && $request->input('PayerID')) { $transaction = $this->payPalGateway->completePurchase(array( 'payer_id' => $request->input('PayerID'), 'transactionReference' => $request->input('paymentId'), )); $response = $transaction->send(); if ($response->isSuccessful()) { // The customer has successfully paid. $arr_body = $response->getData(); $paymentAmount = $arr_body['transactions'][0]['amount']; $amount = number_format(convertCurrency($paymentAmount['currency'], Settings('currency_code') ?? 'BDT', $paymentAmount['total']), 2); $payWithPapal = $this->depositWithGateWay($amount, $arr_body, "PayPal"); if ($payWithPapal) { Toastr::success('Payment done successfully', 'Success'); return redirect(route('studentDashboard')); } else { Toastr::error('Something Went Wrong', 'Error'); return redirect(route('studentDashboard')); } } else { $msg = str_replace("'", " ", $response->getMessage()); Toastr::error($msg, 'Failed'); return redirect()->back(); } } else { Toastr::error('Transaction is declined'); return redirect()->back(); } } public function paypalDepositFailed() { Toastr::error('User is canceled the payment.', 'Failed'); return redirect()->back(); } }