# トークンを利用して本人確認を処理

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 フォームを作成します。
2. Stripe にフォームデータを送信し、その返信としてトークンを受け取り、そのトークンをサーバに送信する JavaScript を追加します。
3. そのトークンをサーバ側の 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
<form class="my-form" action="/create-person" method="post">
  <input type="hidden" name="token-account" id="token-account">
  <input type="hidden" name="token-person" id="token-person">
  <label>
    <span>Business Name</span>
    <input class="inp-company-name">
  </label>
  <fieldset>
    <legend>Business Address</legend>
    <label>
      <span>Street Address Line 1</span>
      <input class="inp-company-street-address1">
    </label>
    <label>
      <span>City</span>
      <input class="inp-company-city">
    </label>
    <label>
      <span>State</span>
      <input class="inp-company-state">
    </label>
    <label>
      <span>Postal Code</span>
      <input class="inp-company-zip">
    </label>
  </fieldset>
  <label>
    <span>Representative First Name</span>
    <input class="inp-person-first-name">
  </label>
  <label>
    <span>Representative Last Name</span>
    <input class="inp-person-last-name">
  </label>
  <fieldset>
    <legend>Representative Address</legend>
    <label>
      <span>Street Address Line 1</span>
      <input class="inp-person-street-address1">
    </label>
    <label>
      <span>City</span>
      <input class="inp-person-city">
    </label>
    <label>
      <span>State</span>
      <input class="inp-person-state">
    </label>
    <label>
      <span>Postal Code</span>
      <input class="inp-person-zip">
    </label>
  </fieldset>
  <button>Submit</button>
</form>
```

### 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
<p>By clicking, you agree to <a href="#">our terms</a> and the <a href="https://stripe.com/connect-account/legal">Stripe Connected Account Agreement</a>.</p>
```

## JavaScript の追加

次に、ページには以下を実行する JavaScript が必要です。

1. フォーム送信を中断します。
2. `stripe.createToken()` メソッドを呼び出して、アカウントと個人のトークンを要求する。
3. 受信したトークンの ID をサーバに送信する。

わかりやすくするために、次のコードではデータ検証とエラー処理は省略されていますが、実際の導入には両方を追加することを忘れないでください。

`stripe.createToken()` メソッドには、以下の 2つの引数 を渡します。

- 作成するトークンの種類を指定するための値 `account` または `person`
- 情報の一般的なオブジェクト

2 番目の引数として指定する `JavaScript` オブジェクトは、トークン化する `Account` または `Person` オブジェクトの構造と一致させる必要があります。

- アカウントトークンを使用する場合は、適切な構造の子プロパティを持つ最上位の [company](https://docs.stripe.com/api/accounts/object.md#account_object-company) または [individual](https://docs.stripe.com/api/accounts/object.md#account_object-individual) プロパティを指定します。
- 個人トークンの場合は、[Person](https://docs.stripe.com/api/persons/object.md) オブジェクトのプロパティを直接渡します (プロパティを `person` プロパティでラップする既存のコードがある場合でも、更新する必要はありません)。

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('<<YOUR_PUBLISHABLE_KEY>>');
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', {
    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 "<<YOUR_SECRET_KEY>>:" \
  -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 "<<YOUR_SECRET_KEY>>:" \
  -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/accounts/object.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 "<<YOUR_SECRET_KEY>>:" \
  -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<Token>() {
            @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
            }
});
```

## ファイルのアップロードを処理する

連結アカウントが Stripe に[本人確認書類の画像](https://docs.stripe.com/connect/handling-api-verification.md#handle-identity-verification) (パスポートなど) を提出する必要がある場合、確認要件が表示される場所に応じて、アップロードした [File](https://docs.stripe.com/api/files.md) ID をアカウントトークンまたは個人トークンに含めます。個人の本人確認書類をアップロードするアカウントトークンの例を以下に示します。

1. フォーム送信を中断します。
2. ファイルがアップロードされたら、ファイルを Stripe に送信して [File](https://docs.stripe.com/api/files.md) ID を受け取ります。
3. アカウントトークンリクエストの個人データに `File` ID を追加します。
4. `stripe.createToken()` メソッドを呼び出し、アカウントトークンをリクエストします。
5. 受け取ったアカウントトークンの ID をサーバーに送信します。

まず、フォームにファイル要素を追加します。アップロードするファイルは、カラー画像 (8,000 ピクセル× 8,000 ピクセル未満)、JPG、PNG、PDF形式で、サイズが10MB未満である必要があります。

```html
<input type="file" id="id-file" name="id-file" accept=".jpeg,.jpg,.png,.pdf">
```

次に、フォーム送信を処理する 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 <<YOUR_PUBLISHABLE_KEY>>'},
  body: data,
});
const fileData = await fileResult.json();
```

最後に、返されたファイル ID を、`createToken()` コールで指定する汎用オブジェクトに `verification.document.front` 値として含めます。

```javascript
const result = await stripe.createToken('account', {
  business_type: 'individual',
  individual: {
    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/accounts/update.md) または [update Person](https://docs.stripe.com/api/persons/update.md) コールを実行します。

以前アカウントトークンを通じて設定した法人詳細を更新する際は、新しいトークンを作成して提供する必要があります。

```curl
curl https://api.stripe.com/v1/accounts/{{CONNECTEDACCOUNT_ID}} \
  -u "<<YOUR_SECRET_KEY>>:" \
  -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/accounts/update.md) または [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)
