【大まかな手順】
バックエンドでセッションを作る。
↓
フロントエンド側に渡す。
↓
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');
});