StripeのCheckout機能を利用する

【大まかな手順】

バックエンドでセッションを作る。

フロントエンド側に渡す。

Stripeチェックアウト


【実際の手順】
◯Stripe側

設定⇒CheckoutとPayment Links

商品の管理

商品の追加

◯Laravel側
ライブラリの登録
composer require stripe/stripe-php

◯Stripe側
開発者

APIキー
 公開可能キー
 シークレットキー

◯Laravel側
.envファイルへ登録

config/services.phpへ下記コード貼り付け
'stripe' => [
 'pb_key'=>env('STRIPE_PUBLIC'),
 'st_key'=>env('STRIPE_SECRET'),
 ],

web.php
use App\Http\Controllers\StripeController;
// 省略
// Route::get('/dashboard', function () {
// return view('dashboard');
// })->middleware(['auth', 'verified'])->name('dashboard');
Route::get('/dashboard', [StripeController::class, 'start'])->name('dashboard');
Route::get('/success/{id}', [StripeController::class, 'success'])->name('success');
Route::get('/cancel', [StripeController::class, 'cancel'])->name('cancel');

resources/views/dashboard.blade.php
{{-- {{ __("You're logged in!") }} --}}
<script src="https://js.stripe.com/v3/"></script>
<button id="checkout-button" class="text-white text-xl font-semibold bg-blue-700
hover:bg-blue-800 focus:outline-none focus:ring-4 focus:ring-blue-300 font-medium rounded-full
text-sm px-5 py-2.5 text-center mr-2 mb-2 dark:bg-blue-600 dark:hover:bg-blue-700
dark:focus:ring-blue-800">購入ボタン</button>
<div id="error-message"></div>
<script>
 var stripe = Stripe("{{config('services.stripe.pb_key')}}");
 var checkoutButton = document.getElementById('checkout-button');
 var displayError = document.getElementById('error-message');
 checkoutButton.addEventListener('click', function() {
 stripe.redirectToCheckout({sessionId: "{{ $session->id }}"})
 .then(function (result) {
 if (result.error) {
 console.log(result.error);
 }
 });
 });
</script>
①パブリックキー取得
②コントローラー側からセッションIDを取得

app/Http/Controllers/StripeController.php

public function start() {
 $stripe = new \Stripe\StripeClient(config('services.stripe.st_key'));
 $url = 'http://127.0.0.1:8000';
 $id = auth()->user()->id;
 $session = $stripe->checkout->sessions->create([
 'payment_method_types' => ['card'],
 'line_items' => [[
 'price' => '商品キー情報',
 'quantity' => 1,
 ]],
 'mode' => 'payment',
 'success_url' => $url.'/success/'.$id,
 'cancel_url' => $url.'/cancel',
 ]);
 return view('dashboard', ['session' => $session]);
 }

php artisan make:migration add_role --table=users
public function up(): void
 {
 Schema::table('users', function (Blueprint $table) {
 $table->string('role')->default('user')->after('email');
 });
 }
 public function down(): void
 {
 Schema::table('users', function (Blueprint $table) {
 $table->dropColumn('role');
 });
 }

php artisan migrate

app/Http/Controllers/StripeController.php
use App\Models\User;
class StripeController extends Controller
{
// 省略

 public function success(Request $request, $id) {
 $user=User::find($id);
 $user->role = 'premium';
 $user->save();

 return redirect()->route('dashboard')->with('message', 'メッセージ');
 } 

app/Http/Controllers/StripeController.php
public function cancel() {
 return redirect()->route('dashboard')->with('message', 'お支払いがキャンセル');
 }

resources/views/dashboard.blade.php
 @if(session('message'))
 <div class="border px-4 py-3 mt-2 rounded relative bg-green-100 text-green-700">
 {{session('message')}}
 </div>
 @endif

役割によってページや動作に制限をかける方法
Gate:ユーザー一覧ページを非表示
app/Providers/AuthServiceProvider.php
use Illuminate\Support\Facades\Gate;

public function boot()
{
    Gate::define('admin', function ($user) {
        foreach ($user->roles as $role) {
            if ($role->name == 'premium') {
                return true;
            }
        }
        return false;
    });
}

resources/views/layouts/navigation.blade.php
@can('admin')
省略
@endcan


Middleware:操作不可能
web.php
Route::middleware(['can:Gateの名前, (引数)'])->group(function(){

     ルート設定;

});

例)
Route::middleware(['auth', 'can:admin'])->group(function () {
    Route::get('profile/index', [ProfileController::class, 'index'])->name('profile.index');
});