# トークンを利用して本人確認を処理
Connect プラットフォームでは、Stripe.js、API、またはモバイルクライアントライブラリを使用することで、ユーザーからアカウントの詳細を安全に収集できます。
接続アカウントでの課金や *payouts* (A payout is the transfer of funds to an external account, usually a bank account, in the form of a deposit) を有効にする前に、*Know Your Customer* (KYC) 要件を満たす必要があります。そのためには、アカウントに関する [本人確認情報](https://docs.stripe.com/connect/identity-verification.md)を Stripe に提供し、Stripe がそれを確認します。この作業は [Account Tokens](https://docs.stripe.com/api/tokens/create_account.md) や [Person Tokens](https://docs.stripe.com/api/tokens/create_person.md) を使って行うことができます。トークンを利用することで、個人を特定できる情報 (PII) があなたのサーバーに触れることなく、安全に統合を運用できます。また、トークンを使用することで、Stripe は潜在的な不正行為をより正確に検出できるようになります。
トークンは、次の場合にのみ使用できます。
- 法人の詳細 (ビジネスまたは個人に関する情報)
- 個人の詳細
- Stripe Connect アカウント契約への同意を示す
トークンは、以下を含むその他のアカウント情報には_使用_できません。
- アカウントの設定 (入金スケジュールなど)
- アカウントの機密情報でない情報 (サポート URL、サポート電話番号など)
- 連結アカウントの国
トークンは、[Stripe.js](https://docs.stripe.com/payments/elements.md)、[the API](https://docs.stripe.com/api/tokens.md)、またはモバイルクライアントライブラリの 1 つを使用して作成します。このプロセスは、支払いの詳細や外部アカウントのトークン化と実質的に同じです。連結アカウントの情報は Stripe に直接送信され、`create` と `update` API 呼び出しで使用できるトークンと交換されます。
> フランスのプラットフォームはアカウントトークンを使用する必要があります。これは、プラットフォーム [PSD2](https://stripe.com/connect/eu-guide) 準拠のための、エージェントモデルの代替です。フランスのプラットフォームでトークンを使用する主なメリットは、情報がユーザから Stripe に直接転送されることです。PII データを保存する必要がないこともメリットですが、これは必須の要件ではありません。その他の国のプラットフォームでは、アカウントトークンはオプションですが、使用をお勧めします。
## トークンの作成と使用
トークンには、クライアント側とサーバ側の両方のコードが必要です。
1. ユーザの入力を取り込む HTML フォームを作成します。
1. Stripe にフォームデータを送信し、その返信としてトークンを受け取り、そのトークンをサーバに送信する JavaScript を追加します。
1. そのトークンをサーバ側の Stripe API コールで使用します。
次の例は、アカウントトークンと Person トークンの使用方法を示しています。どちらのタイプも、会社の法人と個人の詳細を提供するときに必要です。個人のみをユーザー登録する場合は、Person トークンは必要ありません。代わりに、アカウントトークンを作成し、`Account`オブジェクトの[individual](https://docs.stripe.com/api/accounts/object.md#account_object-individual)ハッシュをを使用して必要な情報を提供します。
## HTML フォームを作成する
最初のステップは、アカウントと個人の必須情報を収集する HTML フォームを作成することです。これには、Stripe の Connect アカウント契約への同意も含まれます。
### アカウントと個人の詳細を収集する
フォーム要素を作成して、名前、住所など、ユーザーの国によって[必須](https://docs.stripe.com/connect/required-verification-information.md)とされる必要な情報を収集します。
```html
```
### Stripe Connect アカウント契約を提示する
プラットフォームとして、支払いの処理は [Stripe Connected Account Agreement](https://stripe.com/connect-account/legal) に従うことをユーザーに明確にする必要があります。Stripe Connected Account Agreement の受け入れを示すことは、アカウントトークンを使用して新しい連結アカウントを作成するための要件です。
> [tos_shown_and_accepted](https://docs.stripe.com/api/tokens/create_account.md#create_account_token-account-tos_shown_and_accepted) を指定した Account Token を作成できるのは、[API を通じてサービス契約(Service Agreement)を受け入れられる](https://docs.stripe.com/connect/service-agreement-types.md#accepting-the-correct-agreement)プラットフォームのみです。
Stripe では、以下のような文章を含め、Stripe の利用規約とお客様の利用規約の両方へのリンクを含めることをお勧めします。
#### 英語
```html
By clicking, you agree to our terms and the Stripe Connected Account Agreement.
```
## JavaScript の追加
次に、ページには以下を実行する JavaScript が必要です。
1. フォーム送信を中断します。
1. `stripe.createToken()` メソッドを呼び出して、アカウントと個人のトークンを要求する。
1. 受信したトークンの ID をサーバに送信する。
わかりやすくするために、次のコードではデータ検証とエラー処理は省略されていますが、実際の導入には両方を追加することを忘れないでください。
`stripe.createToken()` メソッドには、以下の 2つの引数 を渡します。
- 作成するトークンの種類を指定するための値 `account` または `person`
- 情報の一般的なオブジェクト
第二引数として渡す`JavaScript` オブジェクトは、トークン化する `Account` または `Person` オブジェクトの構造に沿っている必要があります。アカウントトークンには、にはトップレベルに [company](https://docs.stripe.com/api/accounts/object.md#account_object-company) または [individua](https://docs.stripe.com/api/accounts/object.md#account_object-individual) プロパティで、person トークンには最上位の[person](https://docs.stripe.com/api/persons/object.md)プロパティが必要です。オブジェクトの構造に従い、必要な属性すべてを正しくネストしてください。例えば下のコードブロック内の `address` の `line1` は[person.address.line1](https://docs.stripe.com/api/persons/object.md#person_object-address-line1) のように指定します。
Stripe Connected Account Agreement へのユーザーの同意を表すには、トップレベルに `tos_shown_and_accepted` プロパティを設け、その値を `true` に設定します(これは Account Token の場合のみ使用されます)。
Person を作成または更新する場合は、引き続きサーバーサイドのコードでトークンを使用する必要があります。トークン ID は、アプリケーションに適した方法(例:XHR リクエストなど)でサーバーに送信できます。簡単にするため、このコード例ではトークン ID を隠しフォーム入力に格納し、フォームを送信しています。
```javascript
// Assumes you've already included Stripe.js!
const stripe = Stripe('<>');
const myForm = document.querySelector('.my-form');
myForm.addEventListener('submit', handleForm);
async function handleForm(event) {
event.preventDefault();
const accountResult = await stripe.createToken('account', {
business_type: 'company',
company: {
name: document.querySelector('.inp-company-name').value,
address: {
line1: document.querySelector('.inp-company-street-address1').value,
city: document.querySelector('.inp-company-city').value,
state: document.querySelector('.inp-company-state').value,
postal_code: document.querySelector('.inp-company-zip').value,
},
},
tos_shown_and_accepted: true,
});
const personResult = await stripe.createToken('person', {
person: {
first_name: document.querySelector('.inp-person-first-name').value,
last_name: document.querySelector('.inp-person-last-name').value,
address: {
line1: document.querySelector('.inp-person-street-address1').value,
city: document.querySelector('.inp-person-city').value,
state: document.querySelector('.inp-person-state').value,
postal_code: document.querySelector('.inp-person-zip').value,
},
},
});
if (accountResult.token && personResult.token) {
document.querySelector('#token-account').value = accountResult.token.id;
document.querySelector('#token-person').value = personResult.token.id;
myForm.submit();
}
}
```
Stripe からトークンを正常に受け取ると、JavaScript はそのトークン ID を非表示のフォーム入力に格納し、そのフォームを (お客様のサーバに) 送信します。最後のステップでは、サーバ側コードでトークンを使用してアカウントと個人を作成します。
## アカウントを作成する
アカウントトークン ID を使用して、アカウントを作成します。国とビジネスタイプはトークン外で指定されます。
#### コントローラープロパティを使用した場合
```curl
curl https://api.stripe.com/v1/accounts \
-u "<>:" \
-d "controller[stripe_dashboard][type]=none" \
-d "controller[fees][payer]=application" \
-d "controller[losses][payments]=application" \
-d "controller[requirement_collection]=application" \
-d country=US \
-d "capabilities[card_payments][requested]=true" \
-d "capabilities[transfers][requested]=true" \
-d "account_token={{ACCOUNTTOKEN_ID}}"
```
#### アカウントタイプを使用した場合
```curl
curl https://api.stripe.com/v1/accounts \
-u "<>:" \
-d country=US \
-d type=custom \
-d "capabilities[card_payments][requested]=true" \
-d "capabilities[transfers][requested]=true" \
-d "account_token={{ACCOUNTTOKEN_ID}}"
```
アカウントトークンを作成する際に、`tos_shown_and_accepted` を true に設定すると、`Account` オブジェクトの [tos_acceptance](https://docs.stripe.com/api.md#account_object-tos_acceptance) 属性の、`date`、`ip`、`user_agent` 属性が自動的に入力されます。アカウントトークンを使用せずにアカウントを作成した場合は、これらの属性の値を指定する必要があります。
アカウントの `Person` オブジェクトを作成する際に使用できるようにするため、返されたアカウント ID を必ずメモしておいてください。
## 個人を作成する
`person_token` パラメータに本人トークンの ID を指定することで、[個人を作成できます](https://docs.stripe.com/api/persons/create.md)(このとき、その Person が属するアカウントの ID も必要です)。どの情報を収集する必要があるか、またどの Person から収集するかは、`Account` オブジェクトの [requirements](https://docs.stripe.com/api/accounts/object.md#account_object-requirements) ハッシュを参照することで確認できます。
```curl
curl https://api.stripe.com/v1/accounts/{{CONNECTEDACCOUNT_ID}}/persons \
-u "<>:" \
-d first_name=Jane \
-d last_name=Diaz \
-d "person_token={{PERSON_ID}}"
```
## モバイル SDK を使用したアカウントトークンの作成
Android または iOS SDK を使用してアカウントトークンを作成することもできます(モバイルはアカウントトークンのみをサポートします)。個人アカウントを作成するにはこれで十分ですが、会社アカウントに必要な Person トークンを作成するには Stripe.js を使用する必要があります。
#### iOS
#### Swift
```swift
import UIKit
import StripePayments
let companyParams = STPConnectAccountCompanyParams()
companyParams.name = company.name
companyParams.address = STPConnectAccountAddress()
companyParams.address.line1 = company.address_line_1
companyParams.address.city = company.address_city
companyParams.address.state = company.address_state
companyParams.address.country = company.address_country
companyParams.address.postalCode = company.address_postal_code
guard let accountParams = STPConnectAccountParams(tosShownAndAccepted: true, company: companyParams) else {
// The TOS was not accepted
return
}
STPAPIClient.shared.createToken(withConnectAccount: accountParams) { (accountToken, error) in
if let error = error {
// display an error to your user
}
else {
// use account token to create a Connect account server-side
}
}
```
#### Android
#### Java
```java
import com.stripe.android.Stripe;
import com.stripe.android.model.AccountParams;
import com.stripe.android.ApiResultCallback;
Address address = new Address.Builder()
.setLine1(address_line1)
.setState(address_state)
.setCity(address_city)
.setCountry(address_country)
.setPostalCode(address_postal_code)
.build();
AccountParams accountParams = AccountParams.create(
true,
new AccountParams.BusinessTypeParams.Company.Builder()
.setAddress(address)
.build()
);
stripe.createAccountToken(accountParams,
new ApiResultCallback() {
@Override
public void onSuccess(Token token) {
// use account token to create a Connect account server-side
}
@Override
public void onError(@NotNull Exception e) {
// display an error to your user
}
});
```
## ファイルのアップロードを処理する
連結アカウントがパスポートなどの[本人確認書類を直接撮影したファイル](https://docs.stripe.com/connect/handling-api-verification.md#handle-identity-verification)を Stripe に提供する必要がある場合は、アカウントトークンを使用できます。ただし、JavaScript は、ファイルを XHR リクエストの一部として Stripe に送信する必要があるため、より複雑になります。このフローでは、JavaScript によって以下が実行されます。
1. フォーム送信を中断します。
1. ファイルがアップロードされた場合、そのファイルは Stripe に送信され、その見返りとしてファイルトークンを受け取ります。
1. そのファイルトークン ID を、アカウントトークンリクエストの汎用オブジェクトに追加します。
1. `stripe.createToken()` メソッドを呼び出して、トークンをリクエストします。
1. 受信したアカウントトークンの ID をサーバに送信して、サーバで使用できるようにします。
まず、フォームにファイル要素を追加します。アップロードするファイルは、カラー画像 (8,000 ピクセル× 8,000 ピクセル未満)、JPG、PNG、PDF形式で、サイズが10MB未満である必要があります。
```html
```
次に、フォーム送信を処理する JavaScript で、アップロードされたファイルを Stripe に送信します。これは、アカウントトークンを作成する前に実行する必要があります。
```javascript
const data = new FormData();
data.append('file', document.querySelector('#id-file').files[0]);
data.append('purpose', 'identity_document');
const fileResult = await fetch('https://uploads.stripe.com/v1/files', {
method: 'POST',
headers: {'Authorization': 'Bearer <>'},
body: data,
});
const fileData = await fileResult.json();
```
最後に、返されたファイル ID を、`createToken()` コールで指定する汎用オブジェクトに `verification.document.front` 値として含めます。
```javascript
const result = await stripe.createToken('account', {
person: {
first_name: document.querySelector('.inp-first-name').value,
last_name: document.querySelector('.inp-last-name').value,
address: {
line1: document.querySelector('.inp-street-address1').value,
city: document.querySelector('.inp-city').value,
state: document.querySelector('.inp-state').value,
postal_code: document.querySelector('.inp-zip').value,
},
verification: {
document: {
front: fileData.id,
},
},
},
tos_shown_and_accepted: true,
});
```
## 法人と個人の詳細を更新する
トークンを使用して、既存のアカウントの法人および個人情報を更新できます。上記と同じ HTML と JavaScript の組み合わせを使用して必要なトークンを作成し、その後、新しいトークン ID を指定して [update account](https://docs.stripe.com/api.md#update_account) または [update person](https://docs.stripe.com/api/persons/update.md) の呼び出しを行います。
以前アカウントトークンを通じて設定した法人詳細を更新する際は、新しいトークンを作成して提供する必要があります。
```curl
curl https://api.stripe.com/v1/accounts/{{CONNECTEDACCOUNT_ID}} \
-u "<>:" \
-d "account_token={{ACCOUNTTOKEN_ID}}"
```
### 法人と個人の詳細を取得する
アカウントや Person の詳細情報は、後から[取得アカウント](https://docs.stripe.com/api.md#retrieve_account)または[取得者](https://docs.stripe.com/api/persons/retrieve.md)呼び出しを使って取得できます。
更新にトークンを使用する場合は、次のとおりです。
- 既存の値は新しい値に置き換えられます。
- 新しい値が提供されない場合、既存の値が残ります。
- 既存の値の設定を解除することはできません。
- `tos_shown_and_accepted`パラメータは無視され、省略できます。
- アカウントまたは個人の作成時にトークンが最初に使用されたかどうかに関係なく、更新にアカウントまたは個人トークンを使用できます。
- アカウントまたは個人が元々アカウントトークンを使用して作成された場合、別のトークンを使用してのみ値を更新できます。
例えば、アカウントが名前と生年月日のみを含むトークンで作成された場合、その後、住所情報だけを含む別のトークンを作成し、アカウントの更新コールを実行して、住所の詳細をアカウントに追加します。
## 法人と個人の詳細を削除する
法人情報や個人情報を消去する場合や、値を明示的に null に設定する場合は、[update account (アカウントの更新)](https://docs.stripe.com/api.md#update_account) コールまたは [update person (個人の更新)](https://docs.stripe.com/api/persons/update.md) コールで、空白の文字列を渡します。元々トークンを使用していた場合でも、トークンではなく更新コールを使用します。空白の文字列は、オプションの属性にのみ割り当てることができます (住所の 2 行目など)。必須の属性に割り当てることはできません。
## See also
- [連結アカウントの本人確認](https://docs.stripe.com/connect/identity-verification.md)
- [連結アカウントへの入金](https://docs.stripe.com/connect/payouts-connected-accounts.md)