laravel ✕ Stripe サブスクや単発の決済実装の体験記（設定編）

## 概要

- laravelで提供しているアプリケーションでStripeを使った決済を実装してみる。

## 前提

- 設定はすべてStripeのテスト環境で行う。　テスト環境ならどんな設定をしても料金の徴収が発生することはない。

## 流れ

1. laravel cashierを入れる。
1. Stripeに登録する。（テスト環境なら無料）
1. 税務自動処理の有効化
1. テストの商品を登録
1. APIキーの取得と.envの記載
1. コード側の税の自動計算設定
1. 疎通確認

## 方法

1. laravel cashierを入れる。
    1. 下記を実行してパッケージを入れる。本ライブラリはStripe公式が出している`stripe/stripe-php`のパッケージを完全にラップしている。ただし一部の機能はカバーしていないので必要な場合は`stripe/stripe-php`の方で用意されている処理を直接呼び出す必要がある。なお、下記パッケージを入れると`stripe/stripe-php`も依存関係でダウンロードされる。カバーしていない仕組みを使いたい場合、改めて`composer require stripe/stripe-php`を実行する必要はなさそうだ。

        ```shell
        composer require laravel/cashier
        ```

    1. 下記を実行してマイグレーションを行う。おそらくusersテーブルへのカラム追加とsubscription_itemsとsubscriptionsというテーブルが追加される。

        ```shell
        php artisan migrate
        ```

    1. Userモデルのクラスを開き、Billableトレイトをuserする。

        ```app/Models/User.php
        use Laravel\Cashier\Billable;

        use Billable; // クラス定義の中に記載する
        ```
    1. 下記を実行し、ルーティングの一覧を出力し、`GET|HEAD   stripe/payment/{id}`と`POST       stripe/webhook`のルーティングが追加されていることを確認する。

        ```shell
        php artisan route:list
        ```

1. Stripeに登録する。（テスト環境なら無料）
    1. 下記にアクセスする。
        1. [https://stripe.com/jp](https://stripe.com/jp)
    1. 「今すぐ始める」をクリックする。

        ![Cursor_と_Stripe___オンライン決済・決済代行プラットフォーム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/08dd91f5-502d-502d-e924-11ad73bd6354.png)

    1. 各種情報を入力して「アカウントを作成」をクリックする。

        ![新規登録___Stripeのオンライン決済サービスを簡単導入.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/cbba5465-ce31-c066-4bc8-b6900d0c0453.png)

    1. メールが届くので認証する。

        ![Cursor_と_メールアドレスを確認してください_-_miriwo0517_gmail_com_-_Gmail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/1325bf8c-be0e-25c6-6358-9fc13f0136e7.png)

    1. 「支払いの受け取りを設定する」を一旦クリックする。

        ![Cursor_と_ダッシュボード_–_新規ビジネス_–_Stripe__テスト_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/781cad73-78fb-be2b-97ff-d25ba8d064b4.png)

    1. 左上の「✕」をクリックする。

        ![Cursor_と_本番環境利用の申請_–_新規ビジネス_–_Stripe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/dc8df37c-dff0-155d-e2ab-729e9963ba92.png)

    1. ダッシュボードが開く。

        ![Cursor_と_ホーム_–_新規ビジネス_–_Stripe__テスト_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/e28f9226-9148-cf20-4d16-024b4dfc8e39.png)
1. 税務自動処理の有効化
    1. Stripeの左サイドバーの「その他+」をクリックし、「Tax」をクリックする。

        ![Cursor_と_Tax_–_DokuPro_test_–_Stripe__テスト_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/4b49ae27-960d-7108-85d2-9356151b3fda.png)

    1. 「始める」をクリックする。

        ![Cursor_と_Tax_–_DokuPro_test_–_Stripe__テスト_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/a8f2602b-1df0-0a88-e228-184d3e3d7245.png)

    1.  ポップアップが出たら「始める」を更にクリックする。
    1.  概要タブで「税金の設定」をクリックする。

        ![Cursor_と_Tax_–_DokuPro_test_–_Stripe__テスト_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/d6bd51de-0ab0-30ce-af6c-fad4f72d3525.png)

    1. 諸々の情報を入力する。

        ![Cursor_と_税金設定_–_DokuPro_test_–_Stripe__テスト_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/73629780-d826-0824-479d-2eeb5fe9414c.png)

    1. 「登録タブ」をクリックし、「登録を追加」をクリックする。

        ![Cursor_と_Tax_–_DokuPro_test_–_Stripe__テスト_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/dc0847ab-4659-11d3-d464-711e3d6138f2.png)

    1. 国を選択する。

        ![Tax_–_DokuPro_test_–_Stripe__テスト_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/29a329a3-5df1-8e36-ed97-90537f82c836.png)

    1. 税率などが表示されるので確認して「徴収開始日」をクリックする。

        ![Tax_–_DokuPro_test_–_Stripe__テスト_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/8c612df9-9fd3-a062-06a9-ae863b04e3ee.png)

1. テストの商品を登録
    1. Stripeの左サイドバーの「Billing」をクリックする。

        ![Cursor_と_Billing_–_DokuPro_test_–_Stripe__テスト_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/d29dd4f2-2dca-2f3c-7189-032c115539e4.png)

    1. 「テスト商品を追加する」をクリックする。

        ![Cursor_と_Billing_–_DokuPro_test_–_Stripe__テスト_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/fffae6ab-e14c-fdec-249c-1668677565b7.png)

    1. 下記のように設定する。設定が終わったら「商品を追加」をクリックする。

        ![Billing_–_DokuPro_test_–_Stripe__テスト_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/fc17a891-abbe-98b3-7396-24f978b8df8b.png)

    1. 左サイドバーの「その他+」をクリックし、「商品カタログ」をクリックする。

        ![Cursor_と_Billing_–_DokuPro_test_–_Stripe__テスト_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/39bfb6a2-8f96-1f3f-d0ce-5929252761b5.png)

    1. 先程追加した「premium」という商品をクリックして詳細を開く。

        ![Cursor_と_商品カタログ_–_DokuPro_test_–_Stripe__テスト_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/21050a85-8d5d-5e76-5b49-cec06908108f.png)

    1. 「API ID」をコピーしてメモしておく。（疎通確認時に使用する。）

        ![Cursor_と_商品カタログ_–_DokuPro_test_–_Stripe__テスト_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/74e3c65c-4bf6-4aee-4251-f7ca1ebcdc44.png)

1. APIキーの取得と.envの記載
    1. ダッシュボードで「開発者向けAPIキー」をクリックする。

        ![Cursor_と_ホーム_–_新規ビジネス_–_Stripe__テスト_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/7d7c5a12-f3a2-eb64-d2a0-38913b49bb5f.png)

    1. 「公開可能キー」を`STRIPE_KEY`として、「シークレットキー」を`STRIPE_SECRET`として.envに記載する。
    1. その他下記の情報を.envに記載する。

        ```.env
        CASHIER_CURRENCY=ja_JP
        CASHIER_CURRENCY_LOCALE=ja_JP
        CASHIER_LOGGER=daily
        ```

    1. 下記を実行してconfigのキャッシュクリアを行う。

        ```shell
        php artisan config:clear
        ```

    1. `php -m | grep intl`を実行し、ヒットすれば何もしない。ヒットしなかったらphp-intl（ext-intl）という拡張モジュールをインストールする。当該の拡張モジュールは.envの`CASHIER_CURRENCY`で`en`以外を設定するときに必ず必要らしい。
1. コード側の税の自動計算設定
    1. `app/Providers/AppServiceProvider.php`を開き、bootメソッドに下記の内容を追記する。

        ```app/Providers/AppServiceProvider.php
        use Laravel\Cashier\Cashier;
        
        public function boot(): void
        {
            Cashier::calculateTaxes();
        }
        ```

1. 疎通確認
    1. usersテーブルにデータを1レコード分入れておく。（Stripe系以外のカラム）
    1. tinkerを起動する。
    1. 下記を実行し、エラーが発生しないことを確認する。

        ```php
        $user = App\Models\User::first();
        $paymentMethod = 'pm_card_visa';

        $user->updateStripeCustomer([
            'address' => [
                'line1' => '1234 Main Street',
                'city' => 'San Francisco',
                'postal_code' => '94111',
                'state' => 'CA',
                'country' => 'US',
            ],
        ]);

        $user->newSubscription('default', 'price_1OAYFcEwNfmSaNN21CiuaKNj')->create($paymentMethod);
        ```

    1. Stripeの左サイドバーの「支払い」をクリックする。
        1. 支払いが成功していれば、下記のように支払い情報が登録されている。

            ![Cursor_と_支払い_–_DokuPro_test_–_Stripe__テスト_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/9246b3d5-bd45-fa74-be70-bc6d3d2751df.png)

        1. 詳細を開き、下記のように情報が入っていれば設定が問題なく行えており、疎通が確認できたことになる。

            ![支払い_–_DokuPro_test_–_Stripe__テスト_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/ec9782dc-76f0-1300-150f-d39372d40c0d.png)


## 参考文献

https://readouble.com/laravel/10.x/ja/billing.html

https://stripe.com/docs/tax/set-up

https://stripe.com/docs/api?lang=php

https://reffect.co.jp/laravel/cashier/#laravel-cashier-%E3%81%A8%E3%81%AF

https://t-kuni-tech.com/2020/05/28/laravel-cashier%E3%81%A7%E3%82%B5%E3%83%96%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%EF%BC%88%E5%AE%9A%E6%9C%9F%E8%B3%BC%E8%AA%AD%EF%BC%89%E3%82%92%E3%82%84%E3%81%A3%E3%81%A6/

https://i-ssue.com/topics/fc202fcd-3055-463a-b486-5c28197f7db4