Laravel×Stripe Checkout実装記録①公式ドキュメントを起点に進めて、サンドボックスで決済とWebhookを確認するまで

Laravel

はじめに

この記事は、
Stripeを使った決済機能を「きれいに解説する」ためのものではありません。

Laravelのサンプルプロジェクトに
Stripe Checkoutを組み込み、
どこで迷い、何を確認し、どこまで進めたのかを
そのまま残したテスト実装の記録です。

今回は、本番環境ではなく
Stripeのサンドボックス(テスト環境)を使い、
日本語ドキュメントを起点に進めてみました。

なお、結論から言うと、
日本語ドキュメントだけでスムーズに実装できたわけではありません。
途中で立ち止まり、調べ、試し直しながら進める形になりました。

実装にあたっては、公式ドキュメントに加えて ChatGPT にも相談していますが、
提示された内容をそのまま採用するのではなく、
実際に動かして確認しながら取捨選択しています。

今回のテスト実装環境

今回のテスト実装は、以下の環境で行いました。

Laravel:10.48
PHP:8.4
ローカル開発環境:macOS
Stripe:テストモード(サンドボックス)

バージョン差による挙動の違いは考慮しておらず、
あくまで一例としての記録になります。

Stripeの日本語サイトとアカウント作成

アカウント作成後、
初期設定の案内がいくつか表示されますが、
今回の目的は「まず動かしてみる」ことだったため、
スキップできる項目は一旦スキップしました。

サンドボックス(テスト環境)で試すことにした

いきなり本番環境で試すのは不安だったため、
まずはサンドボックスで検証することにしました。

サンドボックスについては、stripe公式日本語ドキュメントを参照しています。

テスト用の決済環境が用意されている点は安心感がありますが、
設定が終わったあとに
「さて、次に何をすればいいのか?」
と一度立ち止まることになりました。

とりあえず導入方法を確認する

全体の流れを掴むため、
まずは公式の「Get started」ページを確認しました。

一般的なユースケースが並んでいますが、
どれがStripe Checkout向けなのかが分かりづらく
ここで少し迷います。

そこ後辿り着いたのが、
決済ページを構築するためのCheckoutのQuickstartでした。

Checkout Quickstartをもとに実装を進める

フロントエンドHTML / バックエンドPHPを選択

Quickstartでは、
フロントエンドとバックエンドの構成を選択します。

今回は、

・フロントエンド:HTML
・バックエンド:PHP

を選択しました。

PHP向けの初期手順はこちらです。


Stripe PHPライブラリのインストール

Laravelプロジェクトに、
Stripe公式のPHPライブラリを追加します。

composer require stripe/stripe-php

ここまではスムーズに進みました。


Checkoutセッション作成でつまづいた点

日本語ドキュメントだけでは実装が難しかった

次のステップとして出てくる
「Checkout セッションを作成する」部分で手が止まりました。

日本語ドキュメントだけでは、
Laravelでどう組み込めばいいのかが掴めず、
この部分は英語ドキュメントも併せて確認することになります。


テスト商品(500円)で一度動かす判断

細かい設計を考える前に、
まずは一度「動かす」ことを優先し、
固定金額のテスト商品(500円)で進める判断をしました。

この判断で、
実装の全体像が少し見えるようになりました。

実装の流れ

・route作成(web.php)
・Controller作成
・Stripeキーを services.php に登録
・画面(購入ページ・成功ページ・キャンセルページ)を作る

動作確認の流れ

 1. /checkout にアクセス
 2. ボタン押す
 3. Stripeの決済ページに飛ぶ
 4. テストカードで支払い
 5. /checkout/success に戻る
 6. Stripeダッシュボード(サンドボックス)に支払いが出る


テスト決済で確認したこと

テストカードとは何か

次に戸惑ったのが、
「テスト決済ではどのカード番号を使うのか?」という点です。

Stripeには、用途別に複数のテストカードが用意されています。

・4242 4242 4242 4242 : 成功するテストカード
・4000 0025 0000 3155 : 認証(3Dセキュア)が必要なテストカード
・4000 0000 0000 9995 : 拒否されるテストカード

最初は分かりませんでしたが、
公式ドキュメントやChatGPTで調べ整理することで理解できました。


ポート4242の記述について

ドキュメント内には
localhost:4242 といった記述が出てきます。

Laravelのフレームワークを使っている場合、
このポート番号を特別に意識する必要はありません。

ここも一度つまずきましたが、
結果的には問題なく進められました。


成功・認証必要・拒否のテストカードを試す

それぞれのテストカードで決済を行い、
挙動の違いを確認しました。

成功時には、

・successページへ戻る
・Stripeダッシュボード(テストモード)に売上が反映される

ことを確認できました。

成功するテストカードの結果:success_urlへ遷移
認証必要なテストカード:認証成功(COMPLETE)ならsuccess_urlへ。
認証必要なテストカード:認証失敗(FAIL)なら決済画面にその旨表示される。
拒否テストカード:拒否の旨が決済ページに表示される。

商品カタログを使う形に切り替えた理由

固定のテスト商品だけでは限界を感じた

ここまでで、
固定のテスト商品(500円)の販売テストはできました。

ただ、この状態では
Stripeの商品カタログで作成した商品が
実装に反映されていません。

毎回コードを修正する形では使いづらいため、
商品カタログを使う形に切り替えることにしました。


Stripeの商品カタログを採用してみた所感

Stripe側で商品や価格を管理できるため、
商品追加や価格変更の手間が減る点は便利だと感じました。

一方で、
アプリケーション側の商品データとの紐付けや、
表示用の情報(画像がない場合、表示順調整など)は、
別途考慮が必要になります。

今回のテスト実装では、
「決済の流れを確認する」ことが目的だったため、
Stripeの商品カタログをそのまま使う形で十分だと判断しました。


本番手前まで進めるためにWebhookを確認する

決済が動くだけでなく、
「支払いが確定した」という事実を受け取るには
Webhookが必要になります。

Webhookは、Stripe側で起きた決済結果を、
アプリケーションのサーバーへ通知する仕組みです。

「successページに戻ること」と「支払い完了」は別物であり、
本番運用ではWebhookが基準になります。


Stripe CLIを使ったWebhook検証

Stripe CLIの導入とログイン

ローカル環境でWebhookを検証するため、
Stripe CLIを導入しました。

brew install stripe/stripe-cli/stripe

インストール確認:

stripe --version

Stripeへのログイン:

stripe login

Webhook設定の流れ(テスト環境)

テスト環境で行ったWebhook設定は次の通りです。

・Webhook受け口のURLをLaravelに作成(api.php)
・Webhook用Controllerを作成
・.env にテスト用Webhook Secretを設定
・Stripe CLIでローカル転送を開始
・テストイベントを送信、または実際に決済して確認

この過程で、

・テスト用と本番用のWebhook Secretは別
・本番環境ではHTTPSの公開URLが必要
・Webhookが「正」、successページは「表示」

という点も整理できました。


今回はログ確認までで区切る

今回は、

・Checkoutが動く
・売上がダッシュボードに反映される
・Webhookがローカルに届く
・checkout.session.completed をログで確認できる

ところまで進めた時点で、
テスト実装としては十分だと判断しました。

注文データの保存や二重処理対策などは、
本番寄りの設計になるため、今回は扱っていません。


おわりに

Stripeは機能が多く、
最初から全体像を理解しようとすると
少し構えてしまいます。

ただ、

日本語ドキュメントを起点に
分からないところで立ち止まり
実際に動かしながら確認する

という進め方でも、
理解は着実に進むと感じました。

同じように
「LaravelでStripe決済を試してみたい」と考えている方の
参考になれば幸いです。


補足メモ(本番移行時に注意すること)

・テスト用と本番用のWebhook Secretは必ず分ける
・本番環境ではHTTPSの公開URLが必要
・Webhookを基準に処理を設計する

今回は、ここまで。

※今回のStripe実装について、
実装中に考えていたことや試行錯誤の流れを、
noteの方にも記録として残しています。
少し違った視点になりますが、よければこちらもどうぞ。

あさき|学びを言語化するnote更新中
「LaravelでStripe Checkoutを触ってみた記録」


この記事はいかがでしたか?
本記事が参考になったり、今後の活動を応援していただける方は、
以下からARSYAへのチップを受け付けております。
応援いただけると幸いです。

コメント

タイトルとURLをコピーしました