Laravel8でStripe ConnectのStandardアカウントを作成する

Laravel8でStripe Connectを使ってみたので、内容をまとめておきます。
本記事ではStripe ConnectのアカウントはStandardを使用します。

Laravelのバージョンは「8.41.0」で実装しています。

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

まず、公式のライブラリをインストールします。

composer require stripe/stripe-php

必要なAPIキーの定義

StripeのAPIを実行するために、APIキーを定義しておきます。
APIキーはStripe管理画面の「開発者」→「APIキー」で確認できます。

「公開可能キー」と「シークレットキー」の2つが必要です。

configで読み込み可能とするため、.envファイルとapp.phpに追加します。

STRIPE_PUBLIC=pk_XXXXXXXXXX
STRIPE_SECRET=sk_XXXXXXXXXX
<?php

return [
    ・
    ・
    ・
    (省略)

    'stripe_public' => env('STRIPE_PUBLIC'),
    'stripe_secret' => env('STRIPE_SECRET'),
];

ユーザー登録とログイン認証を実装

Stripeの子アカウントと、ユーザーを紐付けて管理するために、ユーザーの登録とログイン認証を実装します。
ログイン認証はLaravel8から「jetstream」を使用するように変わりました。

ただ、ちょっと敷居が高いと感じるため、本記事ではLaravel7までの「laravel/ui」を使用する方式で進めます。
Laravel8での「laravel/ui」の使い方は以下の記事が分かりやすかったです。

https://qiita.com/daisu_yamazaki/items/b946594896179abcd203

なお、公式ドキュメントでは「連結されたアカウント」と表記されていますが、分かりやすさのため、本記事では子アカウントと記載します。

Stripeの子アカウントIDを保存するカラムを追加

Laravel標準でusersテーブルが用意されているので、それを利用します。

マイグレーションファイルを作成

php artisan make:migration add_stripe_user_id_to_users --table=users

マイグレーションファイルを編集

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class AddStripeUserIdToUsers extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->string('stripe_user_id')->nullable()->after('id');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->dropColumn('stripe_user_id');
        });
    }
}

Stripe Connectの設定

Stripeの管理画面で、Stripe Connectの設定を行います。
「設定」から「Connect」の設定をクリックします。

クライアントIDをコピー

後でクライアントIDを使用するので、コピーしておきます。

OAuth設定

Standardアカウントでは、アカウント登録にOAuthが利用できるので、「Standard アカウントの OAuth」をONにします。

リダイレクト

OAuth認証完了後のリダイレクト先のURLを指定します。
本記事ではローカル環境で確認する例を記載するので、以下の通りとしておきます。

http://localhost:10080/connect

OAuth認証と子アカウントのID取得を実装

まず、上記でコピーしておいたクライアントIDを定義します。

CONNECT_CLIENT_ID=ca_XXXXXXXXXX
<?php

return [
    ・
    ・
    ・
    (省略)

    'stripe_connect_client_id' => env('CONNECT_CLIENT_ID'),
];

ビューの実装

本記事では例として、既存のhome.blade.phpを変更する形とします。

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">{{ __('Dashboard') }}</div>

                <div class="card-body">
                    @if (session('status'))
                        <div class="alert alert-success" role="alert">
                            {{ session('status') }}
                        </div>
                    @endif

                    @if( empty(Auth::user()->stripe_user_id) )
                        <a href="https://connect.stripe.com/oauth/authorize?response_type=code&client_id={{ config('app.stripe_connect_client_id')}}&scope=read_write&redirect_uri={{ config('app.url') }}/connect" class="btn btn-primary">Stripeアカウントを作成する</a>
                    @endif
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

17行目で、子アカウントが設定されていないユーザーを対象として、OAuth認証用のリンクを表示する形にしています。

OAuth認証用のURL:https://connect.stripe.com/oauth/authorize

パラメータは以下を付与します。

  • response_type:code(固定)
  • client_id:Stripe管理画面からコピーしたクライアントID(configから取得)
  • scope:read_write(固定)
  • redirect_uri:Stripe管理画面に定義したOAuth認証完了後のリダイレクト先のURL

このURLにアクセスすると、Stripeの登録、ログイン画面が表示されます。
Stripeアカウントを持っていない場合は新規登録、持っている場合は既存のアカウントでログイン、という流れになります。

コントローラーの実装

OAuth認証が完了してリダイレクトされてきた際の処理を実装します。

まず、以下のようにルーティング設定を追加します。

Route::get('/connect', [\App\Http\Controllers\HomeController::class, 'connect'])->name('connect');

コントローラーは以下のように実装します。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Stripe\OAuth;
use Stripe\Stripe;

class HomeController extends Controller
{
    ・
    ・
    ・
    (省略)

    /**
     * Connectの子アカウント作成
     * @return \Illuminate\Contracts\Support\Renderable
     */
    public function connect(Request $request)
    {
        $code = $request->query('code');
        if (empty($code)) {
            return redirect('/home');
        }

        Stripe::setApiKey(config('app.stripe_secret'));

        // アクセストークン取得
        $params = [
            'grant_type' => 'authorization_code',
            'code' => $code,
        ];
        $response = OAuth::token($params);

        // StripeアカウントIDを保存
        $user = Auth::user();
        $user->stripe_user_id = $response->stripe_user_id;
        $user->save();

        return redirect('/home');
    }
}

OAuth認証が完了してリダイレクトされると、パラメータにコードが付いてくるので、23行目で取得します。
このコードが認証に必要なコードになります。

35行目で、そのコードを用いてアクセストークンを取得します。

アクセストークンが取得できると、そのレスポンスの中にStripeのアカウントIDが保存されているので、IDをログイン中のユーザーに紐づけて保存します。

これで、子アカウントを紐付けて登録することができました。
次回はこのアカウントを用いて、実際に決済をする流れを書きたいと思います。