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');
});
ドロップダウンが表示されない
どのタイミングからかは分からないが右上のユーザー名(ブラウザを狭めた時のハンバーガーメニュー)を押してもドロップダウンが表示されなくなり、ログアウトができなくなった。 心当たりは全くないがSwiper.jsを導入したあたりからそうなった。
チャットGPTによる返答(↓)
Swiper.jsとAlpine.jsの併用によって発生する問題は、JavaScriptのイベントハンドリングやDOMの操作において、互いに干渉することが考えられます。こうした場合、特にAlpine.jsで実装されたドロップダウンが正常に動作しなくなる原因として、以下の点をチェックすると良いでしょう。
-
JavaScriptのエラーの確認
- ブラウザの開発者ツールのコンソールタブを開き、エラーメッセージが出ていないか確認してください。エラーメッセージがあれば、それが何を指しているのか特定する手がかりになります。
-
Alpine.jsの初期化タイミング
- Swiper.jsとAlpine.jsがどの順番でロードおよび初期化されているかを確認してください。Alpine.jsがSwiper.jsより先に初期化されていると、SwiperによるDOMの改変がAlpine.jsの挙動に影響を与える可能性があります。
-
コンポーネントの隔離
-
js/app.jsの内容確認
js/app.js
ファイルの中身を確認して、Alpine.jsの初期化コードや、どのようにSwiper.jsが設定されているかを確認してください。また、他のJavaScriptライブラリとのコンフリクトがないかも確認しましょう。
CSSが適用されない!
Laravel Mixのビルドプロセスの実行
npm run dev
npm run prod
Laravelのストレージリンクを確認
php artisan storage:link
webpack.mix.js ファイルを確認
npm install tailwindcss autoprefixer --save-dev
↓
const mix = require('laravel-mix');
require('dotenv').config();
// PostCSSプラグインのインポート
const tailwindcss = require('tailwindcss');
/*
|--------------------------------------------------------------------------
| Mix Asset Management
|--------------------------------------------------------------------------
|
| Mix provides a clean, fluent API for defining some Webpack build steps
| for your Laravel applications. By default, we are compiling the CSS
| file for the application as well as bundling up all the JS files.
|
*/
mix.js('resources/js/app.js', 'public/js')
.postCss('resources/css/app.css', 'public/css', [
tailwindcss, // Tailwind CSSを指定
require('autoprefixer'), // ベンダープレフィックスの自動追加
]);
package.jsonファイルの "devDependencies"にpostcss-importがない
npm install postcss-import --save-dev
npm audit fix