I did something similar a few month ago.
This is my "old" controller before I switched everything to Livewire to make it smoother :)
Maybe this helps:
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Jobs\CreateServer;
use App\Models\Customer;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Support\Arr;
use Illuminate\Http\Request;
use Stripe\{Subscription, PaymentMethod, Checkout\Session};
use Stripe\Customer as StripeCustomer;
class RegisterController extends Controller
{
use RegistersUsers;
protected $redirectTo = '/backend/dashboard';
public function showRegistrationForm()
{
return view('auth.register')->with([
'failed' => false
]);
}
public function success( Request $request )
{
$sessionId = $request->input('session_id');
$session = Session::retrieve($sessionId);
$customer = Customer::find($session->client_reference_id);
$sub = Subscription::retrieve($session->subscription);
$paymentMethod = PaymentMethod::retrieve($sub->default_payment_method);
$customer->update([
'stripe_id' => $session['customer'],
'card_brand' => $paymentMethod->card['brand'],
'card_last_four' => $paymentMethod->card['last4']
]);
$subscription = $customer->subscriptions()->create([
'name' => 'default',
'stripe_id' => $session->subscription,
'stripe_status' => 'active',
'stripe_plan' => Arr::get($session, 'display_items.0.plan.id'),
'quantity' => 1,
'trial_ends_at' => null,
'ends_at' => null,
]);
$subscription->items()->create([
'stripe_id' => $sub->items->data[0]->id,
'stripe_plan' => Arr::get($session, 'display_items.0.plan.id'),
'quantity' => 1,
]);
StripeCustomer::update(
$session['customer'],
[
'invoice_settings' => ['default_payment_method' => $paymentMethod->id],
]
);
if ( $customer->vat ) {
StripeCustomer::createTaxId(
$session['customer'],
[
'type' => 'eu_vat',
'value' => $customer->vat
]
);
}
CreateServer::dispatch($customer);
return view('auth.success')->with([
'customer' => $customer
]);
}
public function failed( Request $request )
{
$sessionId = $request->input('session_id');
$session = Session::retrieve($sessionId);
Customer::find($session->client_reference_id)
->delete();
return view('auth.register')->with([
'failed' => true,
]);
}
}