Stripe Billingを利用して銀行振込をサポートした定期購入サブスクリプションを管理する

定期課金・サブスクリプションビジネスにおいて、銀行振込の需要は低くありません。

カードを持たない顧客やカード入力をためらう場面でのサービス申し込みなどだけでなく、企業がサービスを契約する際にも、銀行振込は決済方法の１つとして有効です。

しかし銀行振込とカード決済では、決済のタイミングが異なります。そのため、入金確認や消し込み作業などで手動のオペレーションが発生することが少なくありません。

今回の記事では、**Stripeを利用して銀行振込でのサブスクリプション決済をサポートする方法**を紹介します。

## ノーコードでサブスクリプションを作成する

もっとも手軽にサブスクリプションを作ることができるのは、Dashboardから操作する方法です。
まず、Dashboardのサブスクリプション作成ページを開きましょう。
直接リンク: https://dashboard.stripe.com/test/subscriptions/create!


![mT0jopGw.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/ac31eca5-9984-eaa9-4ba5-f9eb513943ce.png)

サブスクリプションを契約する顧客と、料金を設定しましょう。
この際、Dashboardにログインしているユーザーと同じメールアドレスの顧客を指定することで、請求書メールのテスト送信が可能になります。

### 支払い方法を[手動支払い用の請求書]に変更する

続いてページをスクロールし、[支払い方法]セクションに移動します。
ここで支払い方法を、[手動支払い用の請求書を顧客にメールで送付する]に変更しましょう。


![VW93WetL.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/81ef74a5-482f-e545-2864-4f7d8847ce30.png)

[支払い方法]のアイコン右側にある[管理]をクリックしましょう。
メールで請求書を送付する際に、顧客が利用できる支払い方法を設定する画面が開きます。

![aWb-6fly.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/395b6605-ebf9-4095-06ca-94b6fc173766.png)


ここで[銀行振込]を有効にして、[保存]しましょう。
最後にページ上部の[テストのサブスクリプションを開始]をクリックしましょう。

![XfHWM5De.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/d129f273-e314-1a13-b858-5ccc293443f8.png)


サブスクリプション一覧に移動し、一覧に作成したサブスクリプションが表示されていれば、作成完了です。

![PVaCKtSg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/fa368a7b-3692-24b4-6c85-d8300c6734dc.png)

## コードでサブスクリプションを作成する

コードでの実装の場合、Stripeが提供するREST APIをSDK経由で実行します。
この記事では、Node.jsを例に実装方法を紹介しますが、[APIドキュメント](https://stripe.com/docs/api)ではその他の言語やcUrl・Stripe CLIでの実行方法も確認できます。

https://stripe.com/docs/api

### サブスクリプションを作成するコード
銀行振込で決済するサブスクリプションは、以下のように作成します。

```js
        await stripe.subscriptions.create({
            customer: customerId,
            items: [{
              price: 'price_xxx',
            }],
            collection_method: 'send_invoice',
            days_until_due: 30,
            payment_settings: {
                payment_method_types: ['customer_balance'],
            }
        })
```

#### Point:

- `collection_method`を`send_invoice` (手動支払い用の請求書を顧客にメールで送付する)に設定します
- `days_until_due`で支払い期限を何日後にするかを指定しましょう
- `payment_settings.payment_method_types`で`customer_balance`を指定します
- collection_methodを`send_invoice`にする場合、`customer`には有効なメールアドレスが設定されている必要があります。

### 振込先口座情報を取得するコード
銀行振込の場合、顧客に振込先の口座情報を伝える必要があります。
Stripeが送付する請求書メールに口座情報が記載されていますが、サービスのUIでも表示させた方がユーザーに親切です。

```js
      const result = await stripe.customers.createFundingInstructions('customerId', {
        currency: 'jpy',
        funding_type: 'bank_transfer',
        bank_transfer: {
          type: 'jp_bank_transfer'
        }
      })
```

このAPIを実行することで、以下のようにCustomerに対応した振込先の口座情報を取得することができます。

```js
    {
      "object": "funding_instructions",
      "bank_transfer": {
        "country": "JP",
        "financial_addresses": [
          {
            "supported_networks": [
              "zengin"
            ],
            "type": "zengin",
            "zengin": {
              "account_holder_name": "ストライプジャパン（カ　シュウノウダイコウ",
              "account_number": "1234567",
              "account_type": "futsu",
              "bank_code": "1234",
              "bank_name": "いろは銀行",
              "branch_code": "001",
              "branch_name": "中央支店"
            }
          }
        ],
        "type": "jp_bank_transfer"
      },
      "currency": "jpy",
      "funding_type": "bank_transfer",
      "livemode": false
    }
```

この２つを組み合わせることで、銀行振込を利用したサブスクリプションを作成することができます。

![4H4-eVSp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/d4a59bf4-abf9-73e0-2606-b23206eb96ca.png)

## Stripeから送られるメールを確認する

続いてどのようなメールが送信されるかを確認しましょう。
サブスクリプション一覧から、作成したサブスクリプションをクリックし、詳細ページに移動します。

![Kj5d_Evg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/046abb6e-bf97-337e-ceb5-9d51c84da325.png)

ページをスクロールし、[インボイス]を見つけたら、初回の請求の行をクリックしましょう。

![9Z7emsJI.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/24740156-69e0-915b-be35-c3de12575348.png)

インボイスの詳細ページから[請求書を送信]をクリックし、メールを送信しましょう。もしテスト環境でメール送信ができない場合は、顧客のメールアドレスをDashboardにログイン中のユーザーのメールアドレスに変更します。

![smHsjr9U.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/0c396e88-ad45-1eb8-cf49-11547f85b513.png)

送信に成功すると、Stripeが顧客に送信する請求書メールが届きます。

![MQ8SiW8U.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/834abd0e-fc6b-53a5-d9bd-3d59cd0753ef.png)

ページをスクロールすると、銀行振込での振込先情報が確認できます。

![stPYTrou.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/ebf1388c-2b5e-230f-8946-5ddaea22ceb1.png)


請求書のPDFデータにも口座情報が記載されています。

![zK0JpBYv.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/a521e283-a34c-ff84-4121-cf97b370171c.png)

## Webhookで銀行振込の決済のサイクルを処理する

銀行振込やコンビニ決済など、顧客側で決済のためのアクションが必要なサブスクリプションでは、「決済が完了した時点から、サービスの提供を開始する」仕組みが必要になります。
そのため、Webhookのイベントを利用し、statusがactiveになったタイミングでアプリのDBを更新するなどの処理を行いましょう。

```js
      if (event.type === 'customer.subscription.updated') {
          const subscription = event.data.object;
          if (subscription.status === "active") {
            /**
             * サブスクリプションを開始することを、システムに伝える。
             **/
          } else if (subscription.status === "past_due") {
            /**
             * 支払いが完了していないことを、システムに伝える。
             **/
          }
      }
```

また、次回以降の請求についても、銀行振込では顧客側のアクションが必要です。
そのため、もしCRMなどで顧客のフォローを行いたい場合などでは、以下のようにイベントを受け付けましょう。

```js
      if (['invoice.payment_action_required'].includes(event.type)) {
        /**
         * 銀行振込など、顧客側で対応が必要な請求が発生した際の処理を実装する。
         * - UIやメールなどでユーザーに通知する
         * - CRMなどを経由して自社サポートチームにフォローを依頼する
         */
      }
```

Webhookの利用法についての詳細は、[ドキュメント]( https://stripe.com/docs/billing/subscriptions/webhooks )をご確認ください。

## おわりに

B2B向けのSaaSなどでは、クレジットカードだけサポートしている場合、銀行振込での対応が可能かどうかの問い合わせがあることが少なくありません。
また、銀行口座を確認し、実際に入金ができているかや金額に過不足がないかのチェックをする必要があるなど、手数料以外のオペレーションコストが発生しやすい決済方法でもあります。
Stripeを利用することで、手動オペレーションが発生することなく、サブスクリプションでの定期決済を提供できるようになります。