diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index f95c0d3cbf3d..808d999b4d6e 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -83,7 +83,7 @@ class Handler extends ExceptionHandler 'email' => 'anonymous@example.com', 'name' => 'Anonymous User', ]); - } elseif (auth()->guard('user') && auth()->guard('user')->user() && auth()->user()->company() && auth()->user()->company()->account->report_errors) { + } elseif (auth()->guard('user') && auth()->guard('user')->user() && auth()->user()->companyIsSet() && auth()->user()->company()->account->report_errors) { $scope->setUser([ 'id' => auth()->user()->account->key, 'email' => 'anonymous@example.com', diff --git a/app/Factory/CompanyGatewayFactory.php b/app/Factory/CompanyGatewayFactory.php index f19391ce3b78..879ce0a3b676 100644 --- a/app/Factory/CompanyGatewayFactory.php +++ b/app/Factory/CompanyGatewayFactory.php @@ -21,6 +21,8 @@ class CompanyGatewayFactory $company_gateway = new CompanyGateway; $company_gateway->company_id = $company_id; $company_gateway->user_id = $user_id; + $company_gateway->require_billing_address = false; + $company_gateway->require_shipping_address = false; // $company_gateway->fees_and_limits = new FeesAndLimits; return $company_gateway; diff --git a/app/Http/Controllers/StripeConnectController.php b/app/Http/Controllers/StripeConnectController.php index 325b5755f583..e545c16cebac 100644 --- a/app/Http/Controllers/StripeConnectController.php +++ b/app/Http/Controllers/StripeConnectController.php @@ -17,8 +17,11 @@ use App\Factory\CompanyGatewayFactory; use App\Http\Requests\StripeConnect\InitializeStripeConnectRequest; use App\Libraries\MultiDB; use App\Models\Client; +use App\Models\Company; use App\Models\CompanyGateway; +use App\Models\GatewayType; use App\PaymentDrivers\Stripe\Connect\Account; +use Illuminate\Http\Request; use Stripe\Exception\ApiErrorException; class StripeConnectController extends BaseController @@ -38,6 +41,8 @@ class StripeConnectController extends BaseController MultiDB::findAndSetDbByCompanyKey($request->getTokenContent()['company_key']); + $company = Company::where('company_key', $request->getTokenContent()['company_key'])->first(); + $company_gateway = CompanyGateway::query() ->where('gateway_key', 'd14dd26a47cecc30fdd65700bfb67b34') ->where('company_id', $request->getCompany()->id) @@ -45,53 +50,75 @@ class StripeConnectController extends BaseController if ($company_gateway) { - $config = decrypt($company_gateway->config); + $config = $company_gateway->getConfig(); if(property_exists($config, 'account_id')) - return render('gateways.stripe.connect.existing'); - - } - else - $company_gateway = CompanyGatewayFactory::create($request->getCompany()->id, $request->getContact()->id); + return view('auth.connect.existing'); - /* Set Credit Card To Enabled */ - $gateway_types = $company_gateway->driver(new Client)->gatewayTypes(); + } + + $stripe_client_id = config('ninja.ninja_stripe_client_id'); + $redirect_uri = 'http://ninja.test:8000/stripe/completed'; + $endpoint = "https://connect.stripe.com/oauth/authorize?response_type=code&client_id={$stripe_client_id}&redirect_uri={$redirect_uri}&scope=read_write&state={$token}"; + + if($email = $request->getContact()->email) + $endpoint .= "&stripe_user[email]={$email}"; + + $company_name = str_replace(" ", "_", $company->present()->name()); + $endpoint .= "&stripe_user[business_name]={$company_name}"; + + return redirect($endpoint); + } + + public function completed(InitializeStripeConnectRequest $request) + { + + \Stripe\Stripe::setApiKey(config('ninja.ninja_stripe_key')); + + $response = \Stripe\OAuth::token([ + 'grant_type' => 'authorization_code', + 'code' => $request->input('code'), + ]); + + // nlog($response); + + $company = Company::where('company_key', $request->getTokenContent()['company_key'])->first(); + + $company_gateway = CompanyGatewayFactory::create($company->id, $company->id); $fees_and_limits = new \stdClass; - $fees_and_limits->{$gateway_types[0]} = new FeesAndLimits; - + $fees_and_limits->{GatewayType::CREDIT_CARD} = new FeesAndLimits; $company_gateway->gateway_key = 'd14dd26a47cecc30fdd65700bfb67b34'; $company_gateway->fees_and_limits = $fees_and_limits; + $company_gateway->setConfig([]); $company_gateway->save(); + $payload = [ + 'account_id' => $response->stripe_user_id, + "token_type" => 'bearer', + "stripe_publishable_key" => $response->stripe_publishable_key, + "scope" => $response->scope, + "livemode" => $response->livemode, + "stripe_user_id" => $response->stripe_user_id, + "refresh_token" => $response->refresh_token, + "access_token" => $response->access_token + ]; + /* Link account if existing account exists */ if($account_id = $this->checkAccountAlreadyLinkToEmail($company_gateway, $request->getContact()->email)) { - $config = json_decode(decrypt($company_gateway->config)); - - $config->account_id = $account_id; - $company_gateway->config = encrypt(json_encode($config)); + $payload['account_id'] = $account_id; + $company_gateway->setConfig($payload); $company_gateway->save(); - return render('gateways.stripe.connect.existing'); + return view('auth.connect.existing'); + } - $data = [ - 'type' => 'standard', - 'email' => $request->getContact()->email, - 'country' => $request->getCompany()->country()->iso_3166_2, - ]; - - $account = Account::create($data); - $link = Account::link($account->id, $token); - $company_gateway->config = encrypt(json_encode(['account_id' => $account->id])); + $company_gateway->setConfig($payload); $company_gateway->save(); - return redirect($link['url']); - } - - public function completed() - { - return render('gateways.stripe.connect.completed'); + //response here + return view('auth.connect.completed'); } @@ -111,4 +138,22 @@ class StripeConnectController extends BaseController return false; } + + + + + /********************************* + * Stripe OAuth + */ + + // public function initialize(InitializeStripeConnectRequest $request, string $token) + // { + + // $stripe_key = config('ninja.ninja_stripe_key'); + + // $endpoint = "https://connect.stripe.com/oauth/authorize?response_type=code&client_id={$stripe_key}&scope=read_write"; + + // return redirect($endpoint); + + // } } diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 8163eff9fe12..af167fd5a50a 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -110,7 +110,6 @@ class Kernel extends HttpKernel ShareErrorsFromSession::class, VerifyCsrfToken::class, SubstituteBindings::class, - //\App\Http\Middleware\StartupCheck::class, QueryLogging::class, ], 'shop' => [ diff --git a/app/Http/Middleware/RedirectIfAuthenticated.php b/app/Http/Middleware/RedirectIfAuthenticated.php index 7800854f76bf..9ea2931d4c03 100644 --- a/app/Http/Middleware/RedirectIfAuthenticated.php +++ b/app/Http/Middleware/RedirectIfAuthenticated.php @@ -34,14 +34,16 @@ class RedirectIfAuthenticated } break; case 'user': - if (Auth::guard($guard)->check()) { - return redirect()->route('dashboard.index'); - } + Auth::logout(); + // if (Auth::guard($guard)->check()) { + // return redirect()->route('dashboard.index'); + // } break; default: - if (Auth::guard($guard)->check()) { - return redirect('/'); - } + Auth::logout(); + // if (Auth::guard($guard)->check()) { + // return redirect('/'); + // } break; } diff --git a/app/Http/Requests/StripeConnect/InitializeStripeConnectRequest.php b/app/Http/Requests/StripeConnect/InitializeStripeConnectRequest.php index ca0bd52d201b..26f2d0e66f28 100644 --- a/app/Http/Requests/StripeConnect/InitializeStripeConnectRequest.php +++ b/app/Http/Requests/StripeConnect/InitializeStripeConnectRequest.php @@ -49,6 +49,9 @@ class InitializeStripeConnectRequest extends FormRequest */ public function getTokenContent() { + if($this->state) + $this->token = $this->state; + $data = Cache::get($this->token); return $data; diff --git a/app/Models/User.php b/app/Models/User.php index 460f8a0bb2ea..9c785ea117b1 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -179,10 +179,19 @@ class User extends Authenticatable implements MustVerifyEmail return $company_token->company; } + // return false; throw new \Exception('No Company Found'); //return Company::find(config('ninja.company_id')); } + public function companyIsSet() + { + if($this->company) + return true; + + return false; + } + /** * Returns the current company. * diff --git a/app/PaymentDrivers/Stripe/Connect/ConnectOauth.php b/app/PaymentDrivers/Stripe/Connect/ConnectOauth.php new file mode 100644 index 000000000000..951b7d2b5c31 --- /dev/null +++ b/app/PaymentDrivers/Stripe/Connect/ConnectOauth.php @@ -0,0 +1,73 @@ + 'authorization_code', + 'code' => $code, + ]); + + // Access the connected account id in the response + $connected_account_id = $response->stripe_user_id; + + return $response; + //return $connected_account_id; + } + + + /** + * Revokes access to Stripe from Invoice Ninja + * for the given account id + */ + public function revoke($account_id) + { + + Stripe::setApiKey(config('ninja.ninja_stripe_key')); + + \Stripe\OAuth::deauthorize([ + 'client_id' => config('ninja.ninja_stripe_key'), + 'stripe_user_id' => $account_id, + ]); + + } + +} + + + + + + + + + diff --git a/config/ninja.php b/config/ninja.php index da450f69b7b7..923e620c2134 100644 --- a/config/ninja.php +++ b/config/ninja.php @@ -149,6 +149,7 @@ return [ 'invoiceninja_hosted_pdf_generation' => env('NINJA_HOSTED_PDF', false), 'ninja_stripe_key' => env('NINJA_STRIPE_KEY', null), 'ninja_stripe_publishable_key' => env('NINJA_PUBLISHABLE_KEY', null), + 'ninja_stripe_client_id' => env('NINJA_STRIPE_CLIENT_ID', null), 'pdf_generator' => env('PDF_GENERATOR', false), 'internal_queue_enabled' => env('INTERNAL_QUEUE_ENABLED', true), ]; diff --git a/resources/views/auth/connect/completed.blade.php b/resources/views/auth/connect/completed.blade.php new file mode 100644 index 000000000000..3d9999add5c6 --- /dev/null +++ b/resources/views/auth/connect/completed.blade.php @@ -0,0 +1,13 @@ +@extends('layouts.ninja') +@section('meta_title', ctrans('texts.success')) + +@section('body') +
+
+ +
+ +

Connecting your account using Stripe has been successfully completed.

+ Click here to continue. +
+@endsection diff --git a/resources/views/auth/connect/existing.blade.php b/resources/views/auth/connect/existing.blade.php new file mode 100644 index 000000000000..dd9b7804ec08 --- /dev/null +++ b/resources/views/auth/connect/existing.blade.php @@ -0,0 +1,13 @@ +@extends('layouts.ninja') +@section('meta_title', ctrans('texts.success')) + +@section('body') +
+
+ +
+ +

You have already configured a Stripe Connect account.

+ Click here to continue. +
+@endsection diff --git a/resources/views/layouts/ninja.blade.php b/resources/views/layouts/ninja.blade.php new file mode 100644 index 000000000000..d0dd62b8067c --- /dev/null +++ b/resources/views/layouts/ninja.blade.php @@ -0,0 +1,115 @@ + + + + + + + @if (config('services.analytics.tracking_id')) + + + + @else + + @endif + + + + @auth() + + @endauth + + @guest + @yield('meta_title', '') — {{ config('app.name') }} + @endguest + + + + + + + + + + + + + + + + + + + + + + @livewireStyles + + {{-- Feel free to push anything to header using @push('header') --}} + @stack('head') + + + + + + + @if(session()->has('message')) +
+ {{ session('message') }} +
+ @endif + + @yield('body') + + @livewireScripts + + + + + + + +