# Charges を使用した ACH ダイレクトデビット
過去の Charges API で ACH 支払いを受け付けるための従来のガイド。
> #### レガシー
>
> 以下の内容では、ACH 支払いを収集するための *レガシー* (Technology that's no longer recommended)の方法について説明します。
>
> 新しい実装を構築する場合は、代わりに [ACH 支払いを受け付ける](https://docs.stripe.com/payments/ach-direct-debit.md)ための現在の方法のいずれかを使用してください。
>
> Charges API を使用して ACH 支払いを受け付ける既存のシステムがある場合は、[Payment Intents API への移行](https://docs.stripe.com/payments/ach-direct-debit/migrating-from-charges.md)することをお勧めします。Payment Intents API には即時確認の機能が付属しています。
また、顧客から [USD 銀行振込](https://docs.stripe.com/payments/bank-transfers.md)を使用して送金された ACH クレジットの支払いを受け取ることもできます。
Stripe では、支払いリクエストの `source` 引数として確認済みの銀行口座を指定することにより、クレジットカードでの支払いの受け付けとほぼ同じ方法で ACH 支払いを受け付けることができます。ただし、銀行口座を受け付ける場合、初回のワークフローがクレジットカードの受け付け時と若干異なります。
1. 最初に銀行口座を[確認する](https://docs.stripe.com/ach-deprecated.md#verifying)必要があります。
1. 顧客がお客様による銀行口座の使用を[許可](https://docs.stripe.com/ach-deprecated.md#authorization)している必要があります。
銀行口座に対して両方の手順を実行すると、顧客は、継続支払いや [Connect](https://docs.stripe.com/ach-deprecated.md#connect) アプリケーションなど、他の支払い方法と同じように銀行口座を使用できます。 銀行口座を使用する場合とクレジットカードを使用する場合の 2 つの主な違いは次のとおりです。
- ACH 支払いは、成功または失敗の確認を受け取るまでに最大 5 営業日かかります。このため、ACH 支払いが利用可能な Stripe 残高に反映されるまでに最大 7 営業日かかります。
- 受け付けられる売上は、USD 建てで、なおかつアメリカの銀行口座からのものに限定されます。さらに、ACH 支払いを受け付けるには、お客様のアカウントがアメリカにドル建ての銀行口座を保持している必要があります。
## 銀行口座を収集して確認する
ACH 請求を作成する前に、まずお客様の銀行口座番号とルーティング番号を収集し、確認する必要があります。銀行口座を正しく識別するため、口座の所有者である個人または事業者の名称、そしてその口座が個人口座か法人名義口座かも収集する必要があります。Stripe では、[Plaid](https://plaid.com/docs/auth/partnerships/stripe/) を使用した即時の収集と確認、または [Stripe.js](https://docs.stripe.com/payments/elements.md) を使用した収集とマイクロデポジットによる遅延確認の、2 つの収集方法を提供しています。Plaid を使用する場合、ビジネスの規模によっては追加のコストが発生する可能性があります。これを考慮したうえで選択してください。
銀行口座への請求には、口座の確認と顧客による許可の両方が必要であるため、ベストプラクティスとして、後で再利用できるように Stripe の `Customer` オブジェクトに銀行口座を保存します。
## Plaid を使用する

Plaid を利用すると、顧客の銀行情報を素早く収集し確認するできます。Stripe + Plaid の組み込みを使用することで、確認済みの銀行口座情報を即座に受け取ることができるため、直ちに請求できます。これを実行するには [Plaid Link](https://plaid.com/docs/auth/partnerships/stripe/) を使用します。Plaid から直接 Stripe 銀行口座トークンを受け取ることができます。
**ステップ 1: Plaid アカウントを設定する**
Plaid アカウントをお持ちでない場合は、[アカウントを作成](https://plaid.com/docs/auth/partnerships/stripe)します。アカウントでは、組み込みへのアクセスが自動的に有効化されます。Plaid アカウントで Stripe の組み込みが有効になっていることを確認するには、アカウントのダッシュボードで[組み込み](https://dashboard.plaid.com/team/integrations)セクションに移動します。そこで、Stripe アカウントが連結されていることを確認してください。
**Step 2: Fetch a Link token**
A `link_token` is a one-time use token that initializes Plaid Link. You can create a link_token and configure it for your specific Link flow by calling [Create Link Token](https://plaid.com/docs/#create-link-token) endpoint from your server.
#### curl
```bash
curl https://sandbox.plaid.com/link/token/create \
-H "Content-Type: application/json" \
-d "{\"client_id\": \"{{PLAID_CLIENT_ID}}\",\"secret\": \"{{PLAID_SECRET}}\",\"client_name\": \"My App\",\"user\": {\"client_user_id\": \"Stripe test\"},\"products\": [\"auth\"],\"country_codes\": [\"US\"],\"language\": \"en\", \"webhook\": \"https://webhook.sample.com/\"}"
```
**ステップ 3: Plaid Link を導入する**
Integrating with Link only takes a few lines of client-side JavaScript and a small server-side handler to exchange the Link `public_token` for a Plaid `access_token` and a Stripe bank account token.
```html
```
**ステップ 4: サーバ側ハンドラを作成する**
The Link module handles the entire onboarding flow, but doesn’t retrieve account data for a user. Instead, the Link module returns a `public_token` and an `accounts` array, which is a property on the `metadata` object, and part of the `onSuccess` callback.
`accounts` 配列には、ユーザーが入力した認証情報に関連付けられた銀行口座に関する情報が格納されます。ユーザーがその金融機関に複数の銀行口座を保有している場合は、複数の口座が含まれる場合があります。ユーザーが Stripe でどのアカウントを使用すべきか悩まないように、Plaid 開発者ダッシュボードの [Select Account](https://dashboard.plaid.com/link/account-select) を **Enabled for one account (1 アカウントで有効化)** に設定します。この設定を選択すると、accounts 配列には常に 1 つの要素のみが含まれるようになります。
サーバに `public_token` と `account_id` がある場合、Plaid サーバに対する呼び出しを 2 回実行して、Stripe の銀行口座トークンを、他の Plaid API リクエストに使用する Plaid `access_token` とともに取得する必要があります。
#### curl
```bash
curl https://sandbox.plaid.com/item/public_token/exchange \
-H "Content-Type: application/json" \
-d "{\"client_id\": \"{{PLAID_CLIENT_ID}}\", \"secret\": \"{{PLAID_SECRET}}\", \"public_token\": \"{{PLAID_LINK_PUBLIC_TOKEN}}\"}"
curl https://sandbox.plaid.com/processor/stripe/bank_account_token/create \
-H "Content-Type: application/json" \
-d "{\"client_id\": \"{{PLAID_CLIENT_ID}}\", \"secret\": \"{{PLAID_SECRET}}\", \"access_token\": \"{{PLAID_ACCESS_TOKEN}}\", \"account_id\": \"{{PLAID_ACCOUNT_ID}}\"}"
```
レスポンスには、確認済みの Stripe 銀行口座トークン ID が含まれます。このトークンを Stripe の `Customer` オブジェクトに関連付けたり、このトークンで支払いを直接作成したりできます。
```json
{
"stripe_bank_account_token": "btok_orWziM4j7CiRL8J4vQmX",
"request_id": "[Unique request ID]"
}
```
**ステップ 5: 本番環境に向けた準備をする**
Plaid は、テストと本番のリクエストに異なる API ホストを使用します。上記のリクエストは、Plaid の Sandbox 環境を使用し、シミュレーションデータを使用しています。実際のユーザでテストするには、Plaid の開発環境を使用します。Plaid の開発環境は、最大 100 個の本番オブジェクトをサポートし、これらについてお客様に対する請求は発生しません。本番環境に移行する際は、[Plaid の本番環境](https://plaid.com/docs/auth/partnerships/stripe/#step4)を使用します。
## 手動で銀行口座を収集して確認する
Plaid は、ほとんどの主要銀行に対して即時確認をサポートしています。ただし、顧客の銀行がサポート対象に含まれない場合、またはお客様が Plaid の導入を希望しない場合は、Stripe のみを使用して顧客の銀行の収集と確認を行います。
まず、[Stripe.js](https://docs.stripe.com/js/tokens/create_token?type=bank_account) を使用して顧客の銀行口座情報を安全に収集し、それを表すトークンを受け取ります。受け取ったトークンを、アカウント内の Stripe の顧客に関連付けます。[Nacha の規則](https://www.nacha.org/newrules)に準拠するため、口座名義人が有効な名前で入力されていることを確認してください。
#### curl
```bash
curl https://api.stripe.com/v1/customers \
-u <>: \
-d "name"="Jenny Rosen" \
-d "source"="btok_4XNshPRgmDRCVi"
```
*Customer* (Customer objects represent customers of your business. They let you reuse payment methods and give you the ability to track multiple payments) の銀行口座の確認が必要です。 Plaid なしで Stripe を使用する場合、Stripe は自動的に 2 回の少額入金を行います。この入金が顧客のオンライン明細書に表示されるまでには、 1 ~ 2 営業日かかります。明細書に `ACCTVERIFY` を含む説明が含まれており、顧客はこれらの金額をお客様に伝える必要があります。
これらの金額を受け付けるとき、確認試行の失敗が 3 回までに制限されることに注意してください。この制限を超えると、銀行口座を確認できなくなります。顧客に対して、マイクロデポジットとは何か、それがどのように使用されるのかを明確に伝えることで、確認の際に問題が発生しないようにします。マイクロデポジットを受け取り次第、銀行口座を確認することができます。
#### curl
```bash
curl https://api.stripe.com/v1/customers/cus_AFGbOSiITuJVDs/sources/ba_17SHwa2eZvKYlo2CUx7nphbZ/verify \
-u <>: \
-d "amounts[]"=32 \
-d "amounts[]"=45
```
銀行口座が確認されると、その口座に対して支払いを作成することができます。
## 支払いの許可
ACH 支払いを作成する前に、口座から引き落とすための許可を顧客から取得します。そうすることで、ACH ネットワークへのコンプライアンスが確保され、不審請求の申請、追加手数料、支払いの差戻しからお客様を保護します。許可要件の詳細については、[サポートページ](https://support.stripe.com/questions/collect-ach-authorization-from-customers)をご覧ください。
## ACH 支払いを作成する
確認済みの銀行口座に対して支払いを作成するには、カードを使用する場合と同じ方法で、保存されている `Customer` オブジェクトを使用します。
```curl
curl https://api.stripe.com/v1/charges \
-u "<>:" \
-d amount=1500 \
-d currency=usd \
-d customer=cus_AFGbOSiITuJVDs
```
未確認の銀行口座に請求しようとすると、エラーが発生し、「ACH 支払いを作成するには顧客の銀行口座を検証する必要があります」というメッセージが表示されます。
顧客がソース (タイプは問わない) を複数保存している場合は、[source](https://docs.stripe.com/api.md#create_charge-source) パラメーターとして ID を渡して、使用する銀行口座を指定します。
## この実装をテストする
以下の銀行金融番号と口座番号を使用して、ACH による支払いの成功と失敗を再現できます。
- 金融番号: `110000000`
- 口座番号:
- `000123456789` (成功)
- `000111111116` (使用時に失敗)
- `000111111113`(口座解約済み)
- `000222222227` (NSF/残高不足)
- `000333333335` (オーソリされていない引き落とし)
- `000444444440` (無効な通貨)
銀行口座の確認の成功または失敗を再現するには、以下の特定の金額を使用してください。
- `[32, 45]` (成功)
- `[any other number combinations]` (失敗)
## ACH 支払いのワークフロー
ACH 支払いは、成功または失敗の確認を受け取るまでに最大 5 営業日かかります。
- ACH 支払いが作成されると、初期ステータスは `pending` になります。
- 「保留中」の残高取引は、支払い金額から Stripe 手数料を差し引いた金額ですぐに作成されます。
- 現在、22:00 UTC 以降に作成された支払いは、翌営業日に処理されます。
- その後の 4 営業日の間に、支払いは顧客の銀行に応じて `succeeded` または `failed` のいずれかに移行します。
- 成功した ACH 支払いは、7 営業日後に Stripe の利用可能な残高に反映されます。その時点で、売上がお客様の銀行口座への自動または手動の送金に利用可能になります。
- ACH 支払いが失敗すると、作成された「保留中」の取引残高が差戻されます。
- 支払いの 1 ~ 2 日後に、顧客の銀行明細書に支払いが反映されます。(銀行が Stripe に通知する前に、顧客は支払いが成功したかどうかを確認できます。)
支払いの失敗が発生する原因は、資金不足、口座番号の不備、顧客が銀行口座からの引き落としを無効にしている、などさまざまです。
まれに、支払いが `succeeded` に移行した後に、Stripe が銀行から ACH の失敗を受け取ることがあります。この場合、Stripe は以下の `reason` で不審請求の申請を作成します。
- `insufficient_funds`
- `incorrect_account_details`
- `bank_cannot_process`
この場合、Stripe は失敗の手数料を請求します。
## この実装で不審請求の申請に対処する
ACH 決済に関する不審請求の申請は、クレジットカード決済の場合とは根本的に異なります。顧客の銀行が、不審請求を申請された支払いに対する売上の返金のリクエストを受け入れた場合、Stripe は直ちにお客様の Stripe アカウントからその金額を差し引きます。クレジットカードの不審請求の申請とは異なり、ACH の差戻しに対して異議を申し立てることはできません。顧客に連絡して問題を解決する必要があります。
一般的に、顧客は銀行を通じて、個人口座では引き落とし後 60 日以内、ビジネス口座では 2 営業日以内に ACH ダイレクトデビットによる決済について不審請求の申請を行うことができます。まれに、これらの期間外でも引き落とし決済に対する不審請求の申請が成功することがあります。
### ACH の返金と不審請求の申請による二重クレジットのリスク
顧客の銀行が不審請求の申し立てプロセスを開始しているときに、お客様が先手を打って顧客に返金を発行すると、顧客が同じ取引に対してクレジットを 2 回受け取ることがあります。
ACH 決済に対する返金を行う場合は、返金を行うことと、資金が銀行口座に表示されるまでに 2 〜 5 営業日かかる場合があることをすぐに顧客に通知する必要があります。
## 返金
[Refund エンドポイント](https://docs.stripe.com/api.md#refunds)を使用して、最初の支払い日から最大 90 日間、ACH 料金を返金できます。ACH の返金のタイミングとリスクは、カードの返金とは異なります。Stripe では、ACH 返金が成功した場合の通知はありませんが、ACH 返金を処理できない場合は `refund.failed` イベントが送信されます。失敗した場合は、Stripe 以外で顧客に資金を返金する必要があります。これは稀なケースで、通常は元の支払いから返金リクエストまでの間にアカウントが凍結された場合にのみ発生します。
## ACH 固有の Webhook 通知
ACH を使用すると、標準的な支払い *Webhook* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests) 通知が多数届きますが、以下のように注意が必要な違いがいくつかあります。
- 支払いを作成すると、`charge.pending` 通知が届きます。最大 5 営業日後まで `charge.succeeded` または `charge.failed` の通知は届きません。
- 支払いが `succeeded` に移行し、残高で売上が利用可能になると、`charge.succeeded` 通知が届きます。
- 何らかの理由で ACH 送金が失敗した場合は、`charge.failed` 通知が届きます。支払いの `failure_code` と `failure_message` が設定され、この時点で、資金は Stripe の保留中の残高から差し引かれます。
- 銀行口座が問題なく確認されると、`customer.source.updated` 通知が届きます。銀行口座の `status` は `verified` に設定されます。
- 2 つの少額の入金のいずれかが失敗したために銀行口座を確認できなかった場合は、`customer.source.updated` 通知が届きます。銀行口座の `status` は `verification_failed` に設定されます。
## Connect のサポート
*Connect* (Connect is Stripe's solution for multi-party businesses, such as marketplace or software platforms, to route payments between sellers, customers, and other recipients) を使用すると、[支払いの処理](https://docs.stripe.com/connect/charges.md)の間にプラットフォームで収益を得ることができます。次のいずれかを実行できます。
- 連結アカウントで顧客を作成してから、[ダイレクト支払い](https://docs.stripe.com/connect/direct-charges.md)を作成する
- [プラットフォームアカウント](https://docs.stripe.com/connect/cloning-customers-across-accounts.md)で顧客を作成してから、`transfer_data` パラメーター (以下のコードなど) を使用して[デスティネーション支払い](https://docs.stripe.com/connect/destination-charges.md)を作成する
```curl
curl https://api.stripe.com/v1/charges \
-u "<>:" \
-d amount=1500 \
-d currency=usd \
-d customer=cus_AFGbOSiITuJVDs \
-d "transfer_data[amount]"=850 \
-d "transfer_data[destination]"={{CONNECTED_STRIPE_ACCOUNT_ID}}
```
## 利用規約
本番環境 API の使用は、Stripe [用規約](https://stripe.com/legal/ssa) の対象となります。本契約に関してご質問がある場合は、お知らせください。