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をログイン中のユーザーに紐づけて保存します。
これで、子アカウントを紐付けて登録することができました。
次回はこのアカウントを用いて、実際に決済をする流れを書きたいと思います。