# 3D セキュアを使用して認証する

決済フローに 3D セキュア (3DS) を導入します。

> 主要なカードブランドは 3D セキュア 1 のサポートを終了しました。実装で 3D セキュア 1 を使用している場合は、[Payment Intents](https://docs.stripe.com/api/payment_intents.md) と [Setup Intents](https://docs.stripe.com/api/setup_intents.md) API を使用するように更新してください。これらの API を使用すると、次のようになります。
> 
> - [3D セキュア 2 (3DS2)](https://stripe.com/guides/3d-secure-2) をサポートします。
- [動的な 3D セキュア](https://docs.stripe.com/payments/3d-secure/authentication-flow.md#three-ds-radar)を利用します。
- ヨーロッパの[強力な顧客認証 (SCA)](https://docs.stripe.com/strong-customer-authentication.md) 規制に準拠します。

3D セキュア認証 (3DS) は、ウェブ、iOS、Android、React Native など、複数のプラットフォームの決済フローに組み込むことができます。この連携では、顧客の銀行が対応している場合は [3D Secure 2 (3DS2)](https://stripe.com/guides/3d-secure-2) を実行し、それ以外の場合は 3D Secure 1 にフォールバックします。また、[スタンドアロン 3DS](https://docs.stripe.com/payments/3d-secure/standalone-3d-secure.md) を使用すると、別の決済代行業者 (PSP) で取引を処理する場合でも、Stripe で 3DS 認証を実行できます。

#### ウェブ
![決済ページ](https://b.stripecdn.com/docs-statics-srv/assets/3ds-flow-1-checkout-page.039294e0dee3a6dede8ea8a32185aae5.png)

顧客がカードの詳細情報を入力します。
![読み取り中の記号](https://b.stripecdn.com/docs-statics-srv/assets/3ds-flow-2-frictionless-flow.417618d0570c469cfb6bbc43630c7896.png)

このステップで顧客の銀行が取引を評価し、3D セキュアを完了することができます。
![認証モーダル](https://b.stripecdn.com/docs-statics-srv/assets/3ds-flow-3-challenge-flow.9052a220f336bbdb75a51799622c6477.png)

銀行から要求された場合、顧客は追加の認証ステップを実行します。

#### iOS
![決済画面](https://b.stripecdn.com/docs-statics-srv/assets/3ds2-checkout.1cd901263328cbb76020b66c173da8b7.png)

顧客がカードの詳細情報を入力します。
![読み込み画面](https://b.stripecdn.com/docs-statics-srv/assets/3ds2-loading.f93743ad15b9120027f93f49ed45b26d.png)

顧客の銀行が認証が必要かどうかを確認している間に、SDK が読み込み画面を表示します。
![チャレンジフロー画面](https://b.stripecdn.com/docs-statics-srv/assets/3ds2-otp.ce1e46e0a853d7d6e3238750a07bca86.png)

銀行から要求された場合、SDK で顧客を認証します。

#### Android
![決済画面](https://b.stripecdn.com/docs-statics-srv/assets/auth-flow-step01-confirm.399f5a4abbd7f303861689d186b79557.png)

顧客が支払い情報を入力します。
![認証を開始する](https://b.stripecdn.com/docs-statics-srv/assets/auth-flow-step02-processing.3877946d74743878ec86cec56dd69085.png)

顧客の銀行が認証が必要かどうかを確認している間に、SDK が読み込み画面を表示します。
![チャレンジフロー画面](https://b.stripecdn.com/docs-statics-srv/assets/auth-flow-step03-otp.f42397e1ce4ec5975e05f1bada72d195.png)

銀行から要求された場合、SDK で顧客を認証します。

## 3DS フローを制御する

ヨーロッパの[強力な顧客認証 (SCA)](https://docs.stripe.com/strong-customer-authentication.md)などの規制や、日本のクレジットカード・セキュリティガイドラインなどの業界ガイドラインによって義務付けられている場合、またはイシュアから[再試行可能な支払い拒否](https://docs.stripe.com/declines/codes.md)コードを適用するように要求された場合や Stripe によって特定の最適化が適用される場合に、Stripe は自動的に 3DS をトリガーします。

[Radar](https://docs.stripe.com/payments/3d-secure/authentication-flow.md#three-ds-radar) または [API](https://docs.stripe.com/payments/3d-secure/authentication-flow.md#manual-three-ds) を使用して、3DS 認証をユーザーに求めるタイミングを決定することもできます。これにより、選択したパラメーターに基づいて各ユーザーの認証プロセスをカスタマイズできます。ただし、ウォレットや*オフセッション支払い* (A payment is described as off-session if it occurs without the direct involvement of the customer, using previously-collected payment information)など、すべての取引が 3DS をサポートしているわけではありません。

決済が 3DS をトリガーすると、そのカードで 3DS 認証がサポートされている限り、カード発行会社は決済を完了するために顧客を認証することを要求する場合があります。Stripe が認証リクエストを開始する間、要件はカード発行会社から届きます。使用しているフロントエンドによっては、[3DS フローを表示](https://docs.stripe.com/payments/3d-secure/authentication-flow.md#when-to-use-3d-secure)する必要がある場合があります。

3DS を起動する一般的な Payment Intent API フローは、次のようになります。

1. PaymentIntent、SetupIntent を確定するか、Customer に PaymentMethod を関連付ける支払い情報を、ユーザーが入力します。
2. 規制に関する同意書、Radar ルール、手動 API リクエスト、カード発行会社による再試行可能な支払い拒否などの基準に基づいて、取引が 3DS をサポートし、必須であるかどうかを、Stripe が評価します。
3. 3DS の状況に応じて次のようになります。
   - **必須でない場合**: *免除* (Some transactions that are deemed low risk, based on the volume of fraud rates associated with the payment provider or bank, may be exempt from Europe's Strong Customer Authentication requirements)などの理由により、Stripe が支払いを試行します。PaymentIntent のステータスは `processing` に移行します。カード発行会社から[再試行可能な支払い拒否](https://docs.stripe.com/declines/codes.md)によってリクエストされた場合は、必要に応じて自動的に再試行して続行します。
   - **サポート対象外の場合**: PaymentIntent のステータスが `requires_payment_method` に移行します。3DS が起動した理由によっては、支払いのオーソリステップを続行できる可能性があります。その場合、PaymentIntent のステータスは `processing` に移行します。
   - **必須**: Stripe が、カード発行会社の 3DS アクセス制御サーバー (ACS) に接続して、3DS フローを開始することで、3DS 認証フローを開始します。
4. カード発行会社から 3DS フローの情報を受け取ると、Stripe はカード発行会社にリクエストを送信してカード保有者を認証します。PaymentIntent のステータスが `requires_action` に移行します。
   - [必要な 3DS アクションの表示](https://docs.stripe.com/payments/3d-secure/authentication-flow.md#when-to-use-3d-secure)方法については、以下をご覧ください。カード発行会社はさまざまな 3DS フローのアクションタイプをリクエストする可能性があるため、常に 3DS チャレンジが視覚的に表示されるとは限りません (負担のないフローなど)。
   - カード発行会社が 3DS にまったく対応していないか、障害が発生している場合、Stripe は認証なしで支払いの完了を試みることがあります (許容される場合)。
   - 通常、3DS 認証リクエストのデータは取引の時点で顧客によって提供されます。負担と認証失敗の可能性を軽減するため、Stripe は、決済フロー中に顧客から収集したデータ、顧客の過去の取引に関する記録、または顧客のカードまたはカード発行会社から入手できえる関連情報など、他のソースから推測されるデータを使用して、これらのリクエストを完了することがあります。
   - Stripeがすでに必要なすべての 3DS データ要素にアクセスできる場合、最適化された Stripe の 3DS サーバーが PaymentIntent を確定する際に、認証リクエストの完了を試行することがあります。これにより、3DS フローが成功した場合は PaymentIntent のステータスが `processing` に直接移行し、3DS フローを完了するために追加のステップまたはデータ要素が必要な場合は、`requires_action` のステータスに直接移行します。
5. 3DS 認証の結果に応じて、次のようになります。
   - **認証済み**: Stripe は支払いを試み、PaymentIntent のステータスは `processing` に移行します。
   - **失敗**: PaymentIntent のステータスが `requires_payment_method` に移行し、別の支払い方法を試みる必要があることを示します。再確定して 3DS を再試行することもできます。
   - **その他のシナリオ**: 支払いで 3DS が起動された理由によっては、[エッジケース](https://docs.stripe.com/api/charges/object.md#charge_object-payment_method_details-card-three_d_secure-result)として支払いに対するオーソリの続行が許容される可能性があります。たとえば、結果が `attempt_acknowledged` になると支払いに進み、PaymentIntent のステータスが `processing` に移行します。
     - 例外は、[継続支払いのためのインドの電子同意書](https://docs.stripe.com/india-recurring-payments.md)を作成する場合です。 `authenticated` 以外の結果はすべて失敗として扱われます。
6. 支払いの結果に応じて、PaymentIntent のステータスは `succeeded`、`requires_capture`、`requires_payment_method` のいずれかに移行します。

カード支払いに対して 3DS がサポートされ、試行されたかどうかを追跡するには、Charge の `payment_method_details` でカード情報の [three_d_secure](https://docs.stripe.com/api/charges/object.md#charge_object-payment_method_details-card-three_d_secure) プロパティーを読み取ります。`three_d_secure` プロパティーは、顧客がカードの認証を試行するときに Stripe によって設定されます。`three_d_secure.result` は、認証の結果を示します。

### ダッシュボードで Radar ルールを使用する

Stripe は、[PaymentIntent](https://docs.stripe.com/api/payment_intents.md) または [SetupIntent](https://docs.stripe.com/api/setup_intents.md) の作成時や確定時に 3DS を動的にリクエストする[不正利用防止対策](https://docs.stripe.com/radar/rules.md#request-3d-secure)機能を提供しています。これらのルールは[ダッシュボード](https://dashboard.stripe.com/settings/radar/rules)で設定できます。

[Radar Plus](https://stripe.com/radar/fraud-teams) を使用している場合は、[カスタム 3DS ルール](https://docs.stripe.com/radar/rules.md#request-3d-secure)を追加できます。

### API を使用して 3DS を手動でリクエストする

3DS をトリガーするデフォルトの方法は、リスクレベルやその他の要件に基づいて [Radar を使用して 3D セキュア](https://docs.stripe.com/radar/risk-settings.md#adaptive-3ds)を動的にリクエストすることです。手動による 3DS のトリガーは、Stripe を独自の不正利用防止エンジンに統合するアドバンスユーザー向けの方法です。

3DS を手動でトリガーするには、[PaymentIntent](https://docs.stripe.com/api/payment_intents/create.md#create_payment_intent-payment_method_options-card-request_three_d_secure)または [SetupIntent](https://docs.stripe.com/api/setup_intents/create.md#create_setup_intent-payment_method_options-card-request_three_d_secure)を作成または確認するとき、または [Checkout セッション](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-payment_method_options-card-request_three_d_secure)を作成するときに、最適化する対象に応じて ‘payment_method_options[カード][request_three_d_secure]’ を設定します。このプロセスは、1 回限りの支払いの場合や、将来の支払いのための支払い方法を設定する場合と同じです。このパラメーターを指定すると、Stripe は 3DS の実行を試行し、PaymentIntent、SetupIntent、または Checkout セッションの [動的な 3D セキュア Radar ルール](https://docs.stripe.com/radar/rules.md)を上書きします。

Stripe API を使用して 3DS を手動でオフにすることはできません。

#### Payment Intents API

```curl
curl https://api.stripe.com/v1/payment_intents \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d amount=1000 \
  -d currency=usd \
  -d "payment_method_options[card][request_three_d_secure]=any"
```

#### Setup Intents API

```curl
curl https://api.stripe.com/v1/setup_intents \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d "customer={{CUSTOMER_ID}}" \
  -d "payment_method_options[card][request_three_d_secure]=any"
```

#### Checkout Session API

```curl
curl https://api.stripe.com/v1/checkout/sessions \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d mode=payment \
  --data-urlencode "success_url=https://example.com/success" \
  -d "line_items[0][price]={{PRICE_ID}}" \
  -d "line_items[0][quantity]=1" \
  -d "payment_method_options[card][request_three_d_secure]=any"
```

このパラメーターを提供するタイミングは、お客様の不正利用防止エンジンがいつリスクを検知するかによって異なります。たとえば、不正利用防止エンジンがカードの詳細のみを調べる場合は、PaymentIntent または SetupIntent を作成する前に 3DS をリクエストすべきかどうかがわかります。不正利用防止エンジンがカードの詳細と取引の詳細の両方を調べる場合、確認中に詳細情報を取得した時点でパラメーターを指定します。その後で、結果として得られた PaymentIntent または SetupIntent をクライアントに渡して、プロセスを完了します。

API リファレンスで以下の各ケースの `request_three_d_secure` パラメーターの使用方法を確認してください。

- [PaymentIntent (支払いインテント) の作成](https://docs.stripe.com/api/payment_intents/create.md#create_payment_intent-payment_method_options-card-request_three_d_secure)
- [PaymentIntent (支払いインテント) の確認](https://docs.stripe.com/api/payment_intents/confirm.md#confirm_payment_intent-payment_method_options-card-request_three_d_secure)
- [SetupIntent (支払い方法設定インテント) の作成](https://docs.stripe.com/api/setup_intents/create.md#create_setup_intent-payment_method_options-card-request_three_d_secure)
- [SetupIntent (支払い方法設定インテント) の確認](https://docs.stripe.com/api/setup_intents/confirm.md#confirm_setup_intent-payment_method_options-card-request_three_d_secure)
- [Checkout セッションを作成する](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-payment_method_options-card-request_three_d_secure)

`request_three_d_secure` を `any` に設定して、`frictionless` フローを優先して手動で 3DS をリクエストします。この場合、顧客が追加入力をせずに認証が完了する可能性が高まります。

`request_three_d_secure` を `challenge` に設定し、`challenge` フローを優先して 3DS をリクエストします。この場合、顧客はアクティブ認証のプロンプトに応答する必要があります。

ただし、カード発行会社が最終的な認証フローを決定するため、Stripe はご希望の優先順位を保証することはできません。最終的な認証フローを確認するには、[Charge (支払い)](https://docs.stripe.com/api/charges/object.md#charge_object-payment_method_details-card-three_d_secure-authentication_flow) または [SetupAttempt](https://docs.stripe.com/api/setup_attempts/object.md#setup_attempt_object-payment_method_details-card-three_d_secure-authentication_flow) の `three_d_secure` プロパティの `authentication_flow` を調査してください。3DS フローについて、詳細は Stripe の [ガイド](https://stripe.com/guides/3d-secure-2#frictionless-authentication)をご覧ください。

> Stripe は、3D セキュア認証がカードで利用可能な場合にのみ、顧客に認証の実行を促します。そのカードが利用できない場合や、認証プロセス中にエラーが発生した場合、支払いは通常どおりに処理されます。

Stripe の必須の認証ルールは、3DS を手動でリクエストしたかどうかに関係なく、自動的に実行されます。お客様からの 3DS リクエストは、SCA で要求されるリクエストに追加されます。

## 3DS フローを表示する

#### ウェブ

`confirmCardPayment` と `handleCardAction` を呼び出す際に、Stripe はポップアップモーダルで認証 UI を自動的に表示します。銀行のウェブサイトにリダイレクトすることも、iframe を使用することもできます。

Stripe.js は、3DS2 認証中に[基本デバイス情報](https://support.stripe.com/questions/3d-secure-2-device-information)を収集し、リスク分析のためにカード発行会社に送信します。

### 銀行のウェブサイトにリダイレクトする

顧客を 3DS 認証ページにリダイレクトするには、[サーバー上](https://docs.stripe.com/api/payment_intents/confirm.md#confirm_payment_intent-return_url)または[クライアント](https://docs.stripe.com/js/payment_intents/confirm_card_payment)側での確定時に PaymentIntent に `return_url` を 渡します。

確定後、PaymentIntent のステータスが *requires\_action* (This status appears as "requires_source_action" in API versions before 2019-02-11) の場合、PaymentIntent の `next_action` を調べます。これに `redirect_to_url` が含まれる場合、3DS が必要であることを意味します。

```js
next_action: {
    type: 'redirect_to_url',
    redirect_to_url: {
      url: 'https://hooks.stripe.com/...',
      return_url: 'https://mysite.com'
    }
}
```

ブラウザーで、顧客を redirect_to_url hash の `url` にリダイレクトして認証を完了します。

```javascript
  var action = intent.next_action;
  if (action && action.type === 'redirect_to_url') {
    window.location = action.redirect_to_url.url;
  }
```

認証プロセスを完了した顧客は、お客様が PaymentIntent の作成時または確認時に指定した `return_url` にリダイレクトされます。 またリダイレクトによって、`payment_intent` および `payment_intent_client_secret` の URL クエリパラメーターも追加されます。アプリケーションはこれを使用して購入に関連付けられた PaymentIntent を識別できます。

### iframe で表示する

ウェブ上の認証 UI をウェブサイトのデザインに合わせてカスタマイズすることはできません。カードを発行した銀行がフォントと色を管理します。

ただし、3DS UI が表示される「方法」と「場所」は選択できます。大多数のビジネスは、これを決済ページの上に表示されるモーダルダイアログに表示しています。自社で構築済みのモーダルコンポーネントがある場合は、3DS フレームをその中に配置できます。認証のコンテンツを決済フォームとともにインラインで表示することもできます。

#### PaymentIntent を確定する

顧客が購入を完了する準備ができたら、お客様は PaymentIntent を*確定* (Confirming a PaymentIntent indicates that the customer intends to pay with the current or provided payment method. Upon confirmation, the PaymentIntent attempts to initiate a payment)して支払いの回収プロセスを開始します。

3DS の表示方法を制御するには、`return_url` を指定します。これは認証の完了後に 3DS の `<iframe>` がリダイレクトされる場所です。お客様のサイトで[コンテンツセキュリティポリシー](https://docs.stripe.com/security/guide.md#content-security-policy)を使用している場合は、ポリシーが `https://js.stripe.com`、`https://hooks.stripe.com` からの iframe、および `return_url` に渡した URL のオリジンを許可していることを確認します。

フロントエンドから確定している場合は、Stripe.js の [confirmCardPayment](https://docs.stripe.com/js.md#stripe-confirm-card-payment) メソッドを使用します。たとえば、Stripe Elements を使用してカード情報を収集している場合は以下のようになります。

```javascript
stripe.confirmCardPayment(
  '{{PAYMENT_INTENT_CLIENT_SECRET}}',
  {
    payment_method: {card: cardElement},
    return_url: 'https://example.com/return_url'
  },
  // Disable the default next action handling.
  {handleActions: false}
).then(function(result) {
  // Handle result.error or result.paymentIntent
  // More details in Step 2.
});
```

サーバーから確定する場合は、`return_url` を指定してください。実装内容によっては、他の情報も [confirm](https://docs.stripe.com/api/payment_intents/confirm.md) に渡すことをお勧めします。

```curl
curl https://api.stripe.com/v1/payment_intents/{{PAYMENT_INTENT_ID}}/confirm \
  -u "<<YOUR_SECRET_KEY>>:" \
  --data-urlencode "return_url=https://example.com/return_url"
```

#### PaymentIntent のステータスを確認する  (サーバー側)

次に、確定した PaymentIntent の [status](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-status) プロパティーを確認して、支払いが正常に完了したかどうかを特定します。表示される可能性がある `status` の値とその意味を次のリストに示します。

| ステータス | 説明 |
| --- | --- |
| `requires_payment_method` | 要求は `402` HTTP ステータスコードで失敗しました。これは、支払いが失敗したことを示しています。[last_payment_error](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-last_payment_error) プロパティーを確認し、必要に応じて顧客から新しい支払い情報を入手して、再試行してください。 |
| `requires_capture` | リクエストは認証されずに完了しました。引き続き[売上をキャプチャーする](https://docs.stripe.com/payments/place-a-hold-on-a-payment-method.md#capture-funds)ことができます。 |
| `requires_action` | 支払いを完了するには、3DS などの追加ステップが必要です。アプリケーションに戻って支払いを完了するように顧客に依頼してください。 |
| `succeeded` | 支払いが完了し、指定した支払い方法で Charge オブジェクトが作成されます。これ以上のステップは必要ありません。 |

[2019-02-11](https://docs.stripe.com/upgrades.md#2019-02-11) 以前の API のバージョンでは、`requires_payment_method` の代わりに `requires_source`、`requires_action` の代わりに `requires_source_action` が表示されます。

#### 3DS iframe をレンダリングする (クライアント側)

`status` プロパティーの値が `requires_action` のときは、支払いを処理する前に追加ステップを完了する必要があります。3DS が必須のカード支払いの場合、PaymentIntent の `status` は `requires_action` と表示され、その [next_action](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-next_action) プロパティーは `redirect_to_url` と表示されます。`redirect_to_url` のペイロードには、3DS を表示するために iframe で開く URL が含まれます。

```javascript
  var iframe = document.createElement('iframe');
  iframe.src = paymentIntent.next_action.redirect_to_url.url;
  iframe.width = 600;
  iframe.height = 400;
  yourContainer.appendChild(iframe);
```

3DS2 については、3DS のコンテンツを 250x400、390x400、500x600、600x400 の各サイズおよび全画面で表示できるようにカード発行会社が対応する必要があります (サイズは幅 × 高さ)。3DS の UI は、iframe を厳密に上記のサイズで開くことで視認性を高めることができます。

> 3DS iframe では、`sandbox` 属性を使用できません。本番環境では、この iframe 内にある一部のコンテンツがカード発行会社によって制御されます。一部の発行会社の実装では、サンドボックス化されている場合にエラーが発生し、支払いが成功しません。

#### リダイレクトを処理する  (クライアント側)

顧客が 3DS を完了すると、iframe は PaymentIntent の確定時に指定した `return_url` に移動します。このページは、3DS 認証が完了したことを知らせるために、お客様のトップレベルのページに `postMessage` を送信する必要があります。次に、そのトップレベルのページで、支払いが成功したか、顧客による追加のアクションが必要であるかを判別する必要があります。

たとえば、`return_url` ページで次のような作業を実行することが考えられます。

```javascript
  window.top.postMessage('3DS-authentication-complete');
```

お客様の支払いのトップページで、この postMessage をリッスンして、認証が終了したときに認識できるようにする必要があります。次に、更新された PaymentIntent を取得して、支払いのステータスを確認する必要があります。認証が失敗した場合、PaymentIntent のステータスは `requires_payment_method` になります。支払いが正常に完了した場合、ステータスは `succeeded` になります。[オーソリとキャプチャーを分離する](https://docs.stripe.com/payments/place-a-hold-on-a-payment-method.md)場合、ステータスは `requires_capture` になります。

```javascript
  function on3DSComplete() {
    // Hide the 3DS UI
    yourContainer.remove();

    // Check the PaymentIntent
    stripe.retrievePaymentIntent('{{PAYMENT_INTENT_CLIENT_SECRET}}')
      .then(function(result) {
        if (result.error) {
          // PaymentIntent client secret was invalid
        } else {
          if (result.paymentIntent.status === 'succeeded') {
            // Show your customer that the payment has succeeded
          } else if (result.paymentIntent.status === 'requires_payment_method') {
            // Authentication failed, prompt the customer to enter another payment method
          }
        }
      });
  }

  window.addEventListener('message', function(ev) {
    if (ev.data === '3DS-authentication-complete') {
      on3DSComplete();
    }
  }, false);
```

#### iOS

> [PaymentSheet](https://stripe.dev/stripe-ios/stripepaymentsheet/documentation/stripepaymentsheet/paymentsheet) および [PaymentSheet.FlowController](https://stripe.dev/stripe-ios/stripepaymentsheet/documentation/stripepaymentsheet/paymentsheet/flowcontroller) は自動的に 3DS 認証に対応します。これらのクラスのいずれかを使用している場合、このガイドには該当しません。

[STPPaymentHandler](https://stripe.dev/stripe-ios/stripepayments/documentation/stripepayments/stppaymenthandler) クラスは、認証のために UIViewController をアプリ経由で提示します。[STPPaymentHandler.threeDSCustomizationSettings](https://stripe.dev/stripe-ios/stripepayments/documentation/stripepayments/stpthreedscustomizationsettings) には、3DS 認証用のカスタマイズ可能な項目が含まれています。

[authenticationTimeout](https://stripe.dev/stripe-ios/stripepayments/documentation/stripepayments/stpthreedscustomizationsettings/authenticationtimeout) プロパティーは、3DS 認証プロセスがタイムアウトになるまでの実行時間を制御します。この時間には、ネットワークのラウンドトリップ時間と顧客からの入力待ち時間の両方が含まれます。この時間は 5 分以上である必要があります。認証がタイムアウトになった場合、`STPPaymentHandler` は、完了ブロック内にコード `STPPaymentHandlerTimedOutErrorCode` でエラーを報告します。

[uiCustomization](https://stripe.dev/stripe-ios/stripepayments/documentation/stripepayments/stpthreedscustomizationsettings/uicustomization) プロパティーを使用すると、[STPThreeDSUICustomization](https://stripe.dev/stripe-ios/stripe-payments/Classes/STPThreeDSUICustomization.html) インスタンスを指定して、認証 UI の外観を制御できます。ナビゲーションバーや**送信**ボタンなどの、UI のカスタマイズ可能な要素ごとに、色、フォント、テキスト、境界線などを設定するためのプロパティーを持つ対応クラスがあります。各パラメーターについて詳細は、[STPThreeDSUICustomization ドキュメント](https://stripe.dev/stripe-ios/stripepayments/documentation/stripepayments/stpthreedsuicustomization)を参照してください。

Stripe iOS SDK は、3DS2 認証中に[デバイスの基本情報](https://support.stripe.com/questions/3d-secure-2-device-information)を収集し、リスク分析のためにカード発行会社に送信します。
![UI のカスタマイズ](https://b.stripecdn.com/docs-statics-srv/assets/3ds2-customization.4c49ec979d27637fcc3ad11b1dca10f8.png)

以下のサンプルコードは、ダークな UI のカラーテーマの設定の一部を示しています。

#### Swift

```swift
      let uiCustomization = STPPaymentHandler.shared().threeDSCustomizationSettings.uiCustomization
      uiCustomization.textFieldCustomization.keyboardAppearance = .dark
      uiCustomization.navigationBarCustomization.barStyle = .black
      uiCustomization.navigationBarCustomization.textColor = .white
      uiCustomization.buttonCustomization(for: .cancel).textColor = .white
```

顧客に提示できる 4 種類のチャレンジ画面があります。[UI のカスタマイズをテストする](https://docs.stripe.com/payments/3d-secure/authentication-flow.md#three-ds-cards)には、カスタマイズしたこれらのさまざまな画面を使用してください。

`STPPaymentHandler` に渡される [STPAuthenticationContext](https://stripe.dev/stripe-ios/stripepayments/documentation/stripepayments/stpauthenticationcontext) を使用して、どの表示コントローラーで認証 UI を表示するかなどの動作も設定できます。

### 戻り先 URL を設定する

iOS SDK では、アプリ内でネイティブな表示の代わりに WebView を表示して、顧客を認証できます (顧客が使用しているアプリのバージョンが古い場合など)。認証が終了すると、WebView は自動的に閉じられ、顧客が閉じる必要はありません。この動作を有効にするには、[カスタム URL スキーム](https://developer.apple.com/documentation/xcode/defining-a-custom-url-scheme-for-your-app)、または[ユニバーサルリンク](https://developer.apple.com/documentation/xcode/allowing-apps-and-websites-to-link-to-your-content)を構成して、URL を SDK に転送するようにアプリのデリゲートを設定します。

#### Swift

```swift
// This method handles opening custom URL schemes (for example, "your-app://stripe-redirect")
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
    let stripeHandled = StripeAPI.handleURLCallback(with: url)
    if (stripeHandled) {
        return true
    } else {
        // This was not a Stripe url – handle the URL normally as you would
    }
    return false
}

// This method handles opening universal link URLs (for example, "https://example.com/stripe_ios_callback")
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
    if userActivity.activityType == NSUserActivityTypeBrowsingWeb {
        if let url = userActivity.webpageURL {
            let stripeHandled = StripeAPI.handleURLCallback(with: url)
            if (stripeHandled) {
                return true
            } else {
                // This was not a Stripe url – handle the URL normally as you would
            }
        }
    }
    return false
}
```

次に、[PaymentIntent (支払いインテント)](https://docs.stripe.com/api/payment_intents/confirm.md#confirm_payment_intent-return_url) (支払いを回収する場合) または [SetupIntent (支払い方法設定インテント)](https://docs.stripe.com/api/setup_intents/confirm.md#confirm_setup_intent-return_url) (カード詳細を保存する場合) を確定するときに、`return_url` としてこの URL を渡します。WebView ベースの認証が終了すると、Stripe は指定された `return_url` を使用して、ユーザーを元のアプリまたはウェブページにリダイレクトします。

#### Android

> [PaymentSheet](https://stripe.dev/stripe-android/paymentsheet/com.stripe.android.paymentsheet/-payment-sheet/index.html) と [PaymentSheet.FlowController](https://stripe.dev/stripe-android/paymentsheet/com.stripe.android.paymentsheet/-payment-sheet/-flow-controller/index.html) は自動的に 3DS 認証に対応します。これらのクラスのいずれかを使用している場合、このガイドには該当しません。

[PaymentAuthConfig.Stripe3ds2Config](https://stripe.dev/stripe-android/payments-core/com.stripe.android/-payment-auth-config/-stripe3ds2-config/index.html) には、3DS 認証の対話用のカスタマイズ可能な項目が含まれています。

[timeout プロパティー](https://stripe.dev/stripe-android/payments-core/com.stripe.android/-payment-auth-config/-stripe3ds2-config/-builder/set-timeout.html)は、3DS 認証プロセスがタイムアウトになるまでの実行時間を制御します。この時間には、ネットワークのラウンドトリップ時間と顧客からの入力待ち時間の両方が含まれます。強力な*顧客* (Customer objects represent customers of your business. They let you reuse payment methods and give you the ability to track multiple payments)認証 (SCA) の規制への準拠を維持するには、この値を 5 分以上にする必要があります。5 分未満の値を指定すると、エラーになります。

[uiCustomization](https://stripe.dev/stripe-android/payments-core/com.stripe.android/-payment-auth-config/-stripe3ds2-config/-builder/set-ui-customization.html) プロパティーを使用すると、`StripeUiCustomization` インスタンスを指定して、3DS 認証中に Android SDK によって表示されるビューの外観を制御できます。Stripe は現在、色、フォント、テキスト、アプリバー上の境界線、ラベル、テキストフィールド、ボタンのカスタマイズパラメーターをサポートしています。各パラメーターの詳細な説明については、[Android SDK](https://stripe.dev/stripe-android/) のリファレンスをご覧ください。

Stripe Android SDK は、3DS2 認証中に[デバイスの基本情報](https://support.stripe.com/questions/3d-secure-2-device-information)を収集し、リスク分析のためにカード発行会社に送信します。

#### Java

```java
  final PaymentAuthConfig.Stripe3ds2UiCustomization uiCustomization =
          new PaymentAuthConfig.Stripe3ds2UiCustomization.Builder()
                  .setLabelCustomization(
                          new PaymentAuthConfig.Stripe3ds2LabelCustomization.Builder()
                                  .setTextFontSize(12)
                                  .build())
                  .build();
  PaymentAuthConfig.init(new PaymentAuthConfig.Builder()
          .set3ds2Config(new PaymentAuthConfig.Stripe3ds2Config.Builder()
                  .setTimeout(5)
                  .setUiCustomization(uiCustomization)
                  .build())
          .build());
```

#### React Native

> [PaymentSheet](https://stripe.dev/stripe-react-native/api-reference/modules/PaymentSheet.html) を使用している場合は、3DS 認証に自動的に対応するため、このガイドに従う必要はありません。

`StripeProvider` の `threeDSecureParams` プロパティーには、3DS 認証用のカスタマイズ可能アイテムがあります。

認証完了時に WebView を自動的に閉じるには、[カスタム URL スキームを設定する](https://developer.apple.com/documentation/xcode/defining-a-custom-url-scheme-for-your-app)か、[ユニバーサルリンク](https://developer.apple.com/documentation/xcode/allowing-apps-and-websites-to-link-to-your-content)を設定して、`urlScheme` パラメーターでスキームを設定します。

`timeout` を使用して、3DS 認証プロセスがタイムアウトになるまでの経過時間を指定できます。この時間には、ネットワークのラウンドトリップ時間と顧客からの入力待ち時間の両方が含まれ、5 分以上にする必要があります。

他のプロパティーを使うことで、認証 UI のデザインを管理できます。詳細については、[React Native の SDK リファレンス](https://stripe.dev/stripe-react-native/api-reference/index.html)をご覧ください。

以下は、カスタマイズの例です。

```javascript
function PaymentScreen() {
  return (
    <StripeProvider
      publishableKey="<<YOUR_PUBLISHABLE_KEY>>"
      urlScheme="your-url-scheme"
      threeDSecureParams={{
        backgroundColor: '#FFFFFF', // iOS only
        timeout: 5,
        label: {
          headingTextColor: '#0000',
          headingFontSize: 13,
        },
        navigationBar: {
          headerText: '3d secure',
        },
        footer: { // iOS only
          backgroundColor: '#FFFFFF',
        },
        submitButton: {
          backgroundColor: '#000000',
          cornerRadius: 12,
          textColor: '#FFFFFF',
          textFontSize: 14,
        },
      }}
    >
      // ....
      </StripeProvider>
  );
}
```

## 3DS フローをテストする

任意のセキュリティコード、郵便番号、将来の有効期限が記載された Stripe テストカードを使用して、サンドボックスで 3DS 認証のチャレンジフローをトリガーします。

テスト API キーを使用してシステムを構築するときに、認証プロセスで認証の模擬ページが表示されます。そのページでは支払いのオーソリまたはキャンセルを行うことができます。支払いをオーソリすると、認証の成功がシミュレートされ、お客様は指定された戻り URL にリダイレクトされます。**失敗**ボタンをクリックすると、試行での認証の失敗がシミュレートされます。

#### ウェブ

#### カード番号

| 番号 | 3DS の使用状況 | 説明 |
| --- | --- | --- |
| 4000000000003220 | 必須 | 支払いを成功させるには、常に 3DS2 認証を完了する必要があります。デフォルトの場合、Radar ルールはこのカードの 3DS 認証をリクエストします。 |
| 4000002500003155 | 必須 | このカードでは、将来の支払いに備えた[設定](https://docs.stripe.com/payments/save-and-reuse.md)がない限り、オフセッションの支払いで 3DS2 認証が必要です。設定した後は、オフセッションの支払いで認証は不要になります。 |
| 4000008400001629 | 必須 | 3DS 認証が必要ですが、認証後に支払いが `card_declined` エラーコードで拒否されます。デフォルトの場合、Radar ルールはこのカードの 3DS 認証をリクエストします。 |
| 4000000000003055 | 対応可能 | 3DS 認証も引き続き実行できますが、必須ではありません。デフォルトの場合、Radar ルールはこのカードの 3DS 認証をリクエストしません。 |
| 4242424242424242 | 対応可能 | このカードは 3DS に対応していますが、3DS に登録されていません。このため、Radar ルールで 3DS がリクエストされても、顧客は追加の認証を行いません。デフォルトの場合、Radar ルールはこのカードの 3DS 認証をリクエストしません。 |
| 378282246310005 | 対応不可 | このカードは 3DS に対応していないため、呼び出すことができません。PaymentIntent は、認証を行わずに続行されます。 |

#### PaymentMethods

| 決済手段 | 3DS の使用状況 | 説明 |
| --- | --- | --- |
| `pm_card_threeDSecure2Required` | 必須 | 支払いを成功させるには、支払いに対して 3DS2 認証を完了する必要があります。デフォルトの場合、Radar ルールはこのカードの 3DS 認証をリクエストします。 |
| `pm_card_threeDSecureRequiredChargeDeclined` | 必須 | 3D セキュア認証が必要ですが、認証後に支払いが `card_declined` エラーコードで拒否されます。デフォルトの場合、Radar ルールはこのカードの 3DS 認証をリクエストします。 |
| `pm_card_threeDSecureOptional` | 対応可能 | 3DS 認証も引き続き実行できますが、必須ではありません。デフォルトの場合、Radar ルールはこのカードの 3DS 認証をリクエストしません。 |
| `pm_card_visa` | 対応可能 | このカードは 3DS に対応していますが、3DS に登録されていません。このため、Radar ルールで 3DS がリクエストされても、顧客は追加の認証を行いません。デフォルトの場合、Radar ルールはこのカードの 3DS 認証をリクエストしません。 |
| `pm_card_amex_threeDSecureNotSupported` | 対応不可 | このカードは 3DS に対応していないため、呼び出すことができません。PaymentIntent は、認証を行わずに続行されます。 |

#### iOS

カスタムの iOS 実装をテストする場合は、テストカードを選択して特定のチャレンジフローを起動します。

| 番号 | チャレンジフロー | 説明 |
| --- | --- | --- |
| 4000582600000094 | Stripe 以外 | すべての取引で 3D セキュア 2 認証を実行する必要があります。外部 UI を使用してチャレンジフローを起動します。 |
| 4000582600000045 | 1 回限りのパスコード | すべての取引で 3D セキュア 2 認証を実行する必要があります。1 回限りのパスコード UI を使用してチャレンジフローを起動します。 |
| 4000582600000102 | 単一選択 | すべての取引で 3D セキュア 2 認証を実行する必要があります。単一選択の UI を使用してチャレンジフローを起動します。 |
| 4000582600000110 | 複数選択 | すべての取引で 3D セキュア 2 認証を実行する必要があります。複数選択の UI を使用してチャレンジフローを起動します。 |

#### Android

カスタムの Android 実装をテストする場合は、テストカードを選択して特定のチャレンジフローを起動します。

| 番号 | チャレンジフロー | 説明 |
| --- | --- | --- |
| 4000582600000094 | Stripe 以外 | すべての取引で 3D セキュア 2 認証を実行する必要があります。外部 UI を使用してチャレンジフローを起動します。 |
| 4000582600000045 | 1 回限りのパスコード | すべての取引で 3D セキュア 2 認証を実行する必要があります。1 回限りのパスコード UI を使用してチャレンジフローを起動します。 |
| 4000582600000102 | 単一選択 | すべての取引で 3D セキュア 2 認証を実行する必要があります。単一選択の UI を使用してチャレンジフローを起動します。 |
| 4000582600000110 | 複数選択 | すべての取引で 3D セキュア 2 認証を実行する必要があります。複数選択の UI を使用してチャレンジフローを起動します。 |

#### React Native

カスタムの React Native 実装をテストする場合は、テストカードを選択して特定のチャレンジフローを起動します。

| 番号 | チャレンジフロー | 説明 |
| --- | --- | --- |
| 4000582600000094 | Stripe 以外 | すべての取引で 3D セキュア 2 認証を実行する必要があります。外部 UI を使用してチャレンジフローを起動します。 |
| 4000582600000045 | 1 回限りのパスコード | すべての取引で 3D セキュア 2 認証を実行する必要があります。1 回限りのパスコード UI を使用してチャレンジフローを起動します。 |
| 4000582600000102 | 単一選択 | すべての取引で 3D セキュア 2 認証を実行する必要があります。単一選択の UI を使用してチャレンジフローを起動します。 |
| 4000582600000110 | 複数選択 | すべての取引で 3D セキュア 2 認証を実行する必要があります。複数選択の UI を使用してチャレンジフローを起動します。 |

その他の Visa と Mastercard の[テストカード](https://docs.stripe.com/testing.md)はすべて、顧客のカード発行会社からの認証を必要としません。

[テスト環境でカスタムの Radar ルール](https://dashboard.stripe.com/settings/radar/rules)を作成して、テストカードで認証をトリガーできます。詳しくは、[Radar ルールのテスト](https://docs.stripe.com/radar/testing.md)をご覧ください。

## 不審請求の申請とライアビリティシフト

*ライアビリティシフト* (With some 3D Secure transactions, the liability for fraudulent chargebacks (stolen or counterfeit cards) shifts from you to the card issuer) ルールは、通常、3DS を使用して正常に認証された決済に適用されます。場合によっては、ライアビリティシフトは同等の暗号資産化情報 ([Apple Pay](https://docs.stripe.com/apple-pay.md) や [Google Pay](https://docs.stripe.com/google-pay.md) など) に適用されます。カード保有者が 3DS 決済を不正利用として[不審請求の申し立て](https://docs.stripe.com/disputes.md)をした場合、ライアビリティは通常、ユーザーからカード発行会社に移動します。

カードが 3DS に対応していないか、認証プロセスでエラーが発生した場合、支払いは通常どおりに進行します。このときは 3DS の認証が正常に行われていないため、通常、責任は発行会社に移動しません。

言い換えると、実際には支払いがライアビリティシフトルールの対象になっていれば、通常は不正利用のマークが付けられた不審請求の申請をお客様が受け取ることはありませんが、それでも[不正利用の早期警告](https://docs.stripe.com/disputes/how-disputes-work.md#early-fraud-warnings)は受け取る可能性があります。低い割合ながら不正利用に関する申請を受け取る可能性もあります。ライアビリティシフトルールが適用されない事例をいくつか以下に挙げます。

3DS を使用して正常に認証された支払いに関して[不審請求の申請の照会](https://docs.stripe.com/disputes/how-disputes-work.md#inquiries)を受ける場合があります。このタイプの不審請求の申請は、単なる情報のリクエストであるため、チャージバックが発生することはありません。

3D セキュアによって認証された支払いに関する照会を受けた場合、応答する「必要があります」。応答しないと、カード保有者の銀行が「無応答チャージバック」と呼ばれる金融チャージバックを開始して、ライアビリティシフトが無効になる可能性があるためです。3DS の支払いに対する無応答チャージバックを防ぐには、支払いに関する十分な情報を送信するようにします。注文内容、配送方法、配送先についての情報を含めてください (物品、電子製品、またはサービスのいずれの場合も)。

> その他の理由 ([商品を受け取っていない](https://docs.stripe.com/disputes/categories.md)など) で顧客が支払いの不審請求を申請した場合は、標準的な不審請求の申請プロセスが適用されます。経営管理、特に不審請求の申請への対応と申請そのものの回避について、十分な情報に基づいて判断してください。

カードネットワークで 3DS が要求されているにもかかわらず、そのカードやカード発行会社が 3DS に対応していない場合にも、ライアビリティシフトが発生する可能性があります。これは、カードネットワークが 3DS の対応を要求しているにもかかわらず、カード発行会社の 3DS プロバイダーがダウンしている場合や、カード発行会社が 3DS に対応していない場合に発生することがあります。カードが 3DS に登録されていない場合、支払いプロセス中にカード保有者に 3DS 認証を完了するように求めるメッセージは表示されません。その場合、カード保有者が 3DS 認証を完了していなかったとしても、責任はカード発行会社に移ります。

Stripeは、リクエストされた *Electronic Commerce Indicator* (An Electronic Commerce Indicator (ECI) is a code returned alongside a 3D Secure authentication result. It indicates the authentication method and result and may be used subsequently to, for example, determine eligibility for liability shift) (ECI) を [3DS 認証結果](https://docs.stripe.com/api/charges/object.md#charge_object-payment_method_details-card-three_d_secure)の `electronic_commerce_indicator` で返します。このインジケーターは、請求がライアビリティシフトルールに従う必要があるかどうかを判断するのに役立ちます。3DS は最初の支払いインテントのレスポンスに続いて発生するため、通常は、設定した [Webhook エンドポイントまたはその他のイベントの送信先](https://docs.stripe.com/event-destinations.md)のいずれかに送信される `charge.succeeded` イベントから取得します。リクエストされた ECI は、イシュアーのレスポンスで劣化する可能性がありますが、この情報は開示されません。

> 3DS を使用して支払いの認証が成功しても、ライアビリティシフトが発生しないことがあります。これはまれなケースですが、たとえば、アカウントで過度の不正利用があり、[不正利用モニタリングプログラム](https://docs.stripe.com/disputes/monitoring-programs.md#visa-programs)に登録されている場合などに起こることがあります。また、一部のネットワークは、特定の業種をライアビリティシフトの対象から除外しています。たとえば Visa は、電信送金または小為替を処理するビジネス、外貨または法定通貨以外の通貨を取引しているビジネス (金融機関以外)、あるいはストアドバリューカードの購入・補充行為に対し、ライアビリティシフトをサポートしていません。

ライアビリティシフトがオーソリ後にダウングレードされたり、カードネットワークの不審請求の申し立て拒否システムが取引のライアビリティシフトに対応できなかったりすることもあります。このような場合、不審請求の申し立てに反証すると、Stripe はリクエストされた ECI と決済の[3DS 認証結果](https://docs.stripe.com/api/charges/object.md#charge_object-payment_method_details-card-three_d_secure-result)を反証資料の詳細に自動的に追加しますが、不審請求の申し立てに勝つ可能性を高めるために、追加の詳細を含めることもお勧めします。

### 3DS とライアビリティシフトに関するカスタム Radar ルール

[Radar Plus](https://stripe.com/radar/fraud-teams) を使用している場合は、3DS をリクエストするタイミングと、各認証結果およびライアビリティシフトの扱いを制御できるように[ルールをカスタマイズ](https://docs.stripe.com/radar/rules.md#request-3d-secure)できます。Stripe の [Strong Customer Authentication](https://stripe.com/guides/strong-customer-authentication) (SCA) ルールは、カスタム Radar ルールとは独立して自動的に実行され、免除されない限り未認証の決済をブロックします。

## See also

- [3DS の結果のインポート](https://docs.stripe.com/payments/payment-intents/three-d-secure-import.md)
- [認証の分析](https://docs.stripe.com/payments/analytics/authentication.md)
- [強力な顧客認証 (SCA)への対応](https://docs.stripe.com/strong-customer-authentication.md)
- [不審請求の申し立てと不正利用の防止](https://docs.stripe.com/disputes/prevention.md)
