【個人開発の収益化】Laravel CashierとStripeで「サブスクリプション課金機能」を最短で実装するハンズオン

Laravel

Webサービスを個人開発したり、クライアントから案件を受けたりする際、最大の難関の一つが「決済機能」の実装ではないでしょうか?

  • 「クレジットカード情報を安全に扱う自信がない…」
  • 「サブスクリプション(定期課金)の仕組みを作るのは複雑そう…」
  • 「領収書の発行やカード情報の変更ページまで作るのは大変…」

そんな悩みを一発で解決してくれるのが、「Stripe(ストライプ)」と、Laravel公式パッケージ「Laravel Cashier(キャッシャー)」の組み合わせです。

この記事では、Laravelアプリケーションに、Stripeを使ったサブスクリプション課金機能を導入する手順を、実際のコードを交えて解説します。

なぜ Stripe × Laravel Cashier なのか?

  1. 開発者体験が最高: StripeはAPIが非常に使いやすく、ドキュメントも充実しています。
  2. セキュリティも安心: クレジットカード情報はStripe側で管理されるため、自分のサーバーで機密情報を保持するリスクがありません。
  3. Cashierが面倒な処理を代行: 定期課金の更新、支払いの失敗時の再試行、領収書PDFの生成など、複雑なバックエンド処理をLaravel Cashierが肩代わりしてくれます。

前提条件

  • Laravelプロジェクトが作成済みであること
  • Stripeのアカウント(無料)を作成済みであること

Step 1: StripeのAPIキーを取得する

まず、Stripeのダッシュボードにログインし、「開発者」→「APIキー」から以下の2つを取得します。

  • 公開可能キー (Publishable Key)
  • シークレットキー (Secret Key)

これらを、Laravelプロジェクトの .env ファイルに設定します。

STRIPE_KEY=pk_test_xxxxxxxxxxxxx
STRIPE_SECRET=sk_test_xxxxxxxxxxxxx

Step 2: Laravel Cashierのインストール

Composerを使ってパッケージをインストールします。

composer require laravel/cashier

インストール後、データベースのマイグレーションを実行します。Cashierは users テーブルにStripeの顧客IDなどを保存するためのカラムを自動で追加してくれます。

php artisan migrate

Step 3: Userモデルのセットアップ

App\Models\User モデルに、Cashierの Billable トレイトを追加します。これだけで、UserモデルからStripeの機能が使えるようになります。

use Laravel\Cashier\Billable; // 追加

class User extends Authenticatable
{
    use Billable; // 追加
    // ...
}

Step 4: Stripeで「商品(プラン)」を作成する

Stripeのダッシュボードで、販売したいサブスクリプション商品を作成します。
(例:月額500円の「プレミアムプラン」)

作成後、その商品の 「API ID(例: price_xxxxxxxxx)」 をコピーしておきます。

Step 5: 課金処理の実装(コントローラー)

ここが一番のポイントです。
ユーザーがクレジットカード情報を入力し、「申し込む」ボタンを押した時の処理を記述します。

use Illuminate\Http\Request;

public function subscribe(Request $request)
{
    $user = $request->user();

    // フォームから送信された決済方法ID (PaymentMethod ID)
    $paymentMethodId = $request->input('payment_method');

    // Stripeの商品ID (ダッシュボードで作成したもの)
    $priceId = 'price_xxxxxxxxxxxxx';

    try {
        // 新規サブスクリプションを作成
        $user->newSubscription('default', $priceId)
            ->create($paymentMethodId);

        return redirect()->route('dashboard')->with('success', 'プレミアムプランに登録しました!');

    } catch (\Exception $e) {
        return back()->withErrors(['message' => '決済に失敗しました: ' . $e->getMessage()]);
    }
}

たったこれだけのコードで、顧客の作成、カード情報の保存、定期課金の開始までが完了します。

Step 6: クレジットカード入力フォーム(フロントエンド)

Stripeが提供する Stripe.js を使えば、セキュリティ万全なカード入力フォームを簡単に作ることができます。

<form id="payment-form" action="{{ route('subscribe') }}" method="POST">
    @csrf
    <div id="card-element"></div>

    <button id="card-button" data-secret="{{ $intent->client_secret }}">
        申し込む
    </button>
</form>

<script src="https://js.stripe.com/v3/"></script>
<script>
    const stripe = Stripe("{{ env('STRIPE_KEY') }}");
    const elements = stripe.elements();
    const cardElement = elements.create('card');
    cardElement.mount('#card-element');

    // ... フォーム送信時にStripeと通信し、payment_methodを取得するJSコード
</script>

(※実際のJSコードは少し長くなるため、公式ドキュメントや解説記事を参照してください)

おまけ:顧客ポータル機能

さらに凄いのが、「顧客ポータル」機能です。
ユーザーが自分で「支払い方法の変更」「領収書のダウンロード」「サブスクリプションのキャンセル」を行えるページを、Stripeがホスティングしてくれます。

Laravel側では、そのページへのリンクを生成するだけです。

// 顧客ポータルへのリダイレクトURLを生成
$url = $request->user()->billingPortalUrl(route('dashboard'));
return redirect($url);

これを使えば、面倒なマイページ機能を自作する必要がなくなります。

まとめ

Laravel CashierとStripeを使えば、個人開発レベルでも、大企業並みの堅牢で高機能な決済システムを短時間で構築できます。

「決済機能の実装」という重荷を下ろして、サービスのコアとなる機能開発に集中できるのが最大のメリットです。ぜひ、あなたのサービスにも導入して、収益化の第一歩を踏み出してみてください!

コメント

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