Stripe テスト用銀行口座をAPI実行で登録する

## 概要

Stripeが用意しているテスト用情報で銀行口座をAPIで登録する方法を簡単にまとめる。

## 前提

フレームワークはlaravelである。
laravel cashierライブラリを入れたときにStripeが用意するPHPのSDKライブラリが依存関係で一緒に入ってきていた。
今回はPHPのSDKを使ってtinkerから実行している。
Stripeのテスト環境にブラウザからログインする事ができ、APIキーとシークレットキーが吐き出され、確認できる状態であること。

## 本記事を読んでも解決しなかったら

迷わずサポートに連絡してみよう。
Stripeのサポートは非常に丁寧で、時間限定ではあるが日本語のやり取りにも対応し、電話、チャット、メールの中から選ぶ事ができる。
本当に気軽に連絡できるし、無料なのでぜひ使ってみてほしい。この記事を読むよりよっぽど早く解決できるだろう。

https://qiita.com/miriwo/items/bc9c2dc7ef39b9d14ad0

## 方法

下記をみてテスト用口座情報を確認する。

https://stripe.com/docs/connect/payouts-bank-accounts?bank-account-collection-integration=direct-api

![銀行口座とデビットカードを管理する___Stripe_のドキュメント.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/ddb8c7b4-4786-17bc-b2c9-b28af30b1b88.png)

下記をPHPの実行環境で実行する。筆者はlaravelのtinkerで実行した。　金融期間コードと口座番号は[こちら](https://stripe.com/docs/connect/testing#account-numbers)を参考にした。（[https://stripe.com/docs/connect/payouts-bank-accounts?bank-account-collection-integration=direct-api](https://stripe.com/docs/connect/payouts-bank-accounts?bank-account-collection-integration=direct-api) に「一部の国では、金融機関コードと支店コードなど、別個の情報を組み合わせて金融番号を作成する必要があります。」と記載されているが、日本は「一部の国」には含まれない。そのため`routing_number`には金融機関コードを、`account_number`には口座番号を記載しよう。）

```php
$stripe = new \Stripe\StripeClient('sk_test_から始まるシークレットキー');

$stripe->tokens->create([
    'bank_account' => [
        'country' => 'JP',                     // 銀行の国の情報
        'currency' => 'jpy',                   // 通貨の情報
        'account_holder_name' => 'ヤマダハナコ', // 口座名義人の名前
        'account_holder_type' => 'individual', // 口座名義人のタイプ company か individual
        'routing_number' => '1100000',         // 金融機関コード
        'account_number' => '0001234',         // 口座番号
    ],
]);
```

細かいキーの情報は[こちら](https://stripe.com/docs/api/tokens/create_bank_account)の隠れているパラメーター内部に記載されている。

![Create_a_bank_account_token___Stripe_API_Reference.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/14d7e286-0373-14ef-ed1f-7af6992f021a.png)

下記の内容が返された。

```
= Stripe\Token {
    +saveWithParent: false,
    id: "btok_XXXXXXXXXXXXXXXXXXXXXXXX",
    object: "token",
    bank_account: Stripe\BankAccount {#3905
      +saveWithParent: false,
      id: "ba_XXXXXXXXXXXXXXXXXXXXXXXX",
      object: "bank_account",
      account_holder_name: "ヤマダハナコ",
      account_holder_type: "individual",
      account_type: "futsu",
      bank_name: "STRIPE TEST BANK",
      country: "JP",
      currency: "jpy",
      fingerprint: "XXXXXXXXXXXXXXXX",
      last4: "1234",
      routing_number: "1100000",
      status: "new",
    },
    client_ip: "42.124.117.97",
    created: 1702304612,
    livemode: false,
    type: "bank_account",
    used: false,
}
```

`btok_XXXXXXXXXXXXXXXXXXXXXXXX`を使って連結アカウントの送金先アカウントを登録する事ができた。

## 余談

筆者はStripeのConnectの連結アカウントに送金するための銀行口座を登録したかった。
クレジットカードは下記の様にpaymentMethodの値（支払い方法の`pm_`から始まるID？トークン？）がドキュメントで確認する事ができる。

https://qiita.com/miriwo/items/fb0df0e7b27a3b19dcff

しかしながらテスト用銀行口座はなぜか提示されていない。厳密に言うとUSの口座はID（トークン）が振られ、ドキュメントにも記載されている。↓

https://stripe.com/docs/connect/testing#testing-top-ups

![Stripe_Connect_のテスト___Stripe_のドキュメント.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/497b68bc-7b8a-203f-698f-83aacfb1faae.png)

日本のテスト用銀行口座はなぜか個々の情報のみでID（トークン）が振られていない。↓

https://stripe.com/docs/connect/payouts-bank-accounts?bank-account-collection-integration=direct-api

Connectに限った話かもしれないが、国をJPに設定し、通貨をjpyに設定しているアカウントに、別の国と通貨の口座を設定しようとするとエラーになるっぽい。↓エラー内容

```text
Stripe\Exception\InvalidRequestException: Invalid currency: usd. You can use these currencies for transfers for an account in JP
```

まさかと思って提示されているトークンのusをjpに変えて`btok_jp_verified`で試してみたが「そんな口座は無い」って怒られた。（そりゃそう）

```text
Stripe\Exception\InvalidRequestException: This token contains all valid parts, unfortunately it does not have a corresponding test bank account: &#039;btok_jp_verified&#039;. in file /app/vendor/stripe/stripe-php/lib/Exception/ApiErrorException.php on line 38
```

## 参考文献

https://stripe.com/docs/api/tokens/create_bank_account

https://stripe.com/docs/connect/payouts-bank-accounts?bank-account-collection-integration=direct-api

https://stripe.com/docs/connect/testing#testing-top-ups