From eef9065f08e9a732c4991102771a435eee4226d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20Beganovi=C4=87?= Date: Tue, 20 Apr 2021 16:08:33 +0200 Subject: [PATCH] wip --- .../Controllers/OneTimeTokenController.php | 7 +-- .../Controllers/StripeConnectController.php | 45 ++++++++++++++ .../InitializeStripeConnectRequest.php | 55 ++++++++++++++++++ app/PaymentDrivers/Stripe/Connect/Account.php | 58 ++++++++++++------- config/ninja.php | 1 + ...21_04_12_095424_stripe_connect_gateway.php | 18 +++--- routes/api.php | 5 ++ 7 files changed, 155 insertions(+), 34 deletions(-) create mode 100644 app/Http/Controllers/StripeConnectController.php create mode 100644 app/Http/Requests/StripeConnect/InitializeStripeConnectRequest.php diff --git a/app/Http/Controllers/OneTimeTokenController.php b/app/Http/Controllers/OneTimeTokenController.php index 34b6ca8fb974..c63fb2d8755f 100644 --- a/app/Http/Controllers/OneTimeTokenController.php +++ b/app/Http/Controllers/OneTimeTokenController.php @@ -67,19 +67,18 @@ class OneTimeTokenController extends BaseController */ public function create(OneTimeTokenRequest $request) { - $hash = Str::random(64); $data = [ 'user_id' => auth()->user()->id, - 'company_key'=> auth()->company()->company_key, - 'context' => $requst->input('context'), + 'company_key'=> auth()->user()->company->company_key, + 'context' => $request->input('context'), ]; Cache::put( $hash, $data, 3600 ); return response()->json(['hash' => $hash], 200); - + } public function router(OneTimeRouterRequest $request) diff --git a/app/Http/Controllers/StripeConnectController.php b/app/Http/Controllers/StripeConnectController.php new file mode 100644 index 000000000000..a109cde3fee8 --- /dev/null +++ b/app/Http/Controllers/StripeConnectController.php @@ -0,0 +1,45 @@ +getTokenContent(); + + $data = [ + 'email' => 'user@example.com', + 'country' => 'US', + ]; + + $account = Account::create($data); + + $link = Account::link($account->id); + + // Store account->id into company_gateways. + + return redirect($link['url']); + } +} diff --git a/app/Http/Requests/StripeConnect/InitializeStripeConnectRequest.php b/app/Http/Requests/StripeConnect/InitializeStripeConnectRequest.php new file mode 100644 index 000000000000..0d3a333c80e9 --- /dev/null +++ b/app/Http/Requests/StripeConnect/InitializeStripeConnectRequest.php @@ -0,0 +1,55 @@ +input('token')); + + abort_if(!$data, 404); + + return $data; + } +} diff --git a/app/PaymentDrivers/Stripe/Connect/Account.php b/app/PaymentDrivers/Stripe/Connect/Account.php index a9bbff1bdc09..f039a90aaefd 100644 --- a/app/PaymentDrivers/Stripe/Connect/Account.php +++ b/app/PaymentDrivers/Stripe/Connect/Account.php @@ -12,24 +12,40 @@ namespace App\PaymentDrivers\Stripe\Connect; -use App\Exceptions\PaymentFailed; -use App\Http\Requests\Request; -use App\Jobs\Mail\PaymentFailureMailer; -use App\Jobs\Util\SystemLogger; -use App\Models\ClientGatewayToken; -use App\Models\GatewayType; -use App\Models\Payment; -use App\Models\PaymentType; -use App\Models\SystemLog; -use App\PaymentDrivers\StripePaymentDriver; -use App\Utils\Traits\MakesHash; -use Exception; -use Stripe\Customer; -use Stripe\Exception\CardException; -use Stripe\Exception\InvalidRequestException; - class Account { + /** + * @throws \Stripe\Exception\ApiErrorException + */ + public static function create(array $payload): \Stripe\Account + { + $stripe = new \Stripe\StripeClient( + config('ninja.stripe_private_key') + ); + + return $stripe->accounts->create([ + 'type' => 'standard', + 'country' => $payload['country'], + 'email' => $payload['email'], + ]); + } + + /** + * @throws \Stripe\Exception\ApiErrorException + */ + public static function link(string $account_id): \Stripe\AccountLink + { + $stripe = new \Stripe\StripeClient( + config('ninja.stripe_private_key') + ); + + return $stripe->accountLinks->create([ + 'account' => $account_id, + 'refresh_url' => 'http://localhost:8080/stripe_connect/reauth', + 'return_url' => 'http://localhost:8080/stripe_connect/return', + 'type' => 'account_onboarding', + ]); + } /*** If this is a new account (ie there is no account_id in company_gateways.config, the we need to create an account as below. @@ -148,7 +164,7 @@ class Account // now we start the stripe onboarding flow // https://stripe.com/docs/api/account_links/object -// +// /** * $stripe = new \Stripe\StripeClient( 'sk_test_4eC39HqLyjWDarjtT1zdp7dc' @@ -162,7 +178,7 @@ $stripe->accountLinks->create([ */ /** - * Response = + * Response = * { "object": "account_link", "created": 1618869558, @@ -177,11 +193,11 @@ $stripe->accountLinks->create([ // What next? -// +// // Now we need to create a superclass of the StripePaymentDriver, i believe the only thing we need to change is the way we initialize the gateway.. /** - * + * \Stripe\Stripe::setApiKey("{{PLATFORM_SECRET_KEY}}"); <--- platform secret key = Invoice Ninja secret key \Stripe\Customer::create( ["email" => "person@example.edu"], @@ -191,4 +207,4 @@ $stripe->accountLinks->create([ */ -} \ No newline at end of file +} diff --git a/config/ninja.php b/config/ninja.php index 81376365d85b..e7c6c2e9b2b9 100644 --- a/config/ninja.php +++ b/config/ninja.php @@ -147,4 +147,5 @@ return [ 'webcron_secret' => env('WEBCRON_SECRET', false), 'disable_auto_update' => env('DISABLE_AUTO_UPDATE', false), 'invoiceninja_hosted_pdf_generation' => env('NINJA_HOSTED_PDF', false), + 'stripe_private_key' => env('STRIPE_PRIVATE_KEY', null), ]; diff --git a/database/migrations/2021_04_12_095424_stripe_connect_gateway.php b/database/migrations/2021_04_12_095424_stripe_connect_gateway.php index 110c36582dde..fa80f8d40b16 100644 --- a/database/migrations/2021_04_12_095424_stripe_connect_gateway.php +++ b/database/migrations/2021_04_12_095424_stripe_connect_gateway.php @@ -1,5 +1,7 @@ 56, - 'name' => 'Stripe Connect', - 'provider' => 'StripeConnect', - 'sort_order' => 1, - 'key' => 'd14dd26a47cecc30fdd65700bfb67b34', + 'id' => 56, + 'name' => 'Stripe Connect', + 'provider' => 'StripeConnect', + 'sort_order' => 1, + 'key' => 'd14dd26a47cecc30fdd65700bfb67b34', 'fields' => '{"apiKey":"", "publishableKey":""}' ]; Gateway::create($gateway); - if(Ninja::isNinja()) - { + if (Ninja::isNinja()) { Gateway::where('id', 20)->update(['visible' => 0]); Gateway::where('id', 56)->update(['visible' => 1]); } - Model::guard(); - + Model::reguard(); } /** diff --git a/routes/api.php b/routes/api.php index a527ad0a6ae4..7a471a4c3178 100644 --- a/routes/api.php +++ b/routes/api.php @@ -187,6 +187,11 @@ Route::match(['get', 'post'], 'payment_webhook/{company_key}/{company_gateway_id ->name('payment_webhook'); Route::post('api/v1/postmark_webhook', 'PostMarkController@webhook'); + Route::get('token_hash_router', 'OneTimeTokenController@router'); + Route::get('webcron', 'WebCronController@index'); + +Route::get('stripe_connect/{token}', 'StripeConnectController@initialize')->name('stripe_connect.initialization'); + Route::fallback('BaseController@notFound');