# Stripe Terminal をテストする

Terminal の組み込みを効果的にテストする方法をご紹介します。

> Stripe Terminal をテストするプロセスの大半は、Stripe のオンライン決済のテストと類似しています。また、テスト環境では Stripe Terminal でモバイルウォレット (Apple Pay や Google Pay など) を使用することはできません。詳細については、[Stripe の一般テストガイド](https://docs.stripe.com/testing.md)をご覧ください。

Terminal のデプロイを成功させる最善の方法は、システムの各部分をテストすることです。Stripe は各ステージ用のテストツールを用意しています。

1. リーダーを注文する前に、リーダーシミュレーターで組み込みをテストします。
2. 物理テストカードでハードウェアの組み込みをテストします。

## シミュレーションされたリーダー

- [discoverReaders (JavaScript)](https://docs.stripe.com/terminal/references/api/js-sdk.md#discover-readers)
- [DiscoveryConfiguration (iOS)](https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPDiscoveryConfiguration.html)
- [DiscoveryConfiguration (Android)](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-discovery-configuration/index.html)

- [Discover リーダー](https://docs.stripe.com/api/terminal/readers/list.md)

Stripe Terminal SDK およびサーバー主導型の連携にはシミュレーションされた内蔵カードリーダーが付属しているため、物理ハードウェアに接続することなくアプリを開発してテストすることができます。連携が完了している場合も、構築中であっても、シミュレーションされたリーダーを使用してアプリ内のすべての Terminal フローをエミュレートします。

シミュレーション済みのリーダーには UI が表示されません。アプリで接続した後、Stripe SDK または API への呼び出しが成功すると、これが機能していることを確認できます。

SDK のシミュレーションされたリーダーは、必要に応じて自動的にカード提示をシミュレーションします。サーバー主導型のシステムでは、構築済みのシステムを更新して、[カード提示をシミュレーションします](https://docs.stripe.com/terminal/references/testing.md#simulated-card-presentment)。

## シミュレーションされたテストカード

- [SimulatorConfiguration (iOS)](https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPSimulatorConfiguration.html)
- [SimulatorConfiguration (Android)](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-simulator-configuration/index.html)

シミュレーションされたリーダーは、シミュレーションされたテストカードを使用するよう設定できます。これにより、POS アプリケーション内のさまざまなフローをテストできるようになります。

決済手段を収集する前に、シミュレーションされたリーダーを以下のいずれかのテストカード番号またはテスト決済手段のいずれかで特定した応答を生成するように設定してください。収集ステップ中に設定された設定 (例えばテストカード番号) は 30 分間永続化されます。つまり、次の確認ステップは同じ構成を使い、明示的にパスしなくても同じ構成になります。確認コールで渡される構成は、コレクトステップのキャッシュ値よりも優先されます。

### 標準的なテストカード

| テストカード番号 | テスト決済手段 | ブランド |
| --- | --- | --- |
| 4242424242424242 | `visa` | Visa |
| 4000056655665556 | `visa_debit` | Visa (デビット) |
| 5555555555554444 | `mastercard` | Mastercard |
| 5200828282828210 | `mastercard_debit` | Mastercard (デビット) |
| 5105105105105100 | `mastercard_prepaid` | Mastercard (プリペイド) |
| 378282246310005 | `amex` | アメリカン・エキスプレス |
| 371449635398431 | `amex2` | アメリカン・エキスプレス |
| 6011111111111117 | `discover` | Discover |
| 6011000990139424 | `discover2` | Discover |
| 3056930009020004 | `diners` | ダイナースクラブ |
| 36227206271667 | `diners_14digits` | ダイナースクラブ (14 桁のカード) |
| 3566002020360505 | `jcb` | JCB |
| 6200000000000005 | `unionpay` | 銀聯 |
| 4506445006931933 | `interac` | Interac |
| 6280000360000978 | `eftpos_au_debit` | eftpos オーストラリア |
| 4000050360000001 | `eftpos_au_visa_debit` | eftpos オーストラリア/Visa |
| 5555050360000080 | `eftpos_au_mastercard_debit` | eftpos オーストラリア/Mastercard |
| 4000002500001001 | `cartes_bancaires_visa_debit` | Cartes Bancaires (CB) / Visa |
| 5555552500001001 | `cartes_bancaires_mastercard_debit` | Cartes Bancaires (CB) / Mastercard |
| 4711009900000316877 | `girocard_debit` | Girocard |

### 特定の成功のためのテストカード

| テストカード番号 | テスト決済手段 | 結果 |
| --- | --- | --- |
| 4001007020000002 | `offline_pin_cvm` | カード保有者が*オフライン PIN* (Offline PIN is a card verification method for EMV chip cards. These cards store the PIN securely on the chip itself, so PIN verification can occur without a network connection) の入力を求められるフローがシミュレーションされます。結果として得られる支払いでは、[cardholder_verification_method](https://docs.stripe.com/api/charges/object.md#charge_object-payment_method_details-card_present-receipt-cardholder_verification_method) が `offline_pin` に設定されます。 |
| 4000008260000075 | `offline_pin_sca_retry` | [SCA](https://docs.stripe.com/strong-customer-authentication.md) によってトリガーされる再試行フローがシミュレーションされます。カード保有者が最初の非接触型決済に失敗すると、リーダーがユーザーにカードを挿入して*オンライン PIN* (Online PIN is a card verification method for EMV chip cards. These cards require the terminal to contact the issuer over a network connection to verify the PIN) を入力するように求めます。結果として得られる支払いでは、[cardholder_verification_method](https://docs.stripe.com/api/charges/object.md#charge_object-payment_method_details-card_present-receipt-cardholder_verification_method) が `offline_pin` に設定されます。 |
| 4001000360000005 | `online_pin_cvm` | カード保有者にメッセージが表示され、カード保有者が*オンライン PIN* (Online PIN is a card verification method for EMV chip cards. These cards require the terminal to contact the issuer over a network connection to verify the PIN) を入力する操作がシミュレーションされます。結果として得られる支払いでは、[cardholder_verification_method](https://docs.stripe.com/api/charges/object.md#charge_object-payment_method_details-card_present-receipt-cardholder_verification_method) が `online_pin` に設定されます。 |
| 4000002760000008 | `online_pin_sca_retry` | [SCA](https://docs.stripe.com/strong-customer-authentication.md) によってトリガーされる再試行フローがシミュレーションされます。このフローでは、カード保有者の初回の非接触型支払いが失敗し、リーダーから、ユーザーに*オンライン PIN* (Online PIN is a card verification method for EMV chip cards. These cards require the terminal to contact the issuer over a network connection to verify the PIN) の入力が求められます。最終的な支払いで、[cardholder_verification_method](https://docs.stripe.com/api/charges/object.md#charge_object-payment_method_details-card_present-receipt-cardholder_verification_method) が `online_pin` に設定されます。 |

### 特定のエラーのためのテストカード

> [請求せずに直接保存する](https://docs.stripe.com/terminal/features/saving-payment-details/save-directly.md)ために上記のカードを使用すると、[SetupIntents](https://docs.stripe.com/api/setup_intents.md) で、[setup_intent_authentication_failure](https://docs.stripe.com/error-codes.md#setup-intent-authentication-failure) レスポンスが返されます。

| テストカード番号 | テスト決済手段 | 結果 |
| --- | --- | --- |
| 4000000000000002 | `charge_declined` | 支払いは `card_declined` コードで拒否されます。 |
| 4000000000009995 | `charge_declined_insufficient_funds` | 支払いは `card_declined` コードで拒否されます。[decline_code](https://docs.stripe.com/declines/codes.md) 属性は `insufficient_funds` です。 |
| 4000000000009987 | `charge_declined_lost_card` | 支払いは `card_declined` コードで拒否されます。[decline_code](https://docs.stripe.com/declines/codes.md) 属性は `lost_card` です。 |
| 4000000000009979 | `charge_declined_stolen_card` | 支払いは `card_declined` コードで拒否されます。[decline_code](https://docs.stripe.com/declines/codes.md) 属性は `stolen_card` です。 |
| 4000000000000069 | `charge_declined_expired_card` | 支払いは `expired_card` コードで拒否されます。 |
| 4000000000000119 | `charge_declined_processing_error` | 支払いは `processing_error` コードで拒否されます。 |
| 4000000000005126 | `refund_fail` | 決済は成功しますが、[キャプチャーされた決済の返金](https://docs.stripe.com/refunds.md#failed-refunds) は、`failure_reason` (`expired_or_canceled_card`) で非同期的に失敗します。返金は非同期的に失敗するため、返金する最初は成功したように表示され、後続の取得では `失敗` したステータスのみが返されます。また、`refund.failed` [Webhook](https://docs.stripe.com/api/events/types.md#event_types-refund.failed) イベントを使用して返金する失敗も通知されます。 |

## シミュレーションされたカード提示

サーバー主導型の実装を使用する場合、リーダーでのカード保有者のタップまたはリーダーへのカードの挿入をシミュレーションするには、[present_payment_method](https://docs.stripe.com/api/terminal/readers/present_payment_method.md) エンドポイントを使用します。

```curl
curl -X POST https://api.stripe.com/v1/test_helpers/terminal/readers/tmr_xxx/present_payment_method \
  -u "<<YOUR_SECRET_KEY>>:"
```

```json
{
  "id": "tmr_xxx",
  "object": "terminal.reader",
  "action": {
    "failure_code": null,
    "failure_message": null,
    "process_payment_intent": {
      "payment_intent": "pi_xxx"
    },
    "status": "succeeded",
    "type": "process_payment_intent"
  },
  …
}
```

パラメーターを指定しない場合、シミュレーションされた支払いは、PaymentIntent の支払い方法のタイプに基づき、デフォルトで有効な[テストカード](https://docs.stripe.com/terminal/references/testing.md#standard-test-cards)になります。以下は、Terminal 支払い方法タイプ用のデフォルトのテストカードです。

| 支払い方法のタイプ | テストカード番号 | テスト決済手段 |
| --- | --- | --- |
| `card_present` | 4242424242424242 | `visa` |
| `card_present` と `interac_present` | 4242424242424242 | `visa` |
| `interac_present` | 4506445006931933 | `interac` |

[標準的なテストカード](https://docs.stripe.com/terminal/references/testing.md#standard-test-cards)では、[テスト金額](https://docs.stripe.com/terminal/references/testing.md#physical-test-cards)を使用して失敗シナリオをシミュレーションすることもできます

## 端末アップデートのテスト

端末ソフトウェアのアップデートシナリオを使用して、実装がアップデートをどのように処理するかをテストできます。サンドボックス内のシミュレート端末および実機のモバイル端末で動作します。

#### iOS

- [TestReaderUpdate (iOS)](https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPTestReaderUpdate.html)
- [TestReaderUpdateType (iOS)](https://stripe.dev/stripe-terminal-ios/docs/Enums/SCPTestReaderUpdateType.html)
- [BluetoothConnectionConfiguration (iOS)](https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPBluetoothConnectionConfiguration.html)
- [UsbConnectionConfiguration (iOS)](https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPUsbConnectionConfiguration.html)
- [TapToPayConnectionConfiguration (iOS)](https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPTapToPayConnectionConfiguration.html)

接続時に端末アップデートシナリオをトリガーするには、`testReaderUpdate` プロパティを [BluetoothConnectionConfiguration](https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPBluetoothConnectionConfiguration.html)、[UsbConnectionConfiguration](https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPUsbConnectionConfiguration.html)、または [TapToPayConnectionConfiguration](https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPTapToPayConnectionConfiguration.html) に設定します。シミュレート端末および実機のモバイル端末、サンドボックス内のシミュレート Tap to Pay 端末で動作します。

ファクトリーメソッドのいずれかを使用して [TestReaderUpdate](https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPTestReaderUpdate.html) を作成します。オプションで、`.firmware`、`.config`、`.keys`、`.incremental` などの [UpdateComponent](https://stripe.dev/stripe-terminal-ios/docs/Enums/SCPUpdateComponent.html) の値を指定できます。

| TestReaderUpdate | 結果 |
| --- | --- |
| `.available(components)` | オプションのアップデートが利用可能です。アップデートが利用可能であることをユーザーに通知し、`requiredAt` の日付を強調表示します。 |
| `.required(components)` | 必須のアップデートが接続時に実行されます。`MobileReaderDelegate` は `didStartInstallingUpdate` コールバックを受信します。 |
| `.requiredOffline(components)` | 必須のアップデートが存在します。[オフライン](https://docs.stripe.com/terminal/features/operate-offline/collect-card-payments.md?terminal-card-present-integration=terminal&terminal-sdk-platform=ios&reader-type=simulated#connect-while-offline)で接続した場合、端末のバージョンが許可されていないため接続に失敗します。オンラインで接続した場合、端末はアップデートされて正常に接続されます。 |
| `.lowBattery()` | 必須のアップデートが存在しますが、端末のバッテリー残量が不足しているためアップデートを開始できません。接続に失敗します。 |
| `.lowBatterySucceedConnect()` | 必須のアップデートが存在しますが、端末のバッテリー残量が不足しているためアップデートを開始できません。アップデートは失敗しますが、端末が最新のソフトウェアバージョンで動作しているため接続は成功します。 |
| `.random()` | 前述のシナリオのいずれかをランダムに選択するか、`nil` を選択して利用可能なアップデートがない状態をシミュレートします。 |

#### Swift

```swift
// Create a TestReaderUpdate to simulate a required update during connection
let testReaderUpdate = TestReaderUpdate.required([.firmware, .config])

let connectionConfig: BluetoothConnectionConfiguration
do {
    connectionConfig = try BluetoothConnectionConfigurationBuilder(delegate: readerDelegate, locationId: ""{{LOCATION_ID}}"")
        .setTestReaderUpdate(testReaderUpdate)
        .build()
} catch {
    // Handle the error building the connection configuration
    return
}
Terminal.shared.connectReader(selectedReader, connectionConfig: connectionConfig) { reader, error in
    if let reader = reader {
        print("Successfully connected to reader: \(reader)")
    } else if let error = error {
        print("connectReader failed: \(error)")
    }
}
```

> `TapToPayConnectionConfiguration` は `.required(components)` シナリオのみをサポートしています。それ以外のタイプはエラーを返します。

#### SimulatorConfiguration アプローチの使用  (非推奨)

> `simulatorConfiguration.availableReaderUpdate` アプローチは SDK 5.5 以降非推奨です。代わりに `testReaderUpdate` 接続設定プロパティを使用してください。

`Terminal.shared.simulatorConfiguration.availableReaderUpdate` を以下のいずれかに設定します。`connectReader` を呼び出すと、シミュレートされたリーダーのアップデートがトリガーされます。これは、シミュレートされたモバイルリーダーでのみ動作します。

| 設定の更新 | 結果 |
| --- | --- |
| `SimulateReaderUpdateNone` | 利用可能なアップデートはありません。 |
| `SimulateReaderUpdateRequired` | 必須のアップデートが提供され、更新に 1 分かかります。`MobileReaderDelegate` は `didStartInstallingUpdate` コールバックを受信します。 |
| `SimulateReaderUpdateRequiredForOffline` | 必須のアップデートが未実施のまま期限を過ぎており、完了に 1 分かかります。[オフライン](https://docs.stripe.com/terminal/features/operate-offline/collect-card-payments.md?terminal-card-present-integration=terminal&terminal-sdk-platform=ios&reader-type=simulated#connect-while-offline)で操作した場合、リーダーは接続できません。`MobileReaderDelegate` は `didStartInstallingUpdate` コールバックを受信します。 |
| `SimulateReaderUpdateAvailable` | オプションのアップデートが利用可能です。アップデートが利用可能であることをユーザーに通知し、`requiredAt` の日付を強調表示します。 |
| `SimulateReaderUpdateLowBattery` | 必須のアップデートのインストールが開始されますが、端末のバッテリー残量が少ないため失敗します。端末の接続も失敗します。これは、端末が古いソフトウェアバージョンで動作している状態をシミュレートします。 |
| `SimulateReaderUpdateLowBatterySucceedConnect` | 必須のアップデートのインストールが開始されますが、端末のバッテリー残量が少ないため失敗します。それでも端末は接続できます。これは、端末がまだ許可されている最新のソフトウェアバージョンで動作している状態をシミュレートします。アップデートは次回の端末接続時に再試行されます。 |
| `SimulateReaderUpdateRandom` | 前述のシナリオのいずれかをランダムに選択します。 |

#### Android

- [TestReaderUpdate (Android)](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-test-reader-update/index.html)
- [TestReaderUpdateType (Android)](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-test-reader-update/-test-reader-update-type/index.html)
- [BluetoothConnectionConfiguration (Android)](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-connection-configuration/-bluetooth-connection-configuration/index.html)
- [UsbConnectionConfiguration (Android)](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-connection-configuration/-usb-connection-configuration/index.html)

接続時に端末アップデートをトリガーするには、`connectReader` を呼び出す前に [BluetoothConnectionConfiguration](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-connection-configuration/-bluetooth-connection-configuration/index.html) または [UsbConnectionConfiguration](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-connection-configuration/-usb-connection-configuration/index.html) の `testReaderUpdate` パラメーターを設定します。サンドボックス内のシミュレート端末および実機のモバイル端末で動作します。

ファクトリーメソッドのいずれかを使用して [TestReaderUpdate](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-test-reader-update/index.html) を作成します。オプションで、`FIRMWARE`、`CONFIG`、`KEYS`、`INCREMENTAL` などの [UpdateComponent](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-reader-software-update/-update-component/index.html) の値を指定できます。

| TestReaderUpdate | 結果 |
| --- | --- |
| `.available(components)` | オプションのアップデートが利用可能です。アップデートが利用可能であることをユーザーに通知し、`requiredAt` の日付を強調表示します。 |
| `.required(components)` | 必須のアップデートが接続時に実行されます。`MobileReaderListener` は `onStartInstallingUpdate` コールバックを受信します。 |
| `.requiredOffline(components)` | 必須のアップデートが存在します。[オフライン](https://docs.stripe.com/terminal/features/operate-offline/collect-card-payments.md?terminal-card-present-integration=terminal&terminal-sdk-platform=android&reader-type=simulated#connect-while-offline)で接続した場合、端末のバージョンが許可されていないため接続に失敗します。オンラインで接続した場合、端末はアップデートされて正常に接続されます。 |
| `.lowBattery()` | 必須のアップデートが存在しますが、端末のバッテリー残量が不足しているためアップデートを開始できません。接続に失敗します。 |
| `.lowBatterySucceedConnect()` | 必須のアップデートが存在しますが、端末のバッテリー残量が不足しているためアップデートを開始できません。アップデートは失敗しますが、端末が最新のソフトウェアバージョンで動作しているため接続は成功します。 |
| `.random()` | 前述のシナリオのいずれかをランダムに選択するか、`null` を選択して利用可能なアップデートがない状態をシミュレートします。 |

#### Kotlin

```kotlin
// Create a TestReaderUpdate to simulate a required update during connection
val testReaderUpdate = TestReaderUpdate.required(
    setOf(
        ReaderSoftwareUpdate.UpdateComponent.FIRMWARE,
        ReaderSoftwareUpdate.UpdateComponent.CONFIG
    )
)

val connectionConfig = BluetoothConnectionConfiguration(
    ""{{LOCATION_ID}}"",
    autoReconnectOnUnexpectedDisconnect = true,
    bluetoothReaderListener = readerListener,
    testReaderUpdate = testReaderUpdate
)

Terminal.getInstance().connectReader(
    selectedReader,
    connectionConfig,
    object : ReaderCallback {
        override fun onSuccess(reader: Reader) {
            println("Successfully connected to reader: $reader")
        }

        override fun onFailure(e: TerminalException) {
            println("connectReader failed: ${e.errorMessage}")
        }
    }
)
```

#### SimulatorConfiguration アプローチの使用  (非推奨)

> `SimulatorConfiguration.update` アプローチは SDK 5.5 以降非推奨です。代わりに `testReaderUpdate` 接続設定パラメーターを使用してください。

`Terminal.getInstance().simulatorConfiguration` を、`update` フィールドが以下のいずれかに設定された新しい `SimulatorConfiguration` インスタンスに設定します。`connectReader` を呼び出すと、シミュレートされたリーダーのアップデートがトリガーされます。これは、シミュレートされたモバイルリーダーでのみ動作します。

| 設定の更新 | 結果 |
| --- | --- |
| `NONE` | 利用可能なアップデートはありません。 |
| `REQUIRED` | 必須の更新が提供されている場合は、更新に 1 分かかります。`MobileReaderListener` は `onStartInstallingUpdate` コールバックを受信します。 |
| `REQUIRED_FOR_OFFLINE` | 必須のアップデートが期限切れで、完了に 1 分かかります。[オフライン](https://docs.stripe.com/terminal/features/operate-offline/collect-card-payments.md?terminal-card-present-integration=terminal&terminal-sdk-platform=android&reader-type=simulated#connect-while-offline)で操作した場合、端末は接続できません。`MobileReaderListener` は `onStartInstallingUpdate` コールバックを受信します。 |
| `UPDATE_AVAILABLE` | オプションのアップデートが利用可能です。アップデートが利用可能であることをユーザーに通知し、`requiredAt` の日付を強調表示します。 |
| `LOW_BATTERY` | 必須のアップデートのインストールが開始されますが、端末のバッテリー残量が少ないため失敗します。端末の接続も失敗します。これは、端末が古いソフトウェアバージョンで動作している状態をシミュレートします。 |
| `LOW_BATTERY_SUCCEED_CONNECT` | 必須のアップデートのインストールが開始されますが、端末のバッテリー残量が少ないため失敗します。それでも端末は接続できます。これは、端末がまだ許可されている最新のソフトウェアバージョンで動作している状態をシミュレートします。アップデートは次回の端末接続時に再試行されます。 |
| `RANDOM` | 前述のシナリオのいずれかをランダムに選択します。 |

#### React Native

接続中にリーダーの更新シナリオをトリガーするには、`connectReader` を呼び出す前に、`ConnectBluetoothReaderParams`、`ConnectBluetoothProximityReaderParams`、または `ConnectUsbReaderParams` で `testReaderUpdate` パラメーターを設定します。これは、サンドボックス内のシミュレートされたモバイルリーダーおよび物理的なモバイルリーダーで機能します。

次のいずれかのタイプで `TestReaderUpdate` オブジェクトを指定します。サポートされている更新タイプの場合、`components` フィールドで `FIRMWARE`、`CONFIG`、`KEYS`、または `INCREMENTAL` などの `UpdateComponent` 値の配列を指定できます。

| TestReaderUpdate | 結果 |
| --- | --- |
| `{ type: 'available', components }` | オプションのアップデートが利用可能です。アップデートが利用可能であることをユーザーに通知し、`requiredAt` の日付を強調表示します。 |
| `{ type: 'required', components }` | 必須の更新は接続中に実行されます。`useStripeTerminal` インスタンスは `onDidStartInstallingUpdate` コールバックを受信します。 |
| `{ type: 'requiredOffline', components }` | 必須の更新が存在します。オフラインで接続した場合、リーダーのバージョンが許可されていないため、接続は失敗します。オンラインで接続した場合は、リーダーが更新され、正常に接続されます。 |
| `{ type: 'lowBattery' }` | 必須のアップデートが存在しますが、端末のバッテリー残量が不足しているためアップデートを開始できません。接続に失敗します。 |
| `{ type: 'lowBatterySucceedConnect' }` | 必須のアップデートが存在しますが、端末のバッテリー残量が不足しているためアップデートを開始できません。アップデートは失敗しますが、端末が最新のソフトウェアバージョンで動作しているため接続は成功します。 |
| `{ type: 'random' }` | 前述のシナリオのいずれかをランダムに選択するか、利用可能な更新がない状態をシミュレートします。 |

```typescript
import {
  useStripeTerminal,
  UpdateComponent,
} from '@stripe/stripe-terminal-react-native';

const { connectReader } = useStripeTerminal();

const { reader, error } = await connectReader({
  discoveryMethod: 'bluetoothScan',
  reader: selectedReader,
  locationId: '<location_id>',
  testReaderUpdate: {
    type: 'required',
    components: [UpdateComponent.FIRMWARE, UpdateComponent.CONFIG],
  },
});

if (error) {
  console.log(`connectReader failed: ${error.message}`);
  return;
}

console.log('Successfully connected to reader:', reader);
```

> `ConnectTapToPayParams` の `testReaderUpdate` は iOS 専用であり、`required` タイプと `random` タイプをサポートします。更新を行わない場合は省略します。Android で設定すると、エラーが返されます。

## テスト用の法人カード

物理テストクレジットカードを使用して、Stripe Terminal リーダーで Payments をテストします。[Stripe ダッシュボード](https://dashboard.stripe.com/terminal/shop)の Terminal タブからリーダーと物理テストカードを購入できます。[B2](https://b2ps.com/product-category/b2-payment-testing-products/) などのプロバイダーの物理テストカードもサポートしています。

このテスト用の法人カードは、チップ型および非接触型のどちらの決済にも対応しています。Stripe の認証済みリーダーで、[サンドボックス](https://docs.stripe.com/sandboxes.md)の Stripe API に対してのみ機能します。テスト用の法人カードを本番環境で使用しようとすると、Stripe API はエラーを返します。特に記載がない限り、要求された場合は PIN `1234` を使用してください。

テスト用の物理クレジットカードを使用して決済を作成する際は、末尾が以下の値になる金額を使用して特定のレスポンスを生成します。

| 小数 | 結果 |
| --- | --- |
| **00** | 支払いは承認されます。 |
| **01** | 支払いは `call_issuer` コードで拒否されます。 |
| **02** | カード保有者向けの画面を備えたリーダーを使用する場合、テストカードを挿入 (または、サポートされている場合はタップ) します。カードに PIN が必要な場合、支払いは `offline_pin_required` で拒否され、リーダーがチップ型に対応していれば PIN の入力が要求されます。`1234` を入力してテスト支払いを完了します。 |
| **03** | カード保有者向けの画面を備えたリーダーを使用する場合、テストカードを挿入 (または、サポートされている場合はタップ) します。カードで PIN が求められる場合、支払いは `online_or_offline_pin_required` で拒否され、PIN の入力が要求されます。任意の 4 桁の PIN を入力してテスト支払いを完了します。 |
| **05** | 支払いは `generic_decline` コードで拒否されます。 |
| **55** | 支払いは `incorrect_pin` コードで拒否されます。 |
| **65** | 支払いは `withdrawal_count_limit_exceeded` コードで拒否されます。 |
| **75** | 支払いは `pin_try_exceeded` コードで拒否されます。 |

たとえば、物理的なテストカードを使用して処理された「25.00 USD」の支払いは成功しますが、「10.05 USD」の支払いは拒否されます。

> 通貨によっては、小数[がゼロ](https://docs.stripe.com/currencies.md#zero-decimal)のものもあります。これらの通貨では、上の表の小数点以下 2 桁を、一番右の 2 桁として使用します。
> 
> たとえば、支払いが `generic_decline` コードで拒否されるようにするには、_「105 JPY」_の金額が必要です。

### Interac テストカード (カナダのみ)

Interac の導入をテストするには、シミュレーションされた `interac` テストカード、または *「Interac の物理テストカード」* を使用できます。このカードは、ダッシュボードの [Terminal ハードウェアショップ](https://dashboard.stripe.com/terminal/shop)で注文できます。Stripe ブランドの物理テストカードは、Interac クレジットカードとして使用できません。

Interac テストカードは、`interac_present` 支払いと `interac_present` 返金の両方で機能します。`card_present` 支払いをテストする際に使用するのと同じ[テスト金額](https://docs.stripe.com/terminal/references/testing.md#physical-test-cards)を使用できます。特に記載がない限り、要求された場合は PIN `1234` を使用してください。拒否された返金をテストするには、末尾が `01`、`05`、`55`、`65` または `75` の金額で一部返金を作成します。

> Interac テストカードは、非接触型決済に対応していません。

### eftpos テストカード (オーストラリアのみ)

eftpos の導入をテストするには、シミュレーションされた `eftpos` テストカード、または _eftpos の物理テストカード _ を使用できます。このカードは、ダッシュボードの [Terminal ハードウェアショップ](https://dashboard.stripe.com/terminal/shop)で注文できます。Stripe ブランドの物理テストカードは、`eftpos` カードとして使用できません。

`card_present` 支払いをテストする際に使用するのと同じ[テスト金額](https://docs.stripe.com/terminal/references/testing.md#physical-test-cards)を使用できます。特に記載がない限り、要求された場合は PIN `1234` を使用してください。

## See also

- [注文する](https://docs.stripe.com/terminal/fleet/order-and-return-readers.md)
- [導入のチェックリスト](https://docs.stripe.com/terminal/references/checklist.md)
- [追加の決済手段をテスト](https://docs.stripe.com/terminal/payments/additional-payment-methods.md#testing)
