# リーダーに接続する アプリケーションを Stripe Terminal リーダーに接続します。 > まだリーダーを選択していない場合は、利用可能な [Terminal リーダー](https://docs.stripe.com/terminal/payments/setup-reader.md)を比較して、ニーズに最適なリーダーを選択してください。 # シミュレーションされたリーダー > This is a シミュレーションされたリーダー for when terminal-sdk-platform is server-driven and reader-type is simulated. View the full page at https://docs.stripe.com/terminal/payments/connect-reader?terminal-sdk-platform=server-driven&reader-type=simulated. Stripe は、シミュレーションされたサーバー主導型のリーダーを提供しているため、物理ハードウェアに接続することなくアプリを開発してテストし、Terminal の支払いをシミュレーションできます。 ## シミュレーションされたリーダーを作成する シミュレートリーダーを作成するには、リーダーの登録時にいずれかの指定登録コード (`simulated-wpe`、`simulated-s700`、`simulated-s710`) を使用します。この登録コードは、サンドボックスでのみシミュレートされた WisePOS E、Stripe S700 リーダー、または Stripe S710 リーダーオブジェクトを作成します。Stripe API を使用して、シミュレートリーダーを登録できます。 ```curl curl https://api.stripe.com/v1/terminal/readers \ -u "<>:" \ -d "location={{TERMINALLOCATION_ID}}" \ -d registration_code=simulated-wpe ``` シミュレーションされたリーダーを表す [Reader (リーダー)](https://docs.stripe.com/api/terminal/readers.md) オブジェクトが返されます。 ```json { "id": "tmr_xxx", "object": "terminal.reader", "device_sw_version": "2.37.2.0", "device_type": "simulated_wisepos_e", "ip_address": "0.0.0.0", "label": "simulated-wpe-xxx-xxx-xx-xxx", "livemode": false, "location": "tml_xxx", "serial_number": "simulated-wpe-xxx-xxx-xx-xxx", "status": "online" } ``` ## シミュレーションされたリーダーに対してクエリーを実行する シミュレーションされたリーダーは実際のリーダーと同様に動作します。[リーダーエンドポイント](https://docs.stripe.com/api/terminal/readers/retrieve.md)からその情報を取得できます。 ```curl curl https://api.stripe.com/v1/terminal/readers/tmr_xxx \ -u "<>:" ``` ```json { "id": "tmr_xxx", "object": "terminal.reader", "action": null, "device_sw_version": "2.37.2.0", "device_type": "simulated_wisepos_e", "ip_address": "0.0.0.0", "label": "simulated-wpe-xxx-xxx-xx-xxx", "livemode": false, "location": "tml_xxx", "metadata": { }, "serial_number": "simulated-wpe-xxx-xxx-xx-xxx", "status": "offline" } ``` # シミュレーションされたリーダー > This is a シミュレーションされたリーダー for when terminal-sdk-platform is js and reader-type is simulated. View the full page at https://docs.stripe.com/terminal/payments/connect-reader?terminal-sdk-platform=js&reader-type=simulated. Stripe Terminal SDK およびサーバー主導型の連携にはシミュレーションされた内蔵カードリーダーが付属しているため、物理ハードウェアに接続することなくアプリを開発してテストすることができます。連携が完了している場合も、構築中であっても、シミュレーションされたリーダーを使用してアプリ内のすべての Terminal フローをエミュレートします。 シミュレーション済みのリーダーには UI が表示されません。アプリで接続した後、Stripe SDK または API への呼び出しが成功すると、これが機能していることを確認できます。 SDK のシミュレーションされたリーダーは、必要に応じて自動的にカード提示をシミュレーションします。サーバー主導型のシステムでは、構築済みのシステムを更新して、[カード提示をシミュレーションします](https://docs.stripe.com/terminal/references/testing.md#simulated-card-presentment)。 シミュレーションされたリーダーを使用するには、`simulated` オプションを `true` に設定して [discoverReaders](https://docs.stripe.com/terminal/references/api/js-sdk.md#discover-readers) を呼び出し、リーダーを検索します。`discoverReaders` が結果を返したら、[connectReader](https://docs.stripe.com/terminal/references/api/js-sdk.md#connect-reader) を呼び出してシミュレートされたリーダーに接続します。 ```javascript // Handler for a "Connect Reader" button async function connectReaderHandler() { const config = {simulated: true}; const discoverResult = await terminal.discoverReaders(config); if (discoverResult.error) { console.log('Failed to discover: ', discoverResult.error); } else if (discoverResult.discoveredReaders.length === 0) { console.log('No available readers.'); } else { // Just select the first reader here. const selectedReader = discoverResult.discoveredReaders[0]; const connectResult = await terminal.connectReader(selectedReader); if (connectResult.error) { console.log('Failed to connect: ', connectResult.error); } else { console.log('Connected to reader: ', connectResult.reader.label); } } } ``` ### シミュレーションされたリーダーの設定 - [setSimulatorConfiguration (JavaScript)](https://docs.stripe.com/terminal/references/api/js-sdk.md#stripeterminal-setsimulatorconfig) シミュレーションされたリーダーは少量の設定をサポートするため、POS アプリケーション内で、複数のカードブランドや、支払い拒否といったエラーシナリオなど、さまざまなフローをテストできます。この動作を有効にするには、決済手段を収集する前に次のコードを使用します。 ```javascript terminal.setSimulatorConfiguration({testCardNumber: '4242424242424242'}); ``` # シミュレーションされたリーダー > This is a シミュレーションされたリーダー for when terminal-sdk-platform is ios and reader-type is simulated. View the full page at https://docs.stripe.com/terminal/payments/connect-reader?terminal-sdk-platform=ios&reader-type=simulated. Stripe Terminal SDK およびサーバー主導型の連携にはシミュレーションされた内蔵カードリーダーが付属しているため、物理ハードウェアに接続することなくアプリを開発してテストすることができます。連携が完了している場合も、構築中であっても、シミュレーションされたリーダーを使用してアプリ内のすべての Terminal フローをエミュレートします。 シミュレーション済みのリーダーには UI が表示されません。アプリで接続した後、Stripe SDK または API への呼び出しが成功すると、これが機能していることを確認できます。 SDK のシミュレーションされたリーダーは、必要に応じて自動的にカード提示をシミュレーションします。サーバー主導型のシステムでは、構築済みのシステムを更新して、[カード提示をシミュレーションします](https://docs.stripe.com/terminal/references/testing.md#simulated-card-presentment)。 シミュレーションされたリーダーを使用するには、`simulated` オプションを `true` に設定して [discoverReaders](https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPTerminal.html#/c:objc\(cs\)SCPTerminal\(im\)discoverReaders:delegate:completion:) を呼び出し、リーダーを検索します。`discoverReaders` が結果を返したら、[connectReader](https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPTerminal.html#/c:objc\(cs\)SCPTerminal\(im\)connectReader:delegate:completion:) を呼び出してシミュレーションされたリーダーに接続します。 モバイルリーダーやタッチ決済リーダーに接続する際、シミュレーションされたリーダーであっても、実装では接続設定に `locationId` を含める必要があります。シミュレーションされたリーダーは実際の店舗に関連付けることができないため、シミュレーションされたリーダーの模擬 `locationId` を指定します。 ```swift import UIKit import StripeTerminal class DiscoverReadersViewController: UIViewController, DiscoveryDelegate { var discoverCancelable: Cancelable? // ... // Action for a "Discover Readers" button func discoverReadersAction() throws {let config = try BluetoothScanDiscoveryConfigurationBuilder().setSimulated(true).build() self.discoverCancelable = Terminal.shared.discoverReaders(config, delegate: self) { error in if let error = error { print("discoverReaders failed: \(error)") } else { print("discoverReaders succeeded") } } } // ... // MARK: DiscoveryDelegate // This delegate method can get called multiple times throughout the discovery process. // You might want to update a UITableView and display all available readers. // Here, we're automatically connecting to the first reader we discover. func terminal(_ terminal: Terminal, didUpdateDiscoveredReaders readers: [Reader]) { // Select the first reader we discover guard let selectedReader = readers.first else { return } // Since the simulated reader is not associated with a real location, we recommend // specifying its existing mock location. guard let locationId = selectedReader.locationId else { return } // Only connect if we aren't currently connected. guard terminal.connectionStatus == .notConnected || terminal.connectionStatus == .discovering else { return } // Replace 'yourMobileReaderDelegate' with your actual MobileReaderDelegate implementation let mobileReaderDelegate = yourMobileReaderDelegate do { connectionConfig = try BluetoothConnectionConfigurationBuilder( // When connecting to a physical reader, your integration should specify either the // same location as the last connection (selectedReader.locationId) or a new location // of your user's choosing. delegate: mobileReaderDelegate, locationId: locationId ) .setAutoReconnectOnUnexpectedDisconnect(true) // This is optional as it's the default value .build() } catch { // Handle error building the connection configuration return } // Note `readerDelegate` should be provided by your application. // See our Quickstart guide at https://stripe.com/docs/terminal/quickstart // for more example code. 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)") } } } } ``` ### シミュレーションされたリーダーの設定 - [SimulatorConfiguration (iOS)](https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPSimulatorConfiguration.html) シミュレーションされたリーダーは少量の設定をサポートするため、POS アプリケーション内で、複数のカードブランドや、支払い拒否といったエラーシナリオなど、さまざまなフローをテストできます。この動作を有効にするには、決済手段を収集する前に次のコードを使用します。 #### Swift ```swift let simulatorConfiguration = Terminal.shared.simulatorConfiguration simulatorConfiguration.simulatedCard = SimulatedCard(type: .amex) simulatorConfiguration.simulatedTipAmount = 1000 ``` # シミュレーションされたリーダー > This is a シミュレーションされたリーダー for when terminal-sdk-platform is android and reader-type is simulated. View the full page at https://docs.stripe.com/terminal/payments/connect-reader?terminal-sdk-platform=android&reader-type=simulated. Stripe Terminal SDK およびサーバー主導型の連携にはシミュレーションされた内蔵カードリーダーが付属しているため、物理ハードウェアに接続することなくアプリを開発してテストすることができます。連携が完了している場合も、構築中であっても、シミュレーションされたリーダーを使用してアプリ内のすべての Terminal フローをエミュレートします。 シミュレーション済みのリーダーには UI が表示されません。アプリで接続した後、Stripe SDK または API への呼び出しが成功すると、これが機能していることを確認できます。 SDK のシミュレーションされたリーダーは、必要に応じて自動的にカード提示をシミュレーションします。サーバー主導型のシステムでは、構築済みのシステムを更新して、[カード提示をシミュレーションします](https://docs.stripe.com/terminal/references/testing.md#simulated-card-presentment)。 シミュレーションされたリーダーを使用するには、選択した `DiscoveryConfiguration` の `isSimulated` オプションを `true` に設定して、[discoverReaders](https://stripe.dev/stripe-terminal-android/core/com.stripe.stripeterminal/-terminal/discover-readers.html) を呼び出し、リーダーを検索します。`discoverReaders` が結果を返したら、[connectReader](https://stripe.dev/stripe-terminal-android/core/com.stripe.stripeterminal/-terminal/connect-reader.html) を呼び出してシミュレーションされたリーダーに接続します。 モバイルリーダーに接続する際、シミュレーションされたリーダーであっても、実装では接続設定に `locationId` を含める必要があります。シミュレーションされたリーダーは実際の店舗に関連付けることができないため、シミュレーションされたリーダーの模擬 `locationId` を指定します。 ```kotlin // Handler for a "Connect Reader" button fun onConnect() { val config = BluetoothDiscoveryConfiguration(timeout = 0, isSimulated = true) Terminal.getInstance().discoverReaders( config, object : DiscoveryListener { override fun onUpdateDiscoveredReaders(readers: List) { // Select the first reader here. val firstReader = readers.first() // Replace 'yourMobileReaderListener' with your actual MobileReaderListener implementation val mobileReaderListener = yourMobileReaderListener val autoReconnectOnUnexpectedDisconnect = true // When connecting to a physical reader, specify either the // same location as the last connection (selectedReader.location?.id) or a new location // of your user's choosing. // // Since the simulated reader isn't associated with a real location, we recommend // specifying its existing mock location. val connectionConfig = BluetoothConnectionConfiguration( locationId = firstReader.location?.id.orEmpty(), autoReconnectOnUnexpectedDisconnect = autoReconnectOnUnexpectedDisconnect, bluetoothReaderListener = mobileReaderListener ) Terminal.getInstance().connectReader( firstReader, connectionConfig, object : ReaderCallback { override fun onSuccess(reader: Reader) { // Placeholder for handling successful operation } override fun onFailure(e: TerminalException) { // Placeholder for handling exception } } ) } }, object : Callback { override fun onSuccess() { // Placeholder for handling successful operation } override fun onFailure(e: TerminalException) { // Placeholder for handling exception } } ) } ``` ### シミュレーションされたリーダーの設定 - [SimulatorConfiguration (Android)](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-simulator-configuration/index.html) シミュレーションされたリーダーは少量の設定をサポートするため、POS アプリケーション内で、複数のカードブランドや、支払い拒否といったエラーシナリオなど、さまざまなフローをテストできます。この動作を有効にするには、決済手段を収集する前に次のコードを使用します。 #### Kotlin ```kotlin val simulatedFixedTipAmount = 1000L; val simulatorConfig = SimulatorConfiguration( simulatedCard = SimulatedCard(SimulatedCardType.AMEX), simulatedTipAmount = simulatedFixedTipAmount ); Terminal.getInstance().setSimulatorConfiguration(simulatorConfig); ``` # シミュレーションされたリーダー > This is a シミュレーションされたリーダー for when terminal-sdk-platform is react-native and reader-type is simulated. View the full page at https://docs.stripe.com/terminal/payments/connect-reader?terminal-sdk-platform=react-native&reader-type=simulated. Stripe Terminal SDK およびサーバー主導型の連携にはシミュレーションされた内蔵カードリーダーが付属しているため、物理ハードウェアに接続することなくアプリを開発してテストすることができます。連携が完了している場合も、構築中であっても、シミュレーションされたリーダーを使用してアプリ内のすべての Terminal フローをエミュレートします。 シミュレーション済みのリーダーには UI が表示されません。アプリで接続した後、Stripe SDK または API への呼び出しが成功すると、これが機能していることを確認できます。 SDK のシミュレーションされたリーダーは、必要に応じて自動的にカード提示をシミュレーションします。サーバー主導型のシステムでは、構築済みのシステムを更新して、[カード提示をシミュレーションします](https://docs.stripe.com/terminal/references/testing.md#simulated-card-presentment)。 シミュレーションされたリーダーを使用するには、[discoverReaders](https://stripe.dev/stripe-terminal-react-native/api-reference/interfaces/StripeTerminalSdkType.html#discoverReaders) を呼び出してリーダーを検索します。このとき、`simulated` オプションを `true` に設定します。リーダーの配列を引数とする `onUpdateDiscoveredReaders` コールバックが呼び出されたら、[connectReader](https://stripe.dev/stripe-terminal-react-native/api-reference/interfaces/StripeTerminalSdkType.html#connectreader-1) を呼び出してシミュレーションされたリーダーに接続します。 モバイルリーダーやタッチ決済リーダーに接続する際、シミュレーションされたリーダーであっても、実装では接続設定に `locationId` を含める必要があります。シミュレーションされたリーダーは実際の店舗に関連付けることができないため、シミュレーションされたリーダーの模擬 `locationId` を指定します。 ```js function DiscoverReadersScreen() { const { discoverReaders, connectReader, discoveredReaders } = useStripeTerminal({ onUpdateDiscoveredReaders: (readers) => { // After the SDK discovers a reader, your app can connect to it. // Here, we're automatically connecting to the first discovered reader. handleConnectBluetoothReader(readers[0]); }, }); useEffect(() => { handleDiscoverReaders(); }, []); const handleDiscoverReaders = async () => { // The list of discovered readers is reported in the `onUpdateDiscoveredReaders` method // within the `useStripeTerminal` hook. const { error } = await discoverReaders({ discoveryMethod: 'bluetoothScan', simulated: true, }); if (error) { Alert.alert( 'Discover readers error: ', `${error.code}, ${error.message}` ); } }; const handleConnectBluetoothReader = async (discoveredReader: Reader.Type) => { const { reader, error } = await connectReader({ discoveryMethod: 'bluetoothScan', reader: discoveredReader, // Since the simulated reader is not associated with a real location, we recommend // specifying its existing mock location. locationId: discoveredReader.locationId, }); if (error) { console.log('connectReader error', error); return; } console.log('Reader connected successfully', reader); }; return ; } ``` ### シミュレーションされたリーダーの設定 - [setSimulatedCard (React Native)](https://stripe.dev/stripe-terminal-react-native/api-reference/interfaces/StripeTerminalSdkType.html#setSimulatedCard) シミュレーションされたリーダーは少量の設定をサポートするため、POS アプリケーション内で、複数のカードブランドや、支払い拒否といったエラーシナリオなど、さまざまなフローをテストできます。この動作を有効にするには、決済手段を収集する前に次のコードを使用します。 ```js const { error } = await setSimulatedCard('4242424242424242'); if (error) { // Placeholder for handling exception } // Placeholder for handling successful operation ``` # Bluetooth リーダー > This is a Bluetooth リーダー for when terminal-sdk-platform is ios and reader-type is bluetooth. View the full page at https://docs.stripe.com/terminal/payments/connect-reader?terminal-sdk-platform=ios&reader-type=bluetooth. Bluetooth 接続型リーダーは Bluetooth LE デバイスです。支払い詳細を収集しますが、Stripe との通信にはペアリングされたモバイルデバイスを使用します。 Bluetooth を使用してアプリを Terminal リーダーに接続するには、次のステップを実行します。 1. [リーダーを検出](https://docs.stripe.com/terminal/payments/connect-reader.md#discover-readers)します。 1. [リーダーに接続](https://docs.stripe.com/terminal/payments/connect-reader.md#connect-reader)します。 > リーダーとペアリングするために、モバイルデバイス設定を使用しないでください。デバイス設定を使用してリーダーをペアリングすると、リーダーをアプリに接続できなくなります。 ## リーダーを検出する [クライアント側] - [discoverReaders (iOS)](https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPTerminal.html#/c:objc\(cs\)SCPTerminal\(im\)discoverReaders:delegate:completion:) - [BluetoothScanDiscoveryConfiguration (iOS)](https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPBluetoothScanDiscoveryConfiguration.html) まず、リーダーの電源が入っていて、近くにあることを確認してください。 次に、アプリから `BluetoothScanDiscoveryConfiguration` を使用して、`discoverReaders` メソッドで近くにある Bluetooth 接続型リーダーを検索します。 #### Swift ```swift import StripeTerminal class DiscoverReadersViewController: UIViewController, DiscoveryDelegate { var discoverCancelable: Cancelable? // ... // Action for a "Discover Readers" button func discoverReadersAction() throws { let config = try BluetoothScanDiscoveryConfigurationBuilder().build() // In addition to Terminal's completion block methods, Swift async alternatives are available. // See our Example app for usage examples: https://github.com/stripe/stripe-terminal-ios/tree/master/Example self.discoverCancelable = Terminal.shared.discoverReaders(config, delegate: self) { error in if let error = error { print("discoverReaders failed: \(error)") } else { print("discoverReaders succeeded") } } } // ... // MARK: DiscoveryDelegate func terminal(_ terminal: Terminal, didUpdateDiscoveredReaders readers: [Reader]) { // In your app, display the discovered readers to the user. // Call `connectReader` after the user selects a reader to connect to. } } ``` #### Bluetooth 近接センサー * (BBPOS Chipper 2X BT のみ) Bluetooth 近接センサーは、検索結果をフィルターして最も近いリーダーを返します。リーダーが検出されると、そのリーダーはマルチカラーで点滅するため、複数のリーダーの中でどのリーダーが検出されたのかがわかります。SDK がリーダーを検出した後は、その検出されたリーダーをオフにしない限り、より近くにあるリーダーに切り替わりません。 Bluetooth 近接センサーを使用すると、SDK はアプリのコールバックにリーダーを 2 回返します。最初に、アプリはリーダーのシリアル番号のみが入力された `Reader` オブジェクトを受信します。その後少ししてから、リーダーのバッテリーレベルなどの新しい情報が入力された `Reader` オブジェクトを受信します。 ユーザーがそのリーダーへの接続を確認したり、そのリーダーへの接続を希望しない場合にキャンセルしたりできるように、アプリの UI に検出されたリーダーを表示することをお勧めします。 #### Bluetooth スキャン Bluetooth スキャンは、近くにあるすべてのリーダーを検索して、検出したリーダーのリストをアプリに返します。検出プロセスが続くと、SDK は近くのリーダーの最新リストを使用して `DiscoveryDelegate.didUpdateDiscoveredReaders` メソッドを呼び出し続けます。 検出プロセスでは、検出中に Terminal の `SCPConnectionStatus` が `SCPConnectionStatus.SCPConnectionStatusDiscovering` に移行します。 Bluetooth スキャン検出方法では、一定時間でスキャンをタイムアウトするよう設定できます。これを使用して、バッテリーの残量を管理したり、デバイスが見つからないときにエラーメッセージを表示したりできます。 モバイルアプリでは、ユーザーが自身のモバイルリーダーを特定しやすくするために、検出されたリーダーのシリアル番号を一覧表示し、自動更新されるようにすることをお勧めします。モバイルリーダーの検出時にはリーダーの `label` プロパティーには値が入りません。リーダーのわかりやすい名前を表示する場合は、アプリケーション側でシリアル番号とラベルの対応表を管理してください。 #### Bluetooth ペアリング セキュリティを強化し、EU の規制に準拠するため、2025 年 11 月現在、Stripe は WisePad 3 クレジットカードリーダーに数値比較 Bluetooth ペアリングプロセスを使用しています。数値比較プロセスでは、ペアリング時にカードリーダーと POS デバイスの両方でパスキーを確認する必要があります。デバイスを[最新のソフトウェアバージョン](https://docs.stripe.com/terminal/readers/bbpos-wisepad3.md#reader-software-releases)に更新したら、次の手順を実行して WisePad 3 を新しいモバイルアプリに接続します。POS デバイスが WisePad 3 リーダーを検出して表示したら、次の手順を実行します。 1. WisePad 3 と POS デバイスの両方で 6 桁のコードが一致していることを確認します。 1. WisePad 3 で **確定** を選択します。 1. POS デバイスで **ペアリング** を選択します。 > #### 注 > > 数値比較のペアリングは、WisePad 3 を新しい POS デバイスとペアリングする場合、または既存の「忘れた」 POS デバイスと再ペアリングする場合にのみ実行する必要があります。 ## リーダーに接続する [クライアント側] - [connectReader (iOS)](https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPTerminal.html#/c:objc\(cs\)SCPTerminal\(im\)connectReader:connectionConfig:completion:) - [BluetoothConnectionConfiguration (iOS)](https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPBluetoothConnectionConfiguration.html) 検出されたリーダーに接続するには、アプリから `connectReader` メソッドを呼び出します。 接続の際、[店舗](https://docs.stripe.com/api/terminal/locations.md)に[リーダーを登録する](https://docs.stripe.com/terminal/fleet/locations-and-zones.md)必要があります。このためには、接続時に `locationId` を関連する Location ID に設定し、`BluetoothConnectionConfiguration` を作成して使用します。 #### Swift ```swift // Call `connectReader` with the selected reader and a connection config // to register to a location as set by your app. let connectionConfig: BluetoothConnectionConfiguration do { connectionConfig = try BluetoothConnectionConfigurationBuilder(delegate: yourMobileReaderDelegate, locationId: ""{{LOCATION_ID}}"") .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)") } } ``` アプリをバックグラウンドで実行し、リーダーへの接続が保持された状態にするには、[アプリを設定](https://docs.stripe.com/terminal/payments/setup-integration.md?terminal-sdk-platform=ios#configure)して、必要なバックグラウンドモードを追加します。 > #### スタンバイモードを使用する > > アプリで省エネを目的として `disconnectReader` を呼び出すプログラムは使用しないでください。リーダーは、スタンバイモードを使用して効率的に電源を管理します。 ## リーダーの連結の解除を処理する - [MobileReaderDelegate (iOS)](https://stripe.dev/stripe-terminal-ios/docs/Protocols/SCPMobileReaderDelegate.html) - [DisconnectReason (iOS)](https://stripe.dev/stripe-terminal-ios/docs/Enums/SCPDisconnectReason.html) リーダーの切断が、アプリとリーダーの間で発生することがあります。たとえば、リーダーが範囲外であるか、バッテリーが切れた場合、アプリからリーダーが切断されることがあります。リーダーの電源をオフにすると、テスト中に予期しない切断をシミュレーションできます。 `MobileReaderDelegate` には `reader:didDisconnect:` メソッドが含まれています。これは、リーダーの接続が切断された理由を示す `DisconnectReason` をアプリケーションに提供します。 リーダーの切断にご自身で対処するには、次の手順を実行します。 1. 接続中は `autoReconnectOnUnexpectedDisconnect` を `false` に設定します。 1. 切断コールバックを処理して、リーダーが予期せず切断されたことをユーザーに通知するメッセージをアプリに表示し、リーダーの検出と接続を開始します。 #### Swift ```swift import StripeTerminal class ReaderViewController: UIViewController, MobileReaderDelegate { override func viewDidLoad() { super.viewDidLoad() // Set the reader delegate when connecting to a reader } // ... func reader(_ reader: Reader, didDisconnect reason: DisconnectReason) { // Consider displaying a UI to notify the user and start rediscovering readers } } ``` ### 接続されたリーダーを再起動する - [rebootReader (iOS)](https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPTerminal.html#/c:objc\(cs\)SCPTerminal\(im\)rebootReader:.html) Stripe リーダー M2 および BBPOS WisePad 3 は、24 時間使用すると自動的に再起動します。ただし、`rebootReader` API を使用すると、リーダーを強制的に再起動して、24 時間のタイマーをリセットできます。このアクションの後、リーダーは SDK から切断され、再起動されます。自動再接続を使用している場合、SDK はリーダーとの接続を復元しようとします。 #### Swift ```swift Terminal.shared.rebootReader { error in if let error = error { // Placeholder for handling the error } else { // Reboot succeeded and the reader will disconnect. // If your app is using automatic reconnect the reconnect will begin. } } ``` #### 自動的に再接続を試行する リーダーの接続が切断されると、デフォルトで自動再接続が試行されます。そのプロセスの間、リーダーのステータスを伝える通知をアプリに表示することをお勧めします。 自動再接続中にアプリに通知を表示するには、次の操作を行います。 1. `MobileReaderDelegate` にリーダーの再接続コールバックを実装します。 1. `MobileReaderDelegate` を `BluetoothConnectionConfiguration` に渡します。 1. [`reader:didStartReconnect:disconnectReason:`](https://stripe.dev/stripe-terminal-ios/docs/Protocols/SCPReaderDelegate.html#/c:objc\(pl\)SCPReaderDelegate\(im\)reader:didStartReconnect:disconnectReason:) がアプリに送信される際、SDK は、リーダーの接続が失われ、再接続が進行中であることをメッセージで通知します。 - `Cancelable` オブジェクトを使用して、いつでも再接続の試行を停止できます。 1. [`readerDidSucceedReconnect:`](https://stripe.dev/stripe-terminal-ios/docs/Protocols/SCPReaderDelegate.html#/c:objc\(pl\)SCPReaderDelegate\(im\)readerDidSucceedReconnect:) を送信して再接続が成功した場合、SDK は、接続が復元され、通常の動作を続行できることをメッセージで通知します。 1. リーダーに再接続できず、[`readerDidFailReconnect:`](https://stripe.dev/stripe-terminal-ios/docs/Protocols/SCPReaderDelegate.html#/c:objc\(pl\)SCPReaderDelegate\(im\)readerDidFailReconnect:) と `reader:didDisconnect:` の両方を送信した場合、SDK は予期しない切断が発生したことを知らせるメッセージを表示します。 #### Swift ```swift import StripeTerminal extension ReaderViewController: MobileReaderDelegate { // MARK: MobileReaderDelegate func reader(_ reader: Reader, didStartReconnect cancelable: Cancelable, disconnectReason: DisconnectReason) { // 1. Notified at the start of a reconnection attempt // Use cancelable to stop reconnection at any time } func readerDidSucceedReconnect(_ reader: Reader) { // 2. Notified when reader reconnection succeeds // App is now connected } func readerDidFailReconnect(_ reader: Reader) { // 3. Notified when reader reconnection fails // App is now disconnected } } ``` #### アプリケーションの開始時の自動再接続 Stripe Terminal は、アプリケーションの起動時にリーダーに自動的に再接続しません。代わりに、リーダー ID を保存し、起動時に既知のリーダーへの接続を行うことで、再接続フローを構築できます。 1. リーダーに正常に接続されたら、シリアル番号を [UserDefaults API](https://developer.apple.com/documentation/foundation/userdefaults) (iOS) などの永続的なデータ格納場所に保存します。 1. アプリが起動したら、その永続的なデータ格納場所に保存されているシリアル番号を確認します。確認できた場合は、`discoverReaders` メソッドを呼び出して、アプリケーションがそのリーダーを再度見つけられるようにします。 1. 保存されたシリアル番号が検出されたリーダーのいずれかと一致する場合は、`discoverReaders` の呼び出しから返された一致するリーダーオブジェクトを使用して、そのリーダーへの接続を試してください。以前に接続したリーダーが見つからない場合は、検出プロセスを停止します。 検出および接続プロセス中に何らかの UI を表示して、自動再接続が実行されていることを示します。 ## リーダーソフトウェアを更新する [クライアント側] - [MobileReaderDelegate (iOS)](https://stripe.dev/stripe-terminal-ios/docs/Protocols/SCPMobileReaderDelegate.html) アプリケーションは、モバイルリーダーを更新して以下を適用する必要があります。 - カードネットワークとカード発行会社の要件に対して最新の状態に保つための地域設定 - セキュリティ更新 必要な更新では、リーダーに接続するとインストールが開始されます。更新が完了するまでリーダーを使用できません。 > 更新をインストールするには、リーダーのバッテリー残量が 50% 以上なければなりません。 ### 必要な更新 緊急の更新がリーダーで利用可能になると、システムの `MobileReaderDelegate` が `didStartInstallingUpdate` コールバック と `ReaderSoftwareUpdate` を受信します。 `ReaderSoftwareUpdate` は、更新に関する重要情報 (更新の合計推定時間を示す `durationEstimate` など) を提供します。 インストールプロセスでは、更新がリーダーにインストールされる間、Terminal の `connectionStatus` が `connecting` に移行します。 アプリケーションからユーザーに更新をインストール中であることを伝え、また UI に進捗状況を表示する必要があります。接続に通常よりも時間がかかる理由を明確にします。 必須の更新のプロセスが失敗した場合、Stripe は `didFinishInstallingUpdate` を使用して `MobileReaderDelegate` にエラーを通知します。必須の更新に失敗した後は、以下の条件が満たされない限り、リーダーに再接続することはできません。 - リーダーは、過去 30 日間の場所に対応する最新のソフトウェアバージョンを実行します。 - iOS SDK バージョンが `3.5.0` 以降です。 条件が満たされると、更新が未完了であっても接続プロセスは成功します。Stripe は、更新が正常にインストールされるまで、次回そのリーダーに接続したときに、必要な更新を再試行します。 #### Swift ```swift import UIKit import StripeTerminal class ReaderViewController: UIViewController, MobileReaderDelegate { // ... // MARK: MobileReaderDelegate func reader(_ reader: Reader, didStartInstallingUpdate update: ReaderSoftwareUpdate, cancelable: Cancelable?) { // Show UI communicating that a required update has started installing } func reader(_ reader: Reader, didReportReaderSoftwareUpdateProgress progress: Float) { // Update the progress of the installation } func reader(_ reader: Reader, didFinishInstallingUpdate update: ReaderSoftwareUpdate?, error: Error?) { // Report success or failure of the update } // ... } ``` `Cancelable` オブジェクトを使用すると必須の更新をキャンセルできます。この場合もリーダーへの接続は失敗します。進行中の増分のみの更新はキャンセルできません。 ### オプションの更新 任意の更新は、指定した日付まで先延ばしすることが可能で、その後必須になります。リーダーの接続中、処理が行われていないときは SDK が随時 `MobileReaderDelegate` を通じて任意の更新を通知します。任意の更新が利用可能な場合、アプリケーションの `MobileReaderDelegate` は、以下の更新情報を含む `ReaderSoftwareUpdate` オブジェクトとともに `didReportAvailableUpdate` コールバックを受信します。 - 更新にかかる推定時間 (`durationEstimate`) - 更新が必須になるタイムスタンプ (`requiredAt`) アプリケーションで、更新が提供されていることをユーザーに伝え、必要に応じて更新に進むための画面を表示します。 `didReportAvailableUpdate` ですでに通知されている更新を続けるには、`Terminal.shared.installAvailableUpdate` をコールします。 利用可能な更新は、リーダーオブジェクトにも `reader.availableUpdate` として保存されます。 更新中は、顧客がアプリのページから移動できないようにするとともに、更新が完了するまでリーダーを受信範囲内に置き、電源を入れたままにしておくように指示します。また、更新の進捗状況を視覚的に示すインジケーターを、顧客に表示することもお勧めします。`MobileReaderDelegate` は、`didReportReaderSoftwareUpdateProgress` メソッドで更新の進捗状況を報告します。 オプションの更新の `requiredAt` の期日を過ぎると、次回リーダーが接続されたときに更新がインストールされます。 #### Swift ```swift import UIKit import StripeTerminal class ReaderViewController: UIViewController, MobileReaderDelegate { // ... // MARK: MobileReaderDelegate func reader(_ reader: Reader, didReportAvailableUpdate update: ReaderSoftwareUpdate) { // An update is available for the connected reader. Show this update in your application. // Install this update using `Terminal.shared.installAvailableUpdate`. } } ``` アプリケーションがリーダーに適用可能な各種の更新タイプを処理できるようにするには、[リーダーの更新をテストする](https://docs.stripe.com/terminal/references/testing.md#simulated-reader-updates) をご覧ください。 # Bluetooth リーダー > This is a Bluetooth リーダー for when terminal-sdk-platform is android and reader-type is bluetooth. View the full page at https://docs.stripe.com/terminal/payments/connect-reader?terminal-sdk-platform=android&reader-type=bluetooth. Bluetooth 接続型リーダーは Bluetooth LE デバイスです。支払い詳細を収集しますが、Stripe との通信にはペアリングされたモバイルデバイスを使用します。 Bluetooth を使用してアプリを Terminal リーダーに接続するには、次のステップを実行します。 1. [リーダーを検出](https://docs.stripe.com/terminal/payments/connect-reader.md#discover-readers)します。 1. [リーダーに接続](https://docs.stripe.com/terminal/payments/connect-reader.md#connect-reader)します。 > リーダーとペアリングするために、モバイルデバイス設定を使用しないでください。デバイス設定を使用してリーダーをペアリングすると、リーダーをアプリに接続できなくなります。 ## リーダーを検出する [クライアント側] - [discoverReaders (Android)](https://stripe.dev/stripe-terminal-android/core/com.stripe.stripeterminal/-terminal/discover-readers.html) - [BluetoothDiscoveryConfiguration (Android)](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-discovery-configuration/-bluetooth-discovery-configuration/index.html) まず、リーダーの電源が入っていて、近くにあることを確認してください。 次に、アプリから `BluetoothDiscoveryConfiguration` を使用して、`discoverReaders` メソッドで近くにある Bluetooth 接続型リーダーを検索します。 #### Kotlin ```kotlin class DiscoverReadersActivity : AppCompatActivity(), DiscoveryListener { var discoverCancelable: Cancelable? = null // ... // Action for a "Discover Readers" button fun discoverReadersAction() { val timeout = 0 val isSimulated = false val config = BluetoothDiscoveryConfiguration( timeout = timeout, isSimulated = isSimulated ) discoverCancelable = Terminal.getInstance().discoverReaders( config, this, object : Callback { override fun onSuccess() { // Placeholder for handling successful operation } override fun onFailure(e: TerminalException) { // Placeholder for handling exception } } ) } // DiscoveryListener override fun onUpdateDiscoveredReaders(readers: List) { // In your app, display the discovered readers to the user. // Call `connectReader` after the user selects a reader to connect to. } } ``` #### Bluetooth スキャン Bluetooth スキャンは、近くにあるすべてのリーダーを検索して、検出したリーダーのリストをアプリに返します。検出プロセスが続くと、SDK は近くのリーダーの最新リストを使用して `onUpdateDiscoveredReaders` メソッドを呼び出し続けます。 検出プロセスでは、検出中に Terminal の `connectionStatus` が `ConnectionStatus.DISCOVERING` に移行します。 Bluetooth スキャン検出方法では、一定時間でスキャンをタイムアウトするよう設定できます。これを使用して、バッテリーの残量を管理したり、デバイスが見つからないときにエラーメッセージを表示したりできます。 モバイルアプリでは、ユーザーが自身のモバイルリーダーを特定しやすくするために、検出されたリーダーのシリアル番号を一覧表示し、自動更新されるようにすることをお勧めします。モバイルリーダーの検出時にはリーダーの `label` プロパティーには値が入りません。リーダーのわかりやすい名前を表示する場合は、アプリケーション側でシリアル番号とラベルの対応表を管理してください。 #### Bluetooth ペアリング セキュリティを強化し、EU の規制に準拠するため、2025 年 11 月現在、Stripe は WisePad 3 クレジットカードリーダーに数値比較 Bluetooth ペアリングプロセスを使用しています。数値比較プロセスでは、ペアリング時にカードリーダーと POS デバイスの両方でパスキーを確認する必要があります。デバイスを[最新のソフトウェアバージョン](https://docs.stripe.com/terminal/readers/bbpos-wisepad3.md#reader-software-releases)に更新したら、次の手順を実行して WisePad 3 を新しいモバイルアプリに接続します。POS デバイスが WisePad 3 リーダーを検出して表示したら、次の手順を実行します。 1. WisePad 3 と POS デバイスの両方で 6 桁のコードが一致していることを確認します。 1. WisePad 3 で **確定** を選択します。 1. POS デバイスで **ペアリング** を選択します。 > #### 注 > > 数値比較のペアリングは、WisePad 3 を新しい POS デバイスとペアリングする場合、または既存の「忘れた」 POS デバイスと再ペアリングする場合にのみ実行する必要があります。 ## リーダーに接続する [クライアント側] - [connectReader (Android)](https://stripe.dev/stripe-terminal-android/core/com.stripe.stripeterminal/-terminal/connect-reader.html) - [BluetoothConnectionConfiguration (Android)](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-connection-configuration/-bluetooth-connection-configuration/index.html) 検出されたリーダーに接続するには、アプリから `connectReader` メソッドを呼び出します。 接続の際、[店舗](https://docs.stripe.com/api/terminal/locations.md)に[リーダーを登録する](https://docs.stripe.com/terminal/fleet/locations-and-zones.md)必要があります。このためには、接続時に `locationId` を関連する Location ID に設定し、`BluetoothConnectionConfiguration` を作成して使用します。 #### Kotlin ```kotlin // Implement your MobileReaderListener val mobileReaderListener = yourMobileReaderListener val autoReconnectOnUnexpectedDisconnect = true val connectionConfig = BluetoothConnectionConfiguration( ""{{LOCATION_ID}}"", autoReconnectOnUnexpectedDisconnect, mobileReaderListener ) Terminal.getInstance().connectReader( selectedReader, connectionConfig, object : ReaderCallback { override fun onSuccess(reader: Reader) { // Placeholder for handling successful operation } override fun onFailure(e: TerminalException) { // Placeholder for handling exception } } ) ``` > #### スタンバイモードを使用する > > アプリで省エネを目的として `disconnectReader` を呼び出すプログラムは使用しないでください。リーダーは、スタンバイモードを使用して効率的に電源を管理します。 ## リーダーの連結の解除を処理する - [MobileReaderListener (Android)](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-mobile-reader-listener/index.html) - [DisconnectReason (Android)](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-disconnect-reason/index.html) リーダーの切断が、アプリとリーダーの間で発生することがあります。たとえば、リーダーが範囲外であるか、バッテリーが切れた場合、アプリからリーダーが切断されることがあります。リーダーの電源をオフにすると、テスト中に予期しない切断をシミュレーションできます。 `MobileReaderListener` には、`onDisconnect` コールバックが含まれています。これは、リーダーの接続が切断された理由を示す `DisconnectReason` をアプリケーションに提供します。 リーダーの切断にご自身で対処するには、次の手順を実行します。 1. 接続中は `autoReconnectOnUnexpectedDisconnect` を `false` に設定します。 1. 切断コールバックを処理して、リーダーが予期せず切断されたことをユーザーに通知するメッセージをアプリに表示し、リーダーの検出と接続を開始します。 #### Kotlin ```kotlin class ReaderActivity : AppCompatActivity(), MobileReaderListener { // ... override fun onDisconnect(reason: DisconnectReason) { // Consider displaying a UI to notify the user and start rediscovering readers } // ... } ``` ### 接続されたリーダーを再起動する - [rebootReader (Android)](https://stripe.dev/stripe-terminal-android/core/com.stripe.stripeterminal/-terminal/reboot-reader.html) Stripe リーダー M2 および BBPOS WisePad 3 は、24 時間使用すると自動的に再起動します。ただし、`rebootReader` API を使用すると、リーダーを強制的に再起動して、24 時間のタイマーをリセットできます。このアクションの後、リーダーは SDK から切断され、再起動されます。自動再接続を使用している場合、SDK はリーダーとの接続を復元しようとします。 #### Kotlin ```kotlin Terminal.getInstance().rebootReader( object : Callback { override fun onSuccess() { // Reboot succeeded and the reader will disconnect. // If your app is using automatic reconnect the reconnect will begin. } override fun onFailure(e: TerminalException) { // Placeholder for handling exception } } ) ``` #### 自動的に再接続を試行する リーダーの接続が切断されると、デフォルトで自動再接続が試行されます。そのプロセスの間、リーダーのステータスを伝える通知をアプリに表示することをお勧めします。 自動再接続中にアプリに通知を表示するには、次の操作を行います。 1. `MobileReaderListener` にリーダーの再接続コールバックを実装します。 1. `MobileReaderListener` を `BluetoothConnectionConfiguration` に渡します。 1. [onReaderReconnectStarted](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-reader-reconnection-listener/on-reader-reconnect-started.html) をアプリに送信する際、SDK はリーダーの接続が失われ、再接続が進行中であることを伝えるメッセージを表示します。 - `Cancelable` オブジェクトを使用して、いつでも再接続の試行を停止できます。 1. [`onReaderReconnectSucceeded`](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-reader-reconnection-listener/on-reader-reconnect-succeeded.html) を送信して再接続が成功したことを示す際、SDK は接続が復元され、通常の動作を続行できることを通知するメッセージを表示します。 1. リーダーに接続できず、[`onReaderReconnectFailed`](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-reader-reconnection-listener/on-reader-reconnect-failed.html) と `onDisconnect` の両方を送信した場合、SDK は予期しない切断が発生したことを示すメッセージを表示します。 #### Kotlin ```kotlin class CustomMobileReaderListener : MobileReaderListener { // ... override fun onReaderReconnectStarted(reader: Reader, cancelReconnect: Cancelable, reason: DisconnectReason) { // 1. Notified at the start of a reconnection attempt // Use cancelable to stop reconnection at any time } override fun onReaderReconnectSucceeded(reader: Reader) { // 2. Notified when reader reconnection succeeds // App is now connected } override fun onReaderReconnectFailed(reader: Reader) { // 3. Notified when reader reconnection fails // App is now disconnected } // ... } ``` #### アプリケーションの開始時の自動再接続 Stripe Terminal は、アプリケーションの起動時にリーダーに自動的に再接続しません。代わりに、リーダー ID を保存し、起動時に既知のリーダーへの接続を行うことで、再接続フローを構築できます。 1. リーダーに正常に接続したら、シリアル番号を [Shared Preferences API](https://developer.android.com/training/data-storage/shared-preferences) (Android) などの永続的なデータ格納場所に保存します。 1. アプリが起動したら、その永続的なデータ格納場所に保存されているシリアル番号を確認します。確認できた場合は、`discoverReaders` メソッドを呼び出して、アプリケーションがそのリーダーを再度見つけられるようにします。 1. 保存されたシリアル番号が検出されたリーダーのいずれかと一致する場合は、`discoverReaders` の呼び出しから返された一致するリーダーオブジェクトを使用して、そのリーダーへの接続を試してください。以前に接続したリーダーが見つからない場合は、検出プロセスを停止します。 検出および接続プロセス中に何らかの UI を表示して、自動再接続が実行されていることを示します。 ## リーダーソフトウェアを更新する [クライアント側] - [MobileReaderListener (Android)](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-mobile-reader-listener/index.html) アプリケーションは、モバイルリーダーを更新して以下を適用する必要があります。 - カードネットワークとカード発行会社の要件に対して最新の状態に保つための地域設定 - セキュリティ更新 必要な更新では、リーダーに接続するとインストールが開始されます。更新が完了するまでリーダーを使用できません。 > 更新をインストールするには、リーダーのバッテリー残量が 50% 以上なければなりません。 ### 必要な更新 リーダーで緊急の更新が利用可能になると、システムの `MobileReaderListener` が `ReaderSoftwareUpdate` と `onStartInstallingUpdate` を受信します。 `ReaderSoftwareUpdate` は、更新に関する重要情報 (更新の合計推定時間を示す `durationEstimate` など) を提供します。 インストールプロセスでは、更新がリーダーにインストールされる間、Terminal の `connectionStatus` が `ConnectionStatus.CONNECTING` に移行します。 アプリケーションからユーザーに更新をインストール中であることを伝え、また UI に進捗状況を表示する必要があります。接続に通常よりも時間がかかる理由を明確にします。 必須の更新のプロセスが失敗した場合、Stripe は `onFinishInstallingUpdate` を使用して `MobileReaderListener` にエラーを通知します。必須の更新に失敗した後は、以下の条件が満たされない限り、リーダーに再接続することはできません。 - リーダーは、過去 30 日間の場所に対応する最新のソフトウェアバージョンを実行します。 - Android SDK バージョンが `3.5.0` 以降でです。 条件が満たされると、更新が未完了であっても接続プロセスは成功します。Stripe は、更新が正常にインストールされるまで、次回そのリーダーに接続したときに、必要な更新を再試行します。 #### Kotlin ```kotlin class ReaderActivity : AppCompatActivity(), MobileReaderListener { // ... override fun onStartInstallingUpdate(update: ReaderSoftwareUpdate, cancelable: Cancelable) { // Show UI communicating that a required update has started installing } override fun onReportReaderSoftwareUpdateProgress(progress: Float) { // Update the progress of the installation } override fun onFinishInstallingUpdate(update: ReaderSoftwareUpdate?, e: TerminalException?) { // Report success or failure of the update } // ... } ``` `Cancelable` オブジェクトを使用すると必須の更新をキャンセルできます。この場合もリーダーへの接続は失敗します。進行中の増分のみの更新はキャンセルできません。 ### オプションの更新 任意の更新は、指定した日付まで先延ばしすることが可能で、その後必須になります。リーダーの接続中、処理が行われていないときは SDK が随時 `MobileReaderListener` を通じて任意の更新を通知します。任意の更新が提供されている場合、アプリケーションの `MobileReaderListener` は、以下の更新情報を含む `ReaderSoftwareUpdate` オブジェクトとともに `onReportAvailableUpdate` コールバックを受信します。 - 更新にかかる推定時間 (`durationEstimate`) - 更新が必要になる日付 (`requiredAt`) アプリケーションで、更新が提供されていることをユーザーに伝え、必要に応じて更新に進むための画面を表示します。 `onReportAvailableUpdate` ですでに通知されている更新を続けるには、`Terminal.getInstance().installAvailableUpdate` をコールします。 利用可能な更新は、リーダーオブジェクトにも `reader.availableUpdate` として保存されます。 更新中は、顧客がアプリのページから移動できないようにするとともに、更新が完了するまでリーダーを受信範囲内に置き、電源を入れたままにしておくように指示します。また、更新の進捗状況を視覚的に示すインジケーターを、顧客に表示することもお勧めします。`MobileReaderListener` は、`onReportReaderSoftwareUpdateProgress` メソッドで更新の進捗状況を報告します。 オプションの更新の `requiredAt` の期日を過ぎると、次回リーダーが接続されたときに更新がインストールされます。 #### Kotlin ```kotlin class ReaderActivity : AppCompatActivity(), MobileReaderListener { // ... override fun onReportAvailableUpdate(update: ReaderSoftwareUpdate) { // An update is available for the connected reader. Show this update in your application. // Install this update using `Terminal.getInstance().installAvailableUpdate`. } // ... } ``` アプリケーションがリーダーに適用可能な各種の更新タイプを処理できるようにするには、[リーダーの更新をテストする](https://docs.stripe.com/terminal/references/testing.md#simulated-reader-updates) をご覧ください。 # Bluetooth リーダー > This is a Bluetooth リーダー for when terminal-sdk-platform is react-native and reader-type is bluetooth. View the full page at https://docs.stripe.com/terminal/payments/connect-reader?terminal-sdk-platform=react-native&reader-type=bluetooth. Bluetooth 接続型リーダーは Bluetooth LE デバイスです。支払い詳細を収集しますが、Stripe との通信にはペアリングされたモバイルデバイスを使用します。 Bluetooth を使用してアプリを Terminal リーダーに接続するには、次のステップを実行します。 1. [リーダーを検出](https://docs.stripe.com/terminal/payments/connect-reader.md#discover-readers)します。 1. [リーダーに接続](https://docs.stripe.com/terminal/payments/connect-reader.md#connect-reader)します。 > リーダーとペアリングするために、モバイルデバイス設定を使用しないでください。デバイス設定を使用してリーダーをペアリングすると、リーダーをアプリに接続できなくなります。 ## リーダーを検出する [クライアント側] - [discoverReaders (React Native)](https://stripe.dev/stripe-terminal-react-native/api-reference/interfaces/StripeTerminalSdkType.html#discoverReaders) まず、リーダーの電源が入っていて、近くにあることを確認してください。 次に、アプリから `discoverReaders` メソッドを使用して、近くにある Bluetooth 接続型リーダーを検索し、`discoveryMethod` を `bluetoothScan` に設定します。 ```js function DiscoverReadersScreen() { const { discoverReaders, discoveredReaders } = useStripeTerminal({ onUpdateDiscoveredReaders: (readers) => { // After the SDK discovers a reader, your app can connect to it. }, }); useEffect(() => { handleDiscoverReaders(); }, [discoverReaders]); const handleDiscoverReaders = async () => { // The list of discovered readers is reported in the `onUpdateDiscoveredReaders` method // within the `useStripeTerminal` hook. const { error } = await discoverReaders({ discoveryMethod: 'bluetoothScan', }); if (error) { Alert.alert( 'Discover readers error: ', `${error.code}, ${error.message}` ); } }; return ; } ``` #### Bluetooth スキャン Bluetooth スキャンは、近くにあるすべてのリーダーを検索して、検出したリーダーのリストをアプリに返します。検出プロセスが続くと、SDK は近くのリーダーの最新リストを使用して、`useStripeTerminal` フック内で `onUpdateDiscoveredReaders` を呼び出し続けます。 Bluetooth スキャン検出方法では、一定時間でスキャンをタイムアウトするよう設定できます。これを使用して、バッテリーの残量を管理したり、デバイスが見つからないときにエラーメッセージを表示したりできます。 モバイルアプリでは、ユーザーが自身のモバイルリーダーを特定しやすくするために、検出されたリーダーのシリアル番号を一覧表示し、自動更新されるようにすることをお勧めします。モバイルリーダーの検出時にはリーダーの `label` プロパティーには値が入りません。リーダーのわかりやすい名前を表示する場合は、アプリケーション側でシリアル番号とラベルの対応表を管理してください。 #### Bluetooth ペアリング セキュリティを強化し、EU の規制に準拠するため、2025 年 11 月現在、Stripe は WisePad 3 クレジットカードリーダーに数値比較 Bluetooth ペアリングプロセスを使用しています。数値比較プロセスでは、ペアリング時にカードリーダーと POS デバイスの両方でパスキーを確認する必要があります。デバイスを[最新のソフトウェアバージョン](https://docs.stripe.com/terminal/readers/bbpos-wisepad3.md#reader-software-releases)に更新したら、次の手順を実行して WisePad 3 を新しいモバイルアプリに接続します。POS デバイスが WisePad 3 リーダーを検出して表示したら、次の手順を実行します。 1. WisePad 3 と POS デバイスの両方で 6 桁のコードが一致していることを確認します。 1. WisePad 3 で **確定** を選択します。 1. POS デバイスで **ペアリング** を選択します。 > #### 注 > > 数値比較のペアリングは、WisePad 3 を新しい POS デバイスとペアリングする場合、または既存の「忘れた」 POS デバイスと再ペアリングする場合にのみ実行する必要があります。 ## リーダーに接続する [クライアント側] - [connectReader (React Native)](https://stripe.dev/stripe-terminal-react-native/api-reference/interfaces/StripeTerminalSdkType.html#connectreader-1) 検出されたリーダーに接続するには、アプリから `connectReader` メソッドを呼び出します。 リーダーを接続する際、[店舗](https://docs.stripe.com/api/terminal/locations.md)に[リーダーを登録](https://docs.stripe.com/terminal/fleet/locations-and-zones.md)する必要があります。これを行うには、接続時に `locationId` に関連するロケーション ID が設定されていることを確認します。 ```js const handleConnectBluetoothReader = async (id) => { const { reader, error } = await connectReader({ discoveryMethod: 'bluetoothScan', reader: selectedReader, locationId: {{LOCATION_ID}}, }); if (error) { console.log('connectReader error', error); return; } console.log('Reader connected successfully', reader); }; ``` > #### スタンバイモードを使用する > > アプリで省エネを目的として `disconnectReader` を呼び出すプログラムは使用しないでください。リーダーは、スタンバイモードを使用して効率的に電源を管理します。 ## リーダーの連結の解除を処理する - [REPORT_UNEXPECTED_READER_DISCONNECT (React Native)](https://stripe.dev/stripe-terminal-react-native/api-reference/index.html#REPORT_UNEXPECTED_READER_DISCONNECT) - [UserCallbacks (React Native)](https://stripe.dev/stripe-terminal-react-native/api-reference/index.html#UserCallbacks) - [DisconnectReason (React Native)](https://stripe.dev/stripe-terminal-react-native/api-reference/modules/Reader.html#DisconnectReason) リーダーの切断が、アプリとリーダーの間で発生することがあります。たとえば、リーダーが範囲外であるか、バッテリーが切れた場合、アプリからリーダーが切断されることがあります。リーダーの電源をオフにすると、テスト中に予期しない切断をシミュレーションできます。 `UserCallbacks` には、`onDidDisconnect` が含まれています。これは、リーダーの連結が解除された理由を特定できるように `DisconnectReason` をアプリケーションに提供します。 リーダーの切断にご自身で対処するには、次の手順を実行します。 1. 接続中は `autoReconnectOnUnexpectedDisconnect` を `false` に設定します。 1. 切断コールバックを処理して、リーダーが予期せず切断されたことをユーザーに通知するメッセージをアプリに表示し、リーダーの検出と接続を開始します。 ```js const terminal = useStripeTerminal({ onDidDisconnect: (result) => { // Consider displaying a UI to notify the user and start rediscovering readers }, }); ``` ### 接続されたリーダーを再起動する - [rebootReader (React Native)](https://stripe.dev/stripe-terminal-react-native/api-reference/interfaces/StripeTerminalSdkType.html#rebootReader) Stripe リーダー M2 および BBPOS WisePad 3 は、24 時間使用すると自動的に再起動します。ただし、`rebootReader` API を使用すると、リーダーを強制的に再起動して、24 時間のタイマーをリセットできます。このアクションの後、リーダーは SDK から切断され、再起動されます。自動再接続を使用している場合、SDK はリーダーとの接続を復元しようとします。 ```js const { error } = await rebootReader(); if (error) { console.log('rebootReader error:', error); return; } console.log('rebootReader succeeded'); ``` #### 自動的に再接続を試行する リーダーの接続が切断されると、デフォルトで自動再接続が試行されます。そのプロセスの間、リーダーのステータスを伝える通知をアプリに表示することをお勧めします。 自動再接続中にアプリに通知を表示するには、次の操作を行います。 1. `ConnectBluetoothReaderParams`で`autoReconnectOnUnexpectedDisconnect`を true に設定します。 1. `UserCallbacks` で見つかった自動再接続のコールバックを実装します。 1. SDK が `onDidStartReaderReconnect` をアプリに送信するときに、リーダーの接続が失われ、再接続が進行中であることを伝えるメッセージを表示します。 - `cancelReaderReconnection` を使用して、いつでも再接続の試行を停止できます。 1. SDK で `onDidSucceedReaderReconnect` を送信して再接続が成功したことが示された場合、接続が復元され、通常の動作を続行できることを通知するメッセージを表示します。 1. SDK がリーダーに接続できず `onDidFailReaderReconnect` を送信する場合は、予期しない連結の解除が発生したことを示すメッセージを表示します。 #### アプリケーションの開始時の自動再接続 Stripe Terminal は、アプリケーションの起動時にリーダーに自動的に再接続しません。代わりに、リーダー ID を保存し、起動時に既知のリーダーへの接続を行うことで、再接続フローを構築できます。 1. リーダーに正常に接続したら、そのシリアル番号を永続的なデータ格納場所に保存します ([Async Storage](https://github.com/react-native-async-storage/async-storage) (React Native) など)。 1. アプリが起動したら、その永続的なデータ格納場所に保存されているシリアル番号を確認します。確認できた場合は、`discoverReaders` メソッドを呼び出して、アプリケーションがそのリーダーを再度見つけられるようにします。 1. 保存されたシリアル番号が検出されたリーダーのいずれかと一致する場合は、`discoverReaders` の呼び出しから返された一致するリーダーオブジェクトを使用して、そのリーダーへの接続を試してください。以前に接続したリーダーが見つからない場合は、検出プロセスを停止します。 検出および接続プロセス中に何らかの UI を表示して、自動再接続が実行されていることを示します。 ## リーダーソフトウェアを更新する [クライアント側] - [UserCallbacks (React Native)](https://stripe.dev/stripe-terminal-react-native/api-reference/index.html#UserCallbacks) アプリケーションは、モバイルリーダーを更新して以下を適用する必要があります。 - カードネットワークとカード発行会社の要件に対して最新の状態に保つための地域設定 - セキュリティ更新 必要な更新では、リーダーに接続するとインストールが開始されます。更新が完了するまでリーダーを使用できません。 > 更新をインストールするには、リーダーのバッテリー残量が 50% 以上なければなりません。 ### 必要な更新 即時に必要な更新がリーダーで利用できるようになると、組み込みは `Reader.SoftwareUpdate` とともに `useStripeTerminal` フックから `onDidStartInstallingUpdate` を受け取ります。 `Reader.SoftwareUpdate` は、`estimatedUpdateTime` で示される更新の合計推定期間を含む、更新に必要な詳細を指定します。 インストールプロセスでは、更新がリーダーにインストールされる間、Terminal の `connectionStatus` が `"connecting"` に移行します。 アプリケーションからユーザーに更新をインストール中であることを伝え、また UI に進捗状況を表示する必要があります。接続に通常よりも時間がかかる理由を明確にします。 必要な更新プロセスが失敗した場合、Stripe は `onDidFinishInstallingUpdate` を使用して `useStripeTerminal` フックにエラーを通知します。以下の条件が満たされない限り、必要な更新に失敗した後にリーダーに再接続することはできません。 - リーダーは、過去 30 日間の場所に対応する最新のソフトウェアバージョンを実行します。 - React Native SDK バージョンが `0.0.1-beta.18` 以降でです。 条件が満たされると、更新が未完了であっても接続プロセスは成功します。Stripe は、更新が正常にインストールされるまで、次回そのリーダーに接続したときに、必要な更新を再試行します。 ```js const terminal = useStripeTerminal({ onDidReportReaderSoftwareUpdateProgress: (progress) => { setCurrentProgress((Number(progress) * 100).toFixed(0).toString()); }, onDidFinishInstallingUpdate: ({ error }) => { }, onDidStartInstallingUpdate: (update) => { }, }); ``` `cancelInstallingUpdate` API を使用すると必須の更新をキャンセルできます。この場合もリーダーへの接続は失敗します。進行中の増分のみの更新はキャンセルできません。 ### オプションの更新 オプションの更新は、指定の日付まで延ばすことができ、その後は必須になります。SDK では、リーダーの接続中、取引が実行されていないときはいつでも、`useStripeTerminal` フックからの `onDidReportAvailableUpdate` コールバックを介してオプションの更新が通知されます。オプションの更新が提供されている場合、アプリケーションの `useStripeTerminal` フックは、次のような更新の詳細が含まれる `SoftwareUpdate` オブジェクトとともに `onDidReportAvailableUpdate` コールバックを受信します。 - 更新にかかる推定時間 (`estimatedUpdateTime`) - 更新が必要になる日付 (`requiredAt`) アプリケーションで、更新が提供されていることをユーザーに伝え、必要に応じて更新に進むための画面を表示します。 以前に `onDidReportAvailableUpdate` で報告された更新を続けるには、`useStripeTerminal` フックから `installAvailableUpdate` を呼び出します。 利用可能な更新は、リーダーオブジェクトにも `reader.availableUpdate` として保存されます。 更新の進行中は、ユーザがアプリのページから移動できないようにブロックするとともに、更新が完了するまでリーダーを受信範囲内に置き、電源を入れたままにしておくように指示します。また、更新の進捗状況を視覚的に示すインジケーターを、ユーザーに表示することもお勧めします。`useStripeTerminal` フックは、`onDidReportReaderSoftwareUpdateProgress` メソッドで更新の進捗状況を報告します。 オプションの更新の `requiredAt` の期日を過ぎると、次回リーダーが接続されたときに更新がインストールされます。 ```js const terminal = useStripeTerminal({ onDidReportAvailableUpdate: (update) => { // An update is available for the connected reader. Show this update in your application. // Install this update using the `installAvailableUpdate` method from the `useStripeTerminal` hook. }, }); ``` アプリケーションがリーダーに適用可能な各種の更新タイプを処理できるようにするには、[リーダーの更新をテストする](https://docs.stripe.com/terminal/references/testing.md#simulated-reader-updates) をご覧ください。 # USB リーダー > This is a USB リーダー for when terminal-sdk-platform is android and reader-type is usb. View the full page at https://docs.stripe.com/terminal/payments/connect-reader?terminal-sdk-platform=android&reader-type=usb. Stripe Terminal Android SDK 3.0.0、 (またはそれ以降) を使用して、[Stripe Reader M2](https://docs.stripe.com/terminal/payments/setup-reader/stripe-m2.md) および [BBPOS WisePad 3](https://docs.stripe.com/terminal/payments/setup-reader/bbpos-wisepad3.md) リーダーの USB 接続に対応します。 Stripe Reader M2 や BBPOS WisePad 3 に付属の USB 2.0 ケーブルなど、データと充電の両方に対応する USB ケーブルを使用する必要があります。Terminal リーダーに付属のケーブルが充電専用である場合は、データを送信できる他社の USB 2.0 ケーブルを使用してください。 USB ケーブルを使用してアプリを Terminal リーダーに接続するには、次のステップを実行します。 1. [リーダーを検出する](https://docs.stripe.com/terminal/payments/connect-reader.md#discover-readers)。 1. [リーダーに接続する](https://docs.stripe.com/terminal/payments/connect-reader.md#connect-reader)。 ## リーダーを検出する [クライアント側] - [discoverReaders (Android)](https://stripe.dev/stripe-terminal-android/core/com.stripe.stripeterminal/-terminal/discover-readers.html) - [UsbDiscoveryConfiguration (Android)](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-discovery-configuration/-usb-discovery-configuration/index.html) リーダーの電源が入っていて、アプリを実行しているデバイスに USB 2.0 ケーブルで接続されていること、および USB 接続型リーダーにアクセスする権限が付与されていることを確認します。 リーダーを初めて接続する場合、接続のための Android システムメッセージが表示されます。「常に開く」チェックボックスを選択して、リーダーの接続時にメッセージを表示せずにアプリが開くようにすることができます。 次に、アプリで `UsbDiscoveryConfiguration` に指定して、`discoverReaders` メソッドで接続されているリーダーを検索します。 #### Kotlin ```kotlin class DiscoverReadersActivity : AppCompatActivity(), DiscoveryListener { // ... var discoverCancelable: Cancelable? = null // Action for a "Discover Readers" button fun discoverReadersAction() { val timeout = 0 val isSimulated = false val config = UsbDiscoveryConfiguration( timeout = timeout, isSimulated = isSimulated ) Terminal.getInstance().discoverReaders( config, this, object : Callback { override fun onSuccess() { // Placeholder for handling successful operation } override fun onFailure(e: TerminalException) { // Placeholder for handling exception } } ) } override fun onUpdateDiscoveredReaders(readers: List) { // In your app, display the discovered readers to the user. // Call `connectReader` after the user selects a reader to connect to. } // ... } ``` ## リーダーに接続する [クライアント側] - [connectReader (Android)](https://stripe.dev/stripe-terminal-android/core/com.stripe.stripeterminal/-terminal/connect-reader.html) - [UsbConnectionConfiguration (Android)](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-connection-configuration/-usb-connection-configuration/index.html) 検出されたリーダーに接続するには、アプリから `connectReader` メソッドを呼び出します。 リーダーを接続する際、[店舗](https://docs.stripe.com/api/terminal/locations.md)に[リーダーを登録](https://docs.stripe.com/terminal/fleet/locations-and-zones.md)する必要があります。これを行うには、接続時に `locationId` を Location ID に設定して、`UsbConnectionConfiguration` を作成・使用します。 #### Kotlin ```kotlin // Implement your MobileReaderListener val mobileReaderListener = yourMobileReaderListener val autoReconnectOnUnexpectedDisconnect = true val connectionConfig = UsbConnectionConfiguration( ""{{LOCATION_ID}}"", autoReconnectOnUnexpectedDisconnect, mobileReaderListener ) Terminal.getInstance().connectReader( selectedReader, connectionConfig, object : ReaderCallback { override fun onSuccess(reader: Reader) { // Placeholder for handling successful operation } override fun onFailure(e: TerminalException) { // Placeholder for handling exception } } ) ``` > #### スタンバイモードを使用する > > アプリで省エネを目的として `disconnectReader` を呼び出すプログラムは使用しないでください。リーダーは、スタンバイモードを使用して効率的に電源を管理します。 ## リーダーの連結の解除を処理する - [MobileReaderListener (Android)](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-mobile-reader-listener/index.html) - [DisconnectReason (Android)](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-disconnect-reason/index.html) リーダーの切断が、アプリとリーダーの間で発生することがあります。たとえば、リーダーをデバイスに接続する USB ケーブルがはずれた場合、アプリからリーダーが切断されることがあります。リーダーの電源をオフにすると、テスト中に予期しない切断をシミュレーションできます。 `MobileReaderListener` には、`onDisconnect` コールバックが含まれています。これは、リーダーの接続が切断された理由を示す `DisconnectReason` をアプリケーションに提供します。 リーダーの切断にご自身で対処するには、次の手順を実行します。 1. 接続中は `autoReconnectOnUnexpectedDisconnect` を `false` に設定します。 1. 切断コールバックを処理して、リーダーが予期せず切断されたことをユーザーに通知するメッセージをアプリに表示し、リーダーの検出と接続を開始します。 #### Kotlin ```kotlin class ReaderActivity : AppCompatActivity(), MobileReaderListener { // ... override fun onDisconnect(reason: DisconnectReason) { // Consider displaying a UI to notify the user and start rediscovering readers } // ... } ``` ### 接続されたリーダーを再起動する - [rebootReader (Android)](https://stripe.dev/stripe-terminal-android/core/com.stripe.stripeterminal/-terminal/reboot-reader.html) Stripe リーダー M2 および BBPOS WisePad 3 は、24 時間使用すると自動的に再起動します。ただし、`rebootReader` API を使用すると、リーダーを強制的に再起動して、24 時間のタイマーをリセットできます。このアクションの後、リーダーは SDK から切断され、再起動されます。自動再接続を使用している場合、SDK はリーダーとの接続を復元しようとします。 #### Kotlin ```kotlin Terminal.getInstance().rebootReader( object : Callback { override fun onSuccess() { // Reboot succeeded and the reader will disconnect. // If your app is using automatic reconnect the reconnect will begin. } override fun onFailure(e: TerminalException) { // Placeholder for handling exception } } ) ``` #### 自動的に再接続を試行する リーダーの接続が切断されると、デフォルトで自動再接続が試行されます。そのプロセスの間、リーダーのステータスを伝える通知をアプリに表示することをお勧めします。 自動再接続中にアプリに通知を表示するには、次の操作を行います。 1. `MobileReaderListener` にリーダーの再接続コールバックを実装します。 1. `MobileReaderListener` を `UsbConnectionConfiguration` に渡します。 1. [onReaderReconnectStarted](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-reader-reconnection-listener/on-reader-reconnect-started.html) をアプリに送信する際、SDK はリーダーの接続が失われ、再接続が進行中であることを伝えるメッセージを表示します。 - `Cancelable` オブジェクトを使用して、いつでも再接続の試行を停止できます。 1. [`onReaderReconnectSucceeded`](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-reader-reconnection-listener/on-reader-reconnect-succeeded.html) を送信して再接続が成功したことを示す際、SDK は接続が復元され、通常の動作を続行できることを通知するメッセージを表示します。 1. リーダーに接続できず、[`onReaderReconnectFailed`](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-reader-reconnection-listener/on-reader-reconnect-failed.html) と `onDisconnect` の両方を送信した場合、SDK は予期しない切断が発生したことを示すメッセージを表示します。 #### Kotlin ```kotlin class CustomMobileReaderListener : MobileReaderListener { // ... override fun onReaderReconnectStarted(reader: Reader, cancelReconnect: Cancelable, reason: DisconnectReason) { // 1. Notified at the start of a reconnection attempt // Use cancelable to stop reconnection at any time } override fun onReaderReconnectSucceeded(reader: Reader) { // 2. Notified when reader reconnection succeeds // App is now connected } override fun onReaderReconnectFailed(reader: Reader) { // 3. Notified when reader reconnection fails // App is now disconnected } // ... } ``` #### アプリケーションの開始時の自動再接続 Stripe Terminal は、アプリケーションの起動時にリーダーに自動的に再接続しません。代わりに、リーダー ID を保存し、起動時に既知のリーダーへの接続を行うことで、再接続フローを構築できます。 1. リーダーに正常に接続したら、シリアル番号を [Shared Preferences API](https://developer.android.com/training/data-storage/shared-preferences) (Android) などの永続的なデータ格納場所に保存します。 1. アプリが起動したら、その永続的なデータ格納場所に保存されているシリアル番号を確認します。確認できた場合は、`discoverReaders` メソッドを呼び出して、アプリケーションがそのリーダーを再度見つけられるようにします。 1. 保存されたシリアル番号が検出されたリーダーのいずれかと一致する場合は、`discoverReaders` の呼び出しから返された一致するリーダーオブジェクトを使用して、そのリーダーへの接続を試してください。以前に接続したリーダーが見つからない場合は、検出プロセスを停止します。 検出および接続プロセス中に何らかの UI を表示して、自動再接続が実行されていることを示します。 ## リーダーソフトウェアを更新する [クライアント側] - [MobileReaderListener (Android)](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-mobile-reader-listener/index.html) アプリケーションは、モバイルリーダーを更新して以下を適用する必要があります。 - カードネットワークとカード発行会社の要件に対して最新の状態に保つための地域設定 - セキュリティ更新 必要な更新では、リーダーに接続するとインストールが開始されます。更新が完了するまでリーダーを使用できません。 > 更新をインストールするには、リーダーのバッテリー残量が 50% 以上なければなりません。 ### 必要な更新 リーダーで緊急の更新が利用可能になると、システムの `MobileReaderListener` が `ReaderSoftwareUpdate` と `onStartInstallingUpdate` を受信します。 `ReaderSoftwareUpdate` は、更新に関する重要情報 (更新の合計推定時間を示す `durationEstimate` など) を提供します。 インストールプロセスでは、更新がリーダーにインストールされる間、Terminal の `connectionStatus` が `ConnectionStatus.CONNECTING` に移行します。 アプリケーションからユーザーに更新をインストール中であることを伝え、また UI に進捗状況を表示する必要があります。接続に通常よりも時間がかかる理由を明確にします。 必須の更新のプロセスが失敗した場合、Stripe は `onFinishInstallingUpdate` を使用して `MobileReaderListener` にエラーを通知します。必須の更新に失敗した後は、以下の条件が満たされない限り、リーダーに再接続することはできません。 - リーダーは、過去 30 日間の場所に対応する最新のソフトウェアバージョンを実行します。 - Android SDK バージョンが `3.5.0` 以降でです。 条件が満たされると、更新が未完了であっても接続プロセスは成功します。Stripe は、更新が正常にインストールされるまで、次回そのリーダーに接続したときに、必要な更新を再試行します。 #### Kotlin ```kotlin class ReaderActivity : AppCompatActivity(), MobileReaderListener { // ... override fun onStartInstallingUpdate(update: ReaderSoftwareUpdate, cancelable: Cancelable) { // Show UI communicating that a required update has started installing } override fun onReportReaderSoftwareUpdateProgress(progress: Float) { // Update the progress of the installation } override fun onFinishInstallingUpdate(update: ReaderSoftwareUpdate?, e: TerminalException?) { // Report success or failure of the update } // ... } ``` `Cancelable` オブジェクトを使用すると必須の更新をキャンセルできます。この場合もリーダーへの接続は失敗します。進行中の増分のみの更新はキャンセルできません。 ### オプションの更新 任意の更新は、指定した日付まで先延ばしすることが可能で、その後必須になります。リーダーの接続中、処理が行われていないときは SDK が随時 `MobileReaderListener` を通じて任意の更新を通知します。任意の更新が提供されている場合、アプリケーションの `MobileReaderListener` は、以下の更新情報を含む `ReaderSoftwareUpdate` オブジェクトとともに `onReportAvailableUpdate` コールバックを受信します。 - 更新にかかる推定時間 (`durationEstimate`) - 更新が必要になる日付 (`requiredAt`) アプリケーションで、更新が提供されていることをユーザーに伝え、必要に応じて更新に進むための画面を表示します。 `onReportAvailableUpdate` ですでに通知されている更新を続けるには、`Terminal.getInstance().installAvailableUpdate` をコールします。 利用可能な更新は、リーダーオブジェクトにも `reader.availableUpdate` として保存されます。 更新中は、顧客がアプリのページから移動できないようにするとともに、更新が完了するまでリーダーを接続したままにしておくように指示します。また、更新の進捗状況を視覚的に示すインジケーターを、顧客に表示することもお勧めします。`MobileReaderListener` は、`onReportReaderSoftwareUpdateProgress` メソッドで更新の進捗状況を報告します。 オプションの更新の `requiredAt` の期日を過ぎると、次回リーダーが接続されたときに更新がインストールされます。 #### Kotlin ```kotlin class ReaderActivity : AppCompatActivity(), MobileReaderListener { // ... override fun onReportAvailableUpdate(update: ReaderSoftwareUpdate) { // An update is available for the connected reader. Show this update in your application. // Install this update using `Terminal.getInstance().installAvailableUpdate`. } // ... } ``` アプリケーションがリーダーに適用可能な各種の更新タイプを処理できるようにするには、[リーダーの更新をテストする](https://docs.stripe.com/terminal/references/testing.md#simulated-reader-updates) をご覧ください。 # USB リーダー > This is a USB リーダー for when terminal-sdk-platform is react-native and reader-type is usb. View the full page at https://docs.stripe.com/terminal/payments/connect-reader?terminal-sdk-platform=react-native&reader-type=usb. > #### プラットフォームのサポート > > React Native SDK を使用したモバイルリーダーへの接続のサポートは、現時点で Android プラットフォームに限定されています。 Stripe Terminal React Native SDK beta.13、 (またはそれ以降) を使用して、[Stripe Reader M2](https://docs.stripe.com/terminal/payments/setup-reader/stripe-m2.md) および [BBPOS WisePad 3](https://docs.stripe.com/terminal/payments/setup-reader/bbpos-wisepad3.md) リーダーの USB 接続に対応します。 Stripe Reader M2 や BBPOS WisePad 3 に付属の USB 2.0 ケーブルなど、データと充電の両方に対応する USB ケーブルを使用する必要があります。Terminal リーダーに付属のケーブルが充電専用である場合は、データを送信できる他社の USB 2.0 ケーブルを使用してください。 USB ケーブルを使用してアプリを Terminal リーダーに接続するには、次のステップを実行します。 1. [リーダーを検出する](https://docs.stripe.com/terminal/payments/connect-reader.md#discover-readers)。 1. [リーダーに接続する](https://docs.stripe.com/terminal/payments/connect-reader.md#connect-reader)。 ## リーダーを検出する [クライアント側] - [discoverReaders (React Native)](https://stripe.dev/stripe-terminal-react-native/api-reference/interfaces/StripeTerminalSdkType.html#discoverreaders-1) - [DiscoveryReaderParams (React Native)](https://stripe.dev/stripe-terminal-react-native/api-reference/types/DiscoverReadersParams.html) リーダーの電源が入っていて、アプリを実行しているデバイスに USB 2.0 ケーブルで接続されていること、および USB 接続型リーダーにアクセスする権限が付与されていることを確認します。 リーダーを初めて接続する場合、接続のための Android システムメッセージが表示されます。「常に開く」チェックボックスを選択して、リーダーの接続時にメッセージを表示せずにアプリが開くようにすることができます。 次に、アプリで `DiscoveryMethod` を `usb` に指定して、`discoverReaders` メソッドで接続されているリーダーを検索します。 ```js function DiscoverReadersScreen() { const { discoverReaders, discoveredReaders } = useStripeTerminal({ onUpdateDiscoveredReaders: (readers) => { // After the SDK discovers a reader, your app can connect to it. }, }); useEffect(() => { handleDiscoverReaders(); }, []); const handleDiscoverReaders = async () => { // The list of discovered readers is reported in the `onUpdateDiscoveredReaders` method // within the `useStripeTerminal` hook. const { error } = await discoverReaders({ discoveryMethod: 'usb', }); if (error) { Alert.alert( 'Discover readers error: ', `${error.code}, ${error.message}` ); } }; return ; } ``` ## リーダーに接続する [クライアント側] - [connectReader (React Native)](https://stripe.dev/stripe-terminal-react-native/api-reference/interfaces/StripeTerminalSdkType.html#connectreader-1) - [ConnectUsbReaderParams (React Native)](https://stripe.dev/stripe-terminal-react-native/api-reference/interfaces/ConnectUsbReaderParams.html) 検出されたリーダーに接続するには、アプリから `connectReader` メソッドを呼び出します。 リーダーを接続する際、[店舗](https://docs.stripe.com/api/terminal/locations.md)に[リーダーを登録](https://docs.stripe.com/terminal/fleet/locations-and-zones.md)する必要があります。これを行うには、関連付けられている `locationId` を `ConnectUsbReaderParams` に渡します。。 ```js const handleConnectUsbReader = async (id) => { const { reader, error } = await connectReader({ discoveryMethod: 'usb', reader: selectedReader, locationId: {{LOCATION_ID}}, }); if (error) { console.log('connectReader error', error); return; } console.log('Reader connected successfully', reader); }; ``` > #### スタンバイモードを使用する > > アプリで省エネを目的として `disconnectReader` を呼び出すプログラムは使用しないでください。リーダーは、スタンバイモードを使用して効率的に電源を管理します。 ## リーダーの連結の解除を処理する - [REPORT_UNEXPECTED_READER_DISCONNECT (React Native)](https://stripe.dev/stripe-terminal-react-native/api-reference/index.html#REPORT_UNEXPECTED_READER_DISCONNECT) - [UserCallbacks (React Native)](https://stripe.dev/stripe-terminal-react-native/api-reference/index.html#UserCallbacks) - [DisconnectReason (React Native)](https://stripe.dev/stripe-terminal-react-native/api-reference/modules/Reader.html#DisconnectReason) リーダーの切断が、アプリとリーダーの間で発生することがあります。たとえば、リーダーをデバイスに接続する USB ケーブルがはずれた場合、アプリからリーダーが切断されることがあります。リーダーの電源をオフにすると、テスト中に予期しない切断をシミュレーションできます。 `UserCallbacks` には、`onDidDisconnect` が含まれています。これは、リーダーの連結が解除された理由を特定できるように `DisconnectReason` をアプリケーションに提供します。 リーダーの切断にご自身で対処するには、次の手順を実行します。 1. 接続中は `autoReconnectOnUnexpectedDisconnect` を `false` に設定します。 1. 切断コールバックを処理して、リーダーが予期せず切断されたことをユーザーに通知するメッセージをアプリに表示し、リーダーの検出と接続を開始します。 ```js const terminal = useStripeTerminal({ onDidDisconnect: (result) => { // Consider displaying a UI to notify the user and start rediscovering readers }, }); ``` ### 接続されたリーダーを再起動する - [rebootReader (React Native)](https://stripe.dev/stripe-terminal-react-native/api-reference/interfaces/StripeTerminalSdkType.html#rebootReader) Stripe リーダー M2 および BBPOS WisePad 3 は、24 時間使用すると自動的に再起動します。ただし、`rebootReader` API を使用すると、リーダーを強制的に再起動して、24 時間のタイマーをリセットできます。このアクションの後、リーダーは SDK から切断され、再起動されます。自動再接続を使用している場合、SDK はリーダーとの接続を復元しようとします。 ```js const { error } = await rebootReader(); if (error) { console.log('rebootReader error:', error); return; } console.log('rebootReader succeeded'); ``` #### 自動的に再接続を試行する リーダーの接続が切断されると、デフォルトで自動再接続が試行されます。そのプロセスの間、リーダーのステータスを伝える通知をアプリに表示することをお勧めします。 自動再接続中にアプリに通知を表示するには、次の操作を行います。 1. `ConnectUsbReaderParams`で`autoReconnectOnUnexpectedDisconnect`を true に設定します。 1. `UserCallbacks` で見つかった自動再接続のコールバックを実装します。 1. SDK が `onDidStartReaderReconnect` をアプリに送信するときに、リーダーの接続が失われ、再接続が進行中であることを伝えるメッセージを表示します。 - `cancelReaderReconnection` を使用して、いつでも再接続の試行を停止できます。 1. SDK で `onDidSucceedReaderReconnect` を送信して再接続が成功したことが示された場合、接続が復元され、通常の動作を続行できることを通知するメッセージを表示します。 1. SDK がリーダーに接続できず `onDidFailReaderReconnect` を送信する場合は、予期しない連結の解除が発生したことを示すメッセージを表示します。 #### アプリケーションの開始時の自動再接続 Stripe Terminal は、アプリケーションの起動時にリーダーに自動的に再接続しません。代わりに、リーダー ID を保存し、起動時に既知のリーダーへの接続を行うことで、再接続フローを構築できます。 1. リーダーに正常に接続したら、そのシリアル番号を永続的なデータ格納場所に保存します ([Async Storage](https://github.com/react-native-async-storage/async-storage) (React Native) など)。 1. アプリが起動したら、その永続的なデータ格納場所に保存されているシリアル番号を確認します。確認できた場合は、`discoverReaders` メソッドを呼び出して、アプリケーションがそのリーダーを再度見つけられるようにします。 1. 保存されたシリアル番号が検出されたリーダーのいずれかと一致する場合は、`discoverReaders` の呼び出しから返された一致するリーダーオブジェクトを使用して、そのリーダーへの接続を試してください。以前に接続したリーダーが見つからない場合は、検出プロセスを停止します。 検出および接続プロセス中に何らかの UI を表示して、自動再接続が実行されていることを示します。 ## リーダーソフトウェアを更新する [クライアント側] - [UserCallbacks (React Native)](https://stripe.dev/stripe-terminal-react-native/api-reference/index.html#UserCallbacks) アプリケーションは、モバイルリーダーを更新して以下を適用する必要があります。 - カードネットワークとカード発行会社の要件に対して最新の状態に保つための地域設定 - セキュリティ更新 必要な更新では、リーダーに接続するとインストールが開始されます。更新が完了するまでリーダーを使用できません。 > 更新をインストールするには、リーダーのバッテリー残量が 50% 以上なければなりません。 ### 必要な更新 即時に必要な更新がリーダーで利用できるようになると、組み込みは `Reader.SoftwareUpdate` とともに `useStripeTerminal` フックから `onDidStartInstallingUpdate` を受け取ります。 `Reader.SoftwareUpdate` は、`estimatedUpdateTime` で示される更新の合計推定期間を含む、更新に必要な詳細を指定します。 インストールプロセスでは、更新がリーダーにインストールされる間、Terminal の `connectionStatus` が `"connecting"` に移行します。 アプリケーションからユーザーに更新をインストール中であることを伝え、また UI に進捗状況を表示する必要があります。接続に通常よりも時間がかかる理由を明確にします。 必要な更新プロセスが失敗した場合、Stripe は `onDidFinishInstallingUpdate` を使用して `useStripeTerminal` フックにエラーを通知します。以下の条件が満たされない限り、必要な更新に失敗した後にリーダーに再接続することはできません。 - リーダーは、過去 30 日間の場所に対応する最新のソフトウェアバージョンを実行します。 - React Native SDK バージョンが `0.0.1-beta.18` 以降でです。 条件が満たされると、更新が未完了であっても接続プロセスは成功します。Stripe は、更新が正常にインストールされるまで、次回そのリーダーに接続したときに、必要な更新を再試行します。 ```js const terminal = useStripeTerminal({ onDidReportReaderSoftwareUpdateProgress: (progress) => { setCurrentProgress((Number(progress) * 100).toFixed(0).toString()); }, onDidFinishInstallingUpdate: ({ error }) => { }, onDidStartInstallingUpdate: (update) => { }, }); ``` `cancelInstallingUpdate` API を使用すると必須の更新をキャンセルできます。この場合もリーダーへの接続は失敗します。進行中の増分のみの更新はキャンセルできません。 ### オプションの更新 オプションの更新は、指定の日付まで延ばすことができ、その後は必須になります。SDK では、リーダーの接続中、取引が実行されていないときはいつでも、`useStripeTerminal` フックからの `onDidReportAvailableUpdate` コールバックを介してオプションの更新が通知されます。オプションの更新が提供されている場合、アプリケーションの `useStripeTerminal` フックは、次のような更新の詳細が含まれる `SoftwareUpdate` オブジェクトとともに `onDidReportAvailableUpdate` コールバックを受信します。 - 更新にかかる推定時間 (`estimatedUpdateTime`) - 更新が必要になる日付 (`requiredAt`) アプリケーションで、更新が提供されていることをユーザーに伝え、必要に応じて更新に進むための画面を表示します。 以前に `onDidReportAvailableUpdate` で報告された更新を続けるには、`useStripeTerminal` フックから `installAvailableUpdate` を呼び出します。 利用可能な更新は、リーダーオブジェクトにも `reader.availableUpdate` として保存されます。 更新の進行中は、ユーザがアプリのページから移動できないようにブロックするとともに、更新が完了するまでリーダーを受信範囲内に置き、電源を入れたままにしておくように指示します。また、更新の進捗状況を視覚的に示すインジケーターを、ユーザーに表示することもお勧めします。`useStripeTerminal` フックは、`onDidReportReaderSoftwareUpdateProgress` メソッドで更新の進捗状況を報告します。 オプションの更新の `requiredAt` の期日を過ぎると、次回リーダーが接続されたときに更新がインストールされます。 ```js const terminal = useStripeTerminal({ onDidReportAvailableUpdate: (update) => { // An update is available for the connected reader. Show this update in your application. // Install this update using the `installAvailableUpdate` method from the `useStripeTerminal` hook. }, }); ``` アプリケーションがリーダーに適用可能な各種の更新タイプを処理できるようにするには、[リーダーの更新をテストする](https://docs.stripe.com/terminal/references/testing.md#simulated-reader-updates) をご覧ください。 # インターネットリーダー > This is a インターネットリーダー for when terminal-sdk-platform is server-driven and reader-type is internet. View the full page at https://docs.stripe.com/terminal/payments/connect-reader?terminal-sdk-platform=server-driven&reader-type=internet. スマートリーダーは Stripe リーダーソフトウェアを実行し、インターネットを介して Stripe と直接通信します。アプリケーションをスマートリーダーに接続する前に、リーダーを Stripe アカウントに登録する必要があります。 #### ダッシュボード リーダーは[ダッシュボード](https://dashboard.stripe.com/terminal)で直接登録できます。 #### 登録コードで登録する 1. [リーダー](https://dashboard.stripe.com/terminal/readers)ページで、**リーダーを登録する**をクリックします。 1. [スマートリーダー](https://docs.stripe.com/terminal/smart-readers.md)をお持ちの場合は、`0-7-1-3-9` の順にキーを入力すると固有の登録コードが表示されます。BBPOS WisePOS E または Stripe Reader S700/S710 を使用している場合は、[リーダーの設定](https://docs.stripe.com/terminal/payments/setup-reader/bbpos-wisepos-e.md#settings)に移動して、**Generate pairing code** をタップします。 1. 登録コードを入力して、**次へ**をクリックします。 1. 任意でリーダーの名前を選択します。 1. すでに店舗を作成している場合は、リーダーの新しい店舗を選択します。まだ作成していない場合は、**+ 新規追加**をクリックして店舗を作成します。 1. **登録する**をクリックしてリーダーの登録を完了します。 #### シリアル番号で登録する 1. [リーダー](https://dashboard.stripe.com/terminal/readers)ページで、**リーダーを登録する**をクリックします。 1. デバイスに記載されているシリアル番号を探し、そのシリアル番号を入力します。複数のデバイスを一度に登録するには、複数のシリアル番号をカンマで区切って入力します。 1. 任意でリーダーの名前を選択します。 1. すでに店舗を作成している場合は、リーダーの新しい店舗を選択します。まだ作成していない場合は、**+ 新規追加**をクリックして店舗を作成します。 1. **登録**をクリックして、リーダーの登録を完了します。登録できるリーダーは、お客様またはプラットフォームが注文したものに限られます。 #### ハードウェアの注文で登録する 1. [ハードウェアの注文](https://dashboard.stripe.com/terminal/hardware_orders)ページで、ステータスが「配送済み」または「配達済み」の注文を見つけます。行の最後にあるオーバーフローメニュー (⋯) をクリックし、次に**登録する**をクリックします。 1. **リーダーを登録する**ページで、ハードウェアの注文から登録するリーダーを 1 つ以上選択して、**登録する**をクリックします。 1. 任意でリーダーの名前を選択します。複数のリーダーを選択した場合、名前はプレフィックスとして機能し、Stripe はリーダーに順番に名前を付けます (たとえば、「テストリーダー」と入力した場合、リーダーには「テストリーダー 1」、「テストリーダー 2」のように名前が付けられます)。 1. すでに店舗を作成している場合は、リーダーの新しい店舗を選択します。まだ作成していない場合は、**+ 新規追加**をクリックして店舗を作成します。 1. **登録する**をクリックしてリーダーの登録を完了します。 #### API 大規模なデプロイでは、現場のユーザーがそれぞれ新しいリーダーを受け取って設定できるようにします。アプリケーションで、Stripe API を使用してリーダーを[登録](https://docs.stripe.com/api/terminal/readers/create.md)するフローを構築します。 1. [リーダー設定](https://docs.stripe.com/terminal/payments/setup-reader/bbpos-wisepos-e.md#settings)に移動し、**ペアリングコードを生成**をタップします。 1. ユーザーはアプリケーションにそのコードを入力します。 1. アプリケーションはそのコードを Stripe に送信します。 ```curl curl https://api.stripe.com/v1/terminal/readers \ -u "<>:" \ -d registration_code={{READER_REGISTRATION_CODE}} \ --data-urlencode "label=Alice's reader" \ -d "location={{TERMINALLOCATION_ID}}" ``` リーダーが正しく登録されたことを確認するには、その店舗で登録したリーダーをすべて一覧表示します。 #### curl ```bash curl https://api.stripe.com/v1/terminal/readers \ -u <>: ``` リーダーを登録したら、サーバー主導型のシステムで使用できるようになります。POS からどのリーダーに取引を送信すべきかが分かるように、アプリケーション内にリーダー ID (`tmr_xxx`) を保存することをお勧めします。[リーダーリスト](https://docs.stripe.com/api/terminal/readers/list.md)エンドポイントを使用してリーダー ID を取得できます。 # インターネットリーダー > This is a インターネットリーダー for when terminal-sdk-platform is js and reader-type is internet. View the full page at https://docs.stripe.com/terminal/payments/connect-reader?terminal-sdk-platform=js&reader-type=internet. > #### スマートリーダーの推奨事項 > > [BBPOS WisePOS E リーダー](https://docs.stripe.com/terminal/payments/setup-reader/bbpos-wisepos-e.md)、[Stripe Reader S700/S710](https://docs.stripe.com/terminal/readers/stripe-reader-s700-s710.md)、[Verifone リーダー](https://docs.stripe.com/terminal/payments/setup-reader/verifone.md)などのスマートリーダーでは、JavaScript SDK ではなく[サーバー主導の実装](https://docs.stripe.com/terminal/payments/setup-integration.md?terminal-sdk-platform=server-driven)を使用することをお勧めします。 > > JavaScript SDK では、POS とリーダーが、有効なローカル DNS と同じローカルネットワーク上にある必要があります。サーバー主導型の統合では、代わりに Stripe API を使用するため、複雑なネットワーク環境ではよりシンプルになります。ニーズに最適なプラットフォームの選択に役立つ[プラットフォーム比較](https://docs.stripe.com/terminal/payments/setup-reader.md#sdk)をご覧ください。 スマートリーダーは Stripe リーダーソフトウェアを実行し、インターネットを介して Stripe と直接通信します。アプリをスマートリーダーに接続するには、以下の 3 つのステップが必要です。 1. Stripe アカウントに[リーダーを登録](https://docs.stripe.com/terminal/payments/connect-reader.md#register-reader)します。 1. SDK を使い[リーダーを検出](https://docs.stripe.com/terminal/payments/connect-reader.md#discover-readers)します。 1. SDK を使い[リーダーに接続](https://docs.stripe.com/terminal/payments/connect-reader.md#connect-reader)します。 ## リーダーを登録する [サーバー側] アプリケーションをスマートリーダーに接続するには、事前にリーダーをアカウントに登録しておく必要があります。 #### ダッシュボード ### ダッシュボードで登録する リーダーは[ダッシュボード](https://dashboard.stripe.com/test/terminal)で直接追加できます。 #### 登録コードで登録する 1. [リーダー](https://dashboard.stripe.com/terminal/readers)ページで、**リーダーを登録する**をクリックします。 1. [スマートリーダー](https://docs.stripe.com/terminal/smart-readers.md)をお持ちの場合は、`0-7-1-3-9` の順にキーを入力すると固有の登録コードが表示されます。BBPOS WisePOS E または Stripe Reader S700/S710 を使用している場合は、[リーダーの設定](https://docs.stripe.com/terminal/payments/setup-reader/bbpos-wisepos-e.md#settings)に移動して、**Generate pairing code** をタップします。 1. 登録コードを入力して、**次へ**をクリックします。 1. 任意でリーダーの名前を選択します。 1. すでに店舗を作成している場合は、リーダーの新しい店舗を選択します。まだ作成していない場合は、**+ 新規追加**をクリックして店舗を作成します。 1. **登録する**をクリックしてリーダーの登録を完了します。 #### シリアル番号で登録する 1. [リーダー](https://dashboard.stripe.com/terminal/readers)ページで、**リーダーを登録する**をクリックします。 1. デバイスに記載されているシリアル番号を探し、そのシリアル番号を入力します。複数のデバイスを一度に登録するには、複数のシリアル番号をカンマで区切って入力します。 1. 任意でリーダーの名前を選択します。 1. すでに店舗を作成している場合は、リーダーの新しい店舗を選択します。まだ作成していない場合は、**+ 新規追加**をクリックして店舗を作成します。 1. **登録する**をクリックしてリーダーの登録を完了します。 #### ハードウェアの注文で登録する 1. [ハードウェアの注文](https://dashboard.stripe.com/terminal/hardware_orders)ページで、ステータスが「配送済み」または「配達済み」の注文を見つけます。行の最後にあるオーバーフローメニュー (⋯) をクリックし、次に**登録する**をクリックします。 1. **リーダーを登録する**ページで、ハードウェアの注文から登録するリーダーを 1 つ以上選択して、**登録する**をクリックします。 1. 任意でリーダーの名前を選択します。複数のリーダーを選択した場合、名前はプレフィックスとして機能し、Stripe はリーダーに順番に名前を付けます (たとえば、「テストリーダー」と入力した場合、リーダーには「テストリーダー 1」、「テストリーダー 2」のように名前が付けられます)。 1. すでに店舗を作成している場合は、リーダーの新しい店舗を選択します。まだ作成していない場合は、**+ 新規追加**をクリックして店舗を作成します。 1. **登録する**をクリックしてリーダーの登録を完了します。 #### API 大規模なデプロイでは、現場のユーザーがそれぞれ新しいリーダーを受け取って設定できるようにします。アプリで、Stripe API を使用してリーダーを[登録](https://docs.stripe.com/api/terminal/readers/create.md)するフローを構築します。 1. [スマートリーダー](https://docs.stripe.com/terminal/smart-readers.md)をお持ちの場合は、`0-7-1-3-9` の順にキーを入力すると固有の登録コードが表示されます。BBPOS WisePOS E または Stripe Reader S700/S710 を使用している場合は、[リーダーの設定](https://docs.stripe.com/terminal/payments/setup-reader/bbpos-wisepos-e.md#settings)に移動して、**Generate pairing code** をタップします。 1. ユーザーはアプリケーションにそのコードを入力します。 1. アプリケーションはそのコードを Stripe に送信します。 ```curl curl https://api.stripe.com/v1/terminal/readers \ -u "<>:" \ -d registration_code={{READER_REGISTRATION_CODE}} \ --data-urlencode "label=Alice's reader" \ -d "location={{TERMINALLOCATION_ID}}" ``` リーダーが正しく登録されたことを確認するには、その店舗で登録したリーダーをすべて一覧表示します。 #### curl ```bash curl https://api.stripe.com/v1/terminal/readers \ -u <>: ``` ## リーダーを検出する [クライアント側] - [discoverReaders (JavaScript)](https://docs.stripe.com/terminal/references/api/js-sdk.md#discover-readers) アカウントにリーダーを登録したら、`discoverReaders` メソッドを使用してすでに登録されているリーダーを検索し、`discoveryMethod` を `internet` に設定して POS 申し込みに接続します。 前の手順でリーダーを登録した `location` を使用して、検索範囲を設定できます。 ```javascript async function discoverReaders() { const config = {simulated: false, location: "{{LOCATION_ID}}"} const discoverResult = await terminal.discoverReaders(config); if (discoverResult.error) { console.log('Failed to discover: ', discoverResult.error); } else if (discoverResult.discoveredReaders.length === 0) { console.log('No available readers.'); } else { // You should show the list of discoveredReaders to the // cashier here and let them select which to connect to (see below). connectReader(discoverResult); } } ``` ## リーダーに接続する [クライアント側] > Chrome 142(2025 年 10 月 28 日リリース)以降のバージョンでは、Stripe Terminal JavaScript SDK を使用する際に、Web サイトがローカルのネットワークデバイス(Terminal リーダーなど)にアクセスするには、明示的な許可が必要です。設定手順とトラブルシューティングについては、[Chrome 142 以上の手順](https://support.stripe.com/questions/ensuring-stripe-terminal-javascript-sdk-functionality-on-chrome-142)をご覧ください。 POS 申し込みをリーダーに接続するには、選択したリーダーで [connectReader](https://docs.stripe.com/terminal/references/api/js-sdk.md#connect-reader) を呼び出します。 ```javascript async function connectReader(discoverResult) { // Just select the first reader here. const selectedReader = discoverResult.discoveredReaders[0]; const connectResult = await terminal.connectReader(selectedReader); if (connectResult.error) { console.log('Failed to connect:', connectResult.error); } else { console.log('Connected to reader:', connectResult.reader.label); } } ``` - [connectReader (JavaScript)](https://docs.stripe.com/terminal/references/api/js-sdk.md#connect-reader) ### 複数の接続 リーダーに一度に接続できるのは、1 つの Stripe Terminal SDK インスタンスのみです。デフォルトでは、別のアプリケーションから `connectReader` を呼び出すと、SDK からリーダーへの既存の接続は受信した接続により置き換えられ、接続されていた SDK はリーダーから切断されます。`connectReader` メソッドは、`fail_if_in_use` プロパティを含む設定オブジェクトを使用します。このプロパティのデフォルト値は `false` です。アプリケーションで `fail_if_in_use` を true に設定すると、`connectReader` コールに代替の動作が適用されます。そのためリーダーが、別の SDK によって開始された `collectPaymentMethod` コールまたは `processPayment` コールを処理中の場合は、受信する接続が失敗します。リーダーが別の SDK に接続されていても待機状態である場合 (`collectPaymentMethod` が呼び出される前にスプラッシュスクリーンが表示される)、`fail_if_in_use` を設定しても接続の動作は変更されず、受信する接続リクエストにより、SDK からリーダーへの既存の接続は常に切断されます。 ```javascript const connectResult = await terminal.connectReader(reader, {fail_if_in_use: true}); ``` | | fail_if_in_use は false (デフォルト) | fail_if_in_use は true | | ---------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | | リーダーが待機状態の間、新しい SDK から `connectReader` が呼び出されます。 | 既存の SDK からリーダーへの接続が切断され、新しい SDK がリーダーに接続します。以前に接続した SDK からの次のコマンドはリーダーエラーで失敗し、そのアプリの `onDisconnect` メソッドが呼び出されます。 | 既存の SDK からリーダーへの接続が切断され、新しい SDK がリーダーに接続します。以前に接続した SDK からの次のコマンドはリーダーエラーで失敗し、そのアプリの `onDisconnect` メソッドが呼び出されます。 | | リーダーが取引を処理している間、新しい SDK から `connectReader` が呼び出されます。 | 既存の SDK からリーダーへの接続が切断され、新しい SDK がリーダーに接続します。以前に接続した SDK からの次のコマンドはリーダーエラーで失敗し、そのアプリの `onDisconnect` メソッドが呼び出されます。 | 受信する接続がリーダーのエラーで失敗します。SDK からリーダーへの既存の接続は切断されず、進行中のコマンドは続行されます。 | 複数リーダーがある環境で接続の中断を最小限に抑えるため、アプリケーションを初めて接続する際に `fail_if_in_use` を `true` に設定することをお勧めします。次に、接続が最初に失敗した場合に `fail_if_in_use` を `false` に設定してユーザーが接続を再試行できるようにします。 このように設定すると、ユーザーの 1 人が使用中のリーダーに誤って接続しても、取引の処理が中断されることはありません。必要に応じて接続することもできます。 ### 接続切断に対処する - [StripeTerminal.create (JavaScript)](https://docs.stripe.com/terminal/references/api/js-sdk.md#stripeterminal-create) リーダーの接続が切れた場合に対処できるように、お客様のアプリに `onUnexpectedReaderDisconnect` コールバックを実装する必要があります。このコールバックを実装する場合は、リーダーの接続が切れたことをユーザーに知らせる UI を表示します。`discoverReaders` を呼び出してリーダーをスキャンし、再接続を開始できます。 接続が切断されたリーダーへの再接続をアプリで自動的に試行したり、別のリーダーへの再接続を促す UI をユーザーに表示したりもできます。 リーダーでは、ネットワークへの接続が失われるとアプリとの接続が切断されることがあります。想定外の接続の切断をシミュレーションするには、リーダーの電源をオフにします。 ```javascript const terminal = StripeTerminal.create({ onFetchConnectionToken: fetchConnectionToken, onUnexpectedReaderDisconnect: unexpectedDisconnect, }); function unexpectedDisconnect() { // Consider displaying a UI to notify the user and start rediscovering readers } ``` ### 自動再接続 Stripe Terminal は、アプリケーションの起動時にリーダーに自動的に再接続しません。代わりに、リーダー ID を保存し、起動時に既知のリーダーへの接続を行うことで、再接続フローを構築できます。 1. リーダーに正常に接続したら、シリアル番号を [localStorage API](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage) などの永続的なデータ格納場所に保存します。 1. アプリが起動したら、その永続的な格納場所に保存されているシリアル番号を確認します。確認できた場合は、`discoverReaders` メソッドを呼び出して、アプリケーションがそのリーダーを再度見つけられるようにします。 1. 保存されたシリアル番号が検出されたリーダーのいずれかと一致する場合は、`discoverReaders` の呼び出しから返された一致するリーダーオブジェクトを使用して、そのリーダーへの接続を試してください。以前に接続したリーダーが見つからない場合は、検出プロセスを停止します。 検出および接続プロセス中に何らかの UI を表示して、自動再接続が実行されていることを示します。 # インターネットリーダー > This is a インターネットリーダー for when terminal-sdk-platform is ios and reader-type is internet. View the full page at https://docs.stripe.com/terminal/payments/connect-reader?terminal-sdk-platform=ios&reader-type=internet. スマートリーダーは Stripe リーダーソフトウェアを実行し、インターネットを介して Stripe と直接通信します。アプリをスマートリーダーに接続するには、以下の 3 つのステップが必要です。 1. Stripe アカウントに[リーダーを登録](https://docs.stripe.com/terminal/payments/connect-reader.md#register-reader)します。 1. SDK を使い[リーダーを検出](https://docs.stripe.com/terminal/payments/connect-reader.md#discover-readers)します。 1. SDK を使い[リーダーに接続](https://docs.stripe.com/terminal/payments/connect-reader.md#connect-reader)します。 ## リーダーを登録する [サーバー側] アプリケーションをスマートリーダーに接続するには、事前にリーダーをアカウントに登録しておく必要があります。 #### ダッシュボード ### ダッシュボードで登録する リーダーは[ダッシュボード](https://dashboard.stripe.com/test/terminal)で直接追加できます。 #### 登録コードで登録する 1. [リーダー](https://dashboard.stripe.com/terminal/readers)ページで、**リーダーを登録する**をクリックします。 1. [スマートリーダー](https://docs.stripe.com/terminal/smart-readers.md)をお持ちの場合は、`0-7-1-3-9` の順にキーを入力すると固有の登録コードが表示されます。BBPOS WisePOS E または Stripe Reader S700/S710 を使用している場合は、[リーダーの設定](https://docs.stripe.com/terminal/payments/setup-reader/bbpos-wisepos-e.md#settings)に移動して、**Generate pairing code** をタップします。 1. 登録コードを入力して、**次へ**をクリックします。 1. 任意でリーダーの名前を選択します。 1. すでに店舗を作成している場合は、リーダーの新しい店舗を選択します。まだ作成していない場合は、**+ 新規追加**をクリックして店舗を作成します。 1. **登録する**をクリックしてリーダーの登録を完了します。 #### シリアル番号で登録する 1. [リーダー](https://dashboard.stripe.com/terminal/readers)ページで、**リーダーを登録する**をクリックします。 1. デバイスに記載されているシリアル番号を探し、そのシリアル番号を入力します。複数のデバイスを一度に登録するには、複数のシリアル番号をカンマで区切って入力します。 1. 任意でリーダーの名前を選択します。 1. すでに店舗を作成している場合は、リーダーの新しい店舗を選択します。まだ作成していない場合は、**+ 新規追加**をクリックして店舗を作成します。 1. **登録する**をクリックしてリーダーの登録を完了します。 #### ハードウェアの注文で登録する 1. [ハードウェアの注文](https://dashboard.stripe.com/terminal/hardware_orders)ページで、ステータスが「配送済み」または「配達済み」の注文を見つけます。行の最後にあるオーバーフローメニュー (⋯) をクリックし、次に**登録する**をクリックします。 1. **リーダーを登録する**ページで、ハードウェアの注文から登録するリーダーを 1 つ以上選択して、**登録する**をクリックします。 1. 任意でリーダーの名前を選択します。複数のリーダーを選択した場合、名前はプレフィックスとして機能し、Stripe はリーダーに順番に名前を付けます (たとえば、「テストリーダー」と入力した場合、リーダーには「テストリーダー 1」、「テストリーダー 2」のように名前が付けられます)。 1. すでに店舗を作成している場合は、リーダーの新しい店舗を選択します。まだ作成していない場合は、**+ 新規追加**をクリックして店舗を作成します。 1. **登録する**をクリックしてリーダーの登録を完了します。 #### API 大規模なデプロイでは、現場のユーザーがそれぞれ新しいリーダーを受け取って設定できるようにします。アプリで、Stripe API を使用してリーダーを[登録](https://docs.stripe.com/api/terminal/readers/create.md)するフローを構築します。 1. [スマートリーダー](https://docs.stripe.com/terminal/smart-readers.md)をお持ちの場合は、`0-7-1-3-9` の順にキーを入力すると固有の登録コードが表示されます。BBPOS WisePOS E または Stripe Reader S700/S710 を使用している場合は、[リーダーの設定](https://docs.stripe.com/terminal/payments/setup-reader/bbpos-wisepos-e.md#settings)に移動して、**Generate pairing code** をタップします。 1. ユーザーはアプリケーションにそのコードを入力します。 1. アプリケーションはそのコードを Stripe に送信します。 ```curl curl https://api.stripe.com/v1/terminal/readers \ -u "<>:" \ -d registration_code={{READER_REGISTRATION_CODE}} \ --data-urlencode "label=Alice's reader" \ -d "location={{TERMINALLOCATION_ID}}" ``` リーダーが正しく登録されたことを確認するには、その店舗で登録したリーダーをすべて一覧表示します。 #### curl ```bash curl https://api.stripe.com/v1/terminal/readers \ -u <>: ``` ## リーダーを検出する [クライアント側] - [discoverReaders (iOS)](https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPTerminal.html#/c:objc\(cs\)SCPTerminal\(im\)discoverReaders:delegate:completion:) - [InternetDiscoveryConfiguration (iOS)](https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPInternetDiscoveryConfiguration.html) アカウントにリーダーを登録したら、`InternetDiscoveryConfiguration` を使用してすでに登録されているリーダーを検索し、`discoverReaders` で POS 申し込みに接続します。 前の手順でリーダーを登録した `location` を使用して、検索範囲を設定できます。 #### Swift ```swift import StripeTerminal class DiscoverReadersViewController: UIViewController, DiscoveryDelegate { func discoverReadersAction() throws { let config = try InternetDiscoveryConfigurationBuilder() .setLocationId(""{{LOCATION_ID}}"") .build() // In addition to Terminal's completion block methods, Swift async alternatives are available. // See our Example app for usage examples: https://github.com/stripe/stripe-terminal-ios/tree/master/Example self.discoverCancelable = Terminal.shared.discoverReaders(config, delegate: self) { error in if let error = error { print("discoverReaders failed: \(error)") } else { print("discoverReaders succeeded") } } } } ``` スマートリーダーを検索するときは `discoverReaders` を呼び出すたびに 1 回のみ `DiscoveryDelegate.didUpdateDiscoveredReaders` メソッドが呼び出されます。登録されたリーダーがない場合、または指定の店舗に関連付けられたリーダーがない場合、`didUpdateDiscoveredReaders` はリーダーの空白のリストを返します。その後、`discoverReaders` を呼び出してリストを更新する場合は、まず `discoverReaders` によって返される `Cancelable` を使用して前回の呼び出しをキャンセルする必要があります。 `InternetDiscoveryConfiguration` は、オンラインでリーダーを検出するための `timeout` 値をオプションでサポートしています。これにより、オンラインでの試行が失敗した場合に、オフラインのリーダー検出にすばやくフォールバックできます。 ## リーダーに接続する [クライアント側] > iOS SDK のバージョン `5.1.0` では、`easyConnect` メソッドを使用して、リーダーの検出と接続を 1 つの API コールに統合し、実装を簡素化できます。詳細については、[SDK 移行ガイド](https://docs.stripe.com/terminal/references/sdk-migration-guide.md#update-your-reader-connection-usage-ios)を参照してください。 POS 申し込みをリーダーに接続するには、`InternetConnectionConfiguration` を使用して、選択したリーダーで `connectReader` を呼び出します。 #### Swift ```swift let config: InternetConnectionConfiguration do { config = try InternetConnectionConfigurationBuilder(delegate: yourInternetReaderDelegate) .build() } catch { // Handle error building the connection configuration return } Terminal.shared.connectReader(selectedReader, connectionConfig: config) { reader, error in if let reader = reader { print("Successfully connected to reader: \(reader)") } else if let error = error { print("connectReader failed: \(error)") } } ``` - [connectReader (iOS)](https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPTerminal.html#/c:objc\(cs\)SCPTerminal\(im\)connectReader:connectionConfig:completion:) - [InternetConnectionConfiguration](https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPInternetConnectionConfiguration.html) ### 複数の接続 リーダーに一度に接続できるのは、1 つの Stripe Terminal SDK インスタンスのみです。デフォルトでは、別のアプリケーションから `connectReader` を呼び出すと、SDK からリーダーへの既存の接続が受信した接続に置き換えられ、接続されていた SDK はリーダーから切断されます。`connectReader` メソッドでは、`failIfInUse` プロパティを含む設定オブジェクトを使用します。このプロパティのデフォルト値は `false` です。アプリケーションで `failIfInUse` を true に設定すると、`connectReader` コールに代替の動作が適用されます。そのため、別の SDK によって開始された `collectPaymentMethod` コールまたは `confirmPaymentIntent` コールをリーダーが処理している間は、受信する接続が失敗します。リーダーが別の SDK に接続されているにもかかわらず待機状態である場合 (`collectPaymentMethod` が呼び出される前にスプラッシュスクリーンが表示されます)、`failIfInUse` を設定しても接続の動作は変更されず、受信する接続リクエストにより、SDK からリーダーへの既存の接続は常に切断されます。 #### Swift ```swift let internetReaderDelegate = yourInternetReaderDelegate // implement your internetReaderDelegate let config: InternetConnectionConfiguration do { config = try InternetConnectionConfigurationBuilder(delegate: internetReaderDelegate) .setFailIfInUse(true) .build() } catch { // Handle error building the connection configuration return } Terminal.shared.connectReader(selectedReader, connectionConfig: config, completion: { reader, error in // ... }) ``` | | failIfInUse は false (デフォルト) | failIfInUse は true | | ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------ | | リーダーが待機状態の間、新しい SDK から `connectReader` が呼び出されます。 | 既存の SDK からリーダーへの接続が切断され、新しい SDK がリーダーに接続します。以前に接続した SDK からの次のコマンドはリーダーエラーで失敗し、そのアプリの `didDisconnect` メソッドが呼び出されます。 | 既存の SDK からリーダーへの接続が切断され、新しい SDK がリーダーに接続します。以前に接続した SDK からの次のコマンドはリーダーエラーで失敗し、そのアプリの `didDisconnect` メソッドが呼び出されます。 | | リーダーが取引を処理している間、新しい SDK から `connectReader` が呼び出されます。 | 既存の SDK からリーダーへの接続が切断され、新しい SDK がリーダーに接続します。以前に接続した SDK からの次のコマンドはリーダーエラーで失敗し、そのアプリの `didDisconnect` メソッドが呼び出されます。 | 受信する接続がリーダーのエラーで失敗します。SDK からリーダーへの既存の接続は切断されず、進行中のコマンドは続行されます。 | 複数リーダーがある環境で接続の中断を最小限に抑えるため、アプリケーションを初めて接続する際に `failIfInUse` を `true` に設定することをお勧めします。次に、接続が最初に失敗した場合に `failIfInUse` を `false` に設定してユーザーが接続を再試行できるようにします。 このように設定すると、ユーザーの 1 人が使用中のリーダーに誤って接続しても、取引の処理が中断されることはありません。必要に応じて接続することもできます。 ### 接続切断に対処する - [didDisconnect (iOS)](https://stripe.dev/stripe-terminal-ios/docs/Protocols/SCPReaderDelegate.html#/c:objc\(pl\)SCPReaderDelegate\(im\)reader:didDisconnect:) リーダーの接続の切断に備え、アプリに `reader(_, didDisconnect:)` コールバックを実装します。このコールバックを実装する際は、リーダーの接続が切断されることを知らせる UI を表示するようにしてください。`discoverReaders` を呼び出してリーダーをスキャンすると、再接続が開始されます。 接続が切断されたリーダーへの再接続をアプリで自動的に試行したり、別のリーダーへの再接続を促す UI をユーザーに表示したりもできます。 リーダーでは、ネットワークへの接続が失われるとアプリとの接続が切断されることがあります。想定外の接続の切断をシミュレーションするには、リーダーの電源をオフにします。 #### Swift ```swift import StripeTerminal class ReaderViewController: UIViewController, InternetReaderDelegate { override func viewDidLoad() { super.viewDidLoad() // Set the reader delegate when connecting to a reader } // ... func reader(_ reader: Reader, didDisconnect reason: DisconnectReason) { // Consider displaying a UI to notify the user and start rediscovering readers } } ``` ### 自動再接続 Stripe Terminal は、アプリケーションの起動時にリーダーに自動的に再接続しません。代わりに、リーダー ID を保存し、起動時に既知のリーダーへの接続を行うことで、再接続フローを構築できます。 1. リーダーに正常に接続したら、シリアル番号を [UserDefaults API](https://developer.apple.com/documentation/foundation/userdefaults) (iOS) などの永続的なデータ格納場所に保存します。 1. アプリが起動したら、その永続的な格納場所に保存されているシリアル番号を確認します。確認できた場合は、`discoverReaders` メソッドを呼び出して、アプリケーションがそのリーダーを再度見つけられるようにします。 1. 保存されたシリアル番号が検出されたリーダーのいずれかと一致する場合は、`discoverReaders` の呼び出しから返された一致するリーダーオブジェクトを使用して、そのリーダーへの接続を試してください。以前に接続したリーダーが見つからない場合は、検出プロセスを停止します。 検出および接続プロセス中に何らかの UI を表示して、自動再接続が実行されていることを示します。 # インターネットリーダー > This is a インターネットリーダー for when terminal-sdk-platform is android and reader-type is internet. View the full page at https://docs.stripe.com/terminal/payments/connect-reader?terminal-sdk-platform=android&reader-type=internet. スマートリーダーは Stripe リーダーソフトウェアを実行し、インターネットを介して Stripe と直接通信します。アプリをスマートリーダーに接続するには、以下の 3 つのステップが必要です。 1. Stripe アカウントに[リーダーを登録](https://docs.stripe.com/terminal/payments/connect-reader.md#register-reader)します。 1. SDK を使い[リーダーを検出](https://docs.stripe.com/terminal/payments/connect-reader.md#discover-readers)します。 1. SDK を使い[リーダーに接続](https://docs.stripe.com/terminal/payments/connect-reader.md#connect-reader)します。 ## リーダーを登録する [サーバー側] アプリケーションをスマートリーダーに接続するには、事前にリーダーをアカウントに登録しておく必要があります。 #### ダッシュボード ### ダッシュボードで登録する リーダーは[ダッシュボード](https://dashboard.stripe.com/test/terminal)で直接追加できます。 #### 登録コードで登録する 1. [リーダー](https://dashboard.stripe.com/terminal/readers)ページで、**リーダーを登録する**をクリックします。 1. [スマートリーダー](https://docs.stripe.com/terminal/smart-readers.md)をお持ちの場合は、`0-7-1-3-9` の順にキーを入力すると固有の登録コードが表示されます。BBPOS WisePOS E または Stripe Reader S700/S710 を使用している場合は、[リーダーの設定](https://docs.stripe.com/terminal/payments/setup-reader/bbpos-wisepos-e.md#settings)に移動して、**Generate pairing code** をタップします。 1. 登録コードを入力して、**次へ**をクリックします。 1. 任意でリーダーの名前を選択します。 1. すでに店舗を作成している場合は、リーダーの新しい店舗を選択します。まだ作成していない場合は、**+ 新規追加**をクリックして店舗を作成します。 1. **登録する**をクリックしてリーダーの登録を完了します。 #### シリアル番号で登録する 1. [リーダー](https://dashboard.stripe.com/terminal/readers)ページで、**リーダーを登録する**をクリックします。 1. デバイスに記載されているシリアル番号を探し、そのシリアル番号を入力します。複数のデバイスを一度に登録するには、複数のシリアル番号をカンマで区切って入力します。 1. 任意でリーダーの名前を選択します。 1. すでに店舗を作成している場合は、リーダーの新しい店舗を選択します。まだ作成していない場合は、**+ 新規追加**をクリックして店舗を作成します。 1. **登録する**をクリックしてリーダーの登録を完了します。 #### ハードウェアの注文で登録する 1. [ハードウェアの注文](https://dashboard.stripe.com/terminal/hardware_orders)ページで、ステータスが「配送済み」または「配達済み」の注文を見つけます。行の最後にあるオーバーフローメニュー (⋯) をクリックし、次に**登録する**をクリックします。 1. **リーダーを登録する**ページで、ハードウェアの注文から登録するリーダーを 1 つ以上選択して、**登録する**をクリックします。 1. 任意でリーダーの名前を選択します。複数のリーダーを選択した場合、名前はプレフィックスとして機能し、Stripe はリーダーに順番に名前を付けます (たとえば、「テストリーダー」と入力した場合、リーダーには「テストリーダー 1」、「テストリーダー 2」のように名前が付けられます)。 1. すでに店舗を作成している場合は、リーダーの新しい店舗を選択します。まだ作成していない場合は、**+ 新規追加**をクリックして店舗を作成します。 1. **登録する**をクリックしてリーダーの登録を完了します。 #### API 大規模なデプロイでは、現場のユーザーがそれぞれ新しいリーダーを受け取って設定できるようにします。アプリで、Stripe API を使用してリーダーを[登録](https://docs.stripe.com/api/terminal/readers/create.md)するフローを構築します。 1. [スマートリーダー](https://docs.stripe.com/terminal/smart-readers.md)をお持ちの場合は、`0-7-1-3-9` の順にキーを入力すると固有の登録コードが表示されます。BBPOS WisePOS E または Stripe Reader S700/S710 を使用している場合は、[リーダーの設定](https://docs.stripe.com/terminal/payments/setup-reader/bbpos-wisepos-e.md#settings)に移動して、**Generate pairing code** をタップします。 1. ユーザーはアプリケーションにそのコードを入力します。 1. アプリケーションはそのコードを Stripe に送信します。 ```curl curl https://api.stripe.com/v1/terminal/readers \ -u "<>:" \ -d registration_code={{READER_REGISTRATION_CODE}} \ --data-urlencode "label=Alice's reader" \ -d "location={{TERMINALLOCATION_ID}}" ``` リーダーが正しく登録されたことを確認するには、その店舗で登録したリーダーをすべて一覧表示します。 #### curl ```bash curl https://api.stripe.com/v1/terminal/readers \ -u <>: ``` ## リーダーを検出する [クライアント側] - [discoverReaders (Android)](https://stripe.dev/stripe-terminal-android/core/com.stripe.stripeterminal/-terminal/discover-readers.html) - [InternetDiscoveryConfiguration (Android)](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-discovery-configuration/-internet-discovery-configuration/index.html) アカウントにリーダーを登録したら、`InternetDiscoveryConfiguration` を使用してすでに登録されているリーダーを検索し、`discoverReaders` で POS 申し込みに接続します。 前の手順でリーダーを登録した `location` を使用して、検索範囲を設定できます。 #### Kotlin ```kotlin var discoveryCancelable: Cancelable? = null fun onDiscoverReaders() { val timeout = 0 val isSimulated = false val config = InternetDiscoveryConfiguration( timeout = timeout, isSimulated = isSimulated, location = ""{{LOCATION_ID}}"" ) // Save this cancelable to an instance variable discoveryCancelable = Terminal.getInstance().discoverReaders( config, object : DiscoveryListener { override fun onUpdateDiscoveredReaders(readers: List) { // Display the discovered readers to the user } }, object : Callback { override fun onSuccess() { // Placeholder for handling successful operation } override fun onFailure(e: TerminalException) { // Placeholder for handling exception } } ) } override fun onStop() { super.onStop() // If you're leaving the activity or fragment without selecting a reader, // make sure you cancel the discovery process or the SDK will be stuck in // a discover readers phase. discoveryCancelable?.cancel( object : Callback { override fun onSuccess() { // Placeholder for handling successful operation } override fun onFailure(e: TerminalException) { // Placeholder for handling exception } } ) } ``` ## リーダーに接続する [クライアント側] > Android SDK のバージョン `5.0.0` では、`easyConnect` メソッドを使用して、リーダーの検出と接続を 1 つの API コールに統合し、統合エクスペリエンスを簡素化できます。詳細については、[SDK 移行ガイド](https://docs.stripe.com/terminal/references/sdk-migration-guide.md#update-your-reader-connection-usage)を参照してください。 POS 申し込みをリーダーに接続するには、`InternetConnectionConfiguration` を使用して、選択したリーダーで `connectReader` を呼び出します。 #### Kotlin ```kotlin val internetReaderListener = yourInternetReaderListener val config = InternetConnectionConfiguration(internetReaderListener) Terminal.getInstance().connectReader( firstReader, config, object : ReaderCallback { override fun onSuccess(reader: Reader) { // Placeholder for handling successful operation } override fun onFailure(e: TerminalException) { // Placeholder for handling exception } } ) ``` - [connectReader (Android)](https://stripe.dev/stripe-terminal-android/core/com.stripe.stripeterminal/-terminal/connect-reader.html) - [InternetConnectionConfiguration (Android)](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-connection-configuration/-internet-connection-configuration/index.html) ### 複数の接続 リーダーに一度に接続できるのは、1 つの Stripe Terminal SDK インスタンスのみです。デフォルトでは、別のアプリケーションから `connectReader` を呼び出すと、SDK からリーダーへの既存の接続が受信した接続に置き換えられ、接続されていた SDK はリーダーから切断されます。`connectReader` メソッドでは、`failIfInUse` プロパティを含む設定オブジェクトを使用します。このプロパティのデフォルト値は `false` です。アプリケーションで `failIfInUse` を true に設定すると、`connectReader` コールに代替の動作が適用されます。そのため、別の SDK によって開始された `collectPaymentMethod` コールまたは `confirmPaymentIntent` コールをリーダーが処理している間は、受信する接続が失敗します。リーダーが別の SDK に接続されているにもかかわらず待機状態である場合 (`collectPaymentMethod` が呼び出される前にスプラッシュスクリーンが表示されます)、`failIfInUse` を設定しても接続の動作は変更されず、受信する接続リクエストにより、SDK からリーダーへの既存の接続は常に切断されます。 #### Kotlin ```kotlin val failIfInUse = true val internetReaderListener = yourInternetReaderListener val config = InternetConnectionConfiguration(internetReaderListener, failIfInUse) Terminal.getInstance().connectReader( reader, config, object : ReaderCallback { override fun onSuccess(reader: Reader) { // Placeholder for handling successful operation } override fun onFailure(e: TerminalException) { // Placeholder for handling exception } } ) ``` | | failIfInUse は false (デフォルト) | failIfInUse は true | | ---------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | | リーダーが待機状態の間、新しい SDK から `connectReader` が呼び出されます。 | 既存の SDK からリーダーへの接続が切断され、新しい SDK がリーダーに接続します。以前に接続した SDK からの次のコマンドはリーダーエラーで失敗し、そのアプリの `onDisconnect` メソッドが呼び出されます。 | 既存の SDK からリーダーへの接続が切断され、新しい SDK がリーダーに接続します。以前に接続した SDK からの次のコマンドはリーダーエラーで失敗し、そのアプリの `onDisconnect` メソッドが呼び出されます。 | | リーダーが取引を処理している間、新しい SDK から `connectReader` が呼び出されます。 | 既存の SDK からリーダーへの接続が切断され、新しい SDK がリーダーに接続します。以前に接続した SDK からの次のコマンドはリーダーエラーで失敗し、そのアプリの `onDisconnect` メソッドが呼び出されます。 | 受信する接続がリーダーのエラーで失敗します。SDK からリーダーへの既存の接続は切断されず、進行中のコマンドは続行されます。 | 複数リーダーがある環境で接続の中断を最小限に抑えるため、アプリケーションを初めて接続する際に `failIfInUse` を `true` に設定することをお勧めします。次に、接続が最初に失敗した場合に `failIfInUse` を `false` に設定してユーザーが接続を再試行できるようにします。 このように設定すると、ユーザーの 1 人が使用中のリーダーに誤って接続しても、取引の処理が中断されることはありません。必要に応じて接続することもできます。 ### 接続切断に対処する - [onDisconnect (Android)](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-reader-disconnect-listener/on-disconnect.html) リーダーの接続の切断に備え、アプリに `onDisconnect` コールバックを実装します。このコールバックを実装する際は、リーダーの接続が切断されることを知らせる UI を表示するようにしてください。`discoverReaders` を呼び出してリーダーをスキャンすると、再接続が開始されます。 接続が切断されたリーダーへの再接続をアプリで自動的に試行したり、別のリーダーへの再接続を促す UI をユーザーに表示したりもできます。 リーダーでは、ネットワークへの接続が失われるとアプリとの接続が切断されることがあります。想定外の接続の切断をシミュレーションするには、リーダーの電源をオフにします。 #### Kotlin ```kotlin class ReaderActivity : AppCompatActivity(), InternetReaderListener { // ... override fun onDisconnect(reason: DisconnectReason) { // Consider displaying a UI to notify the user and start rediscovering readers } // ... } ``` ### 自動再接続 Stripe Terminal は、アプリケーションの起動時にリーダーに自動的に再接続しません。代わりに、リーダー ID を保存し、起動時に既知のリーダーへの接続を行うことで、再接続フローを構築できます。 1. リーダーに正常に接続したら、シリアル番号を [Shared Preferences API](https://developer.android.com/training/data-storage/shared-preferences) (Android) などの永続的なデータ格納場所に保存します。 1. アプリが起動したら、その永続的な格納場所に保存されているシリアル番号を確認します。確認できた場合は、`discoverReaders` メソッドを呼び出して、アプリケーションがそのリーダーを再度見つけられるようにします。 1. 保存されたシリアル番号が検出されたリーダーのいずれかと一致する場合は、`discoverReaders` の呼び出しから返された一致するリーダーオブジェクトを使用して、そのリーダーへの接続を試してください。以前に接続したリーダーが見つからない場合は、検出プロセスを停止します。 検出および接続プロセス中に何らかの UI を表示して、自動再接続が実行されていることを示します。 # インターネットリーダー > This is a インターネットリーダー for when terminal-sdk-platform is react-native and reader-type is internet. View the full page at https://docs.stripe.com/terminal/payments/connect-reader?terminal-sdk-platform=react-native&reader-type=internet. スマートリーダーは Stripe リーダーソフトウェアを実行し、インターネットを介して Stripe と直接通信します。アプリをスマートリーダーに接続するには、以下の 3 つのステップが必要です。 1. Stripe アカウントに[リーダーを登録](https://docs.stripe.com/terminal/payments/connect-reader.md#register-reader)します。 1. SDK を使い[リーダーを検出](https://docs.stripe.com/terminal/payments/connect-reader.md#discover-readers)します。 1. SDK を使い[リーダーに接続](https://docs.stripe.com/terminal/payments/connect-reader.md#connect-reader)します。 ## リーダーを登録する [サーバー側] アプリケーションをスマートリーダーに接続するには、事前にリーダーをアカウントに登録しておく必要があります。 #### ダッシュボード ### ダッシュボードで登録する リーダーは[ダッシュボード](https://dashboard.stripe.com/test/terminal)で直接追加できます。 #### 登録コードで登録する 1. [リーダー](https://dashboard.stripe.com/terminal/readers)ページで、**リーダーを登録する**をクリックします。 1. [スマートリーダー](https://docs.stripe.com/terminal/smart-readers.md)をお持ちの場合は、`0-7-1-3-9` の順にキーを入力すると固有の登録コードが表示されます。BBPOS WisePOS E または Stripe Reader S700/S710 を使用している場合は、[リーダーの設定](https://docs.stripe.com/terminal/payments/setup-reader/bbpos-wisepos-e.md#settings)に移動して、**Generate pairing code** をタップします。 1. 登録コードを入力して、**次へ**をクリックします。 1. 任意でリーダーの名前を選択します。 1. すでに店舗を作成している場合は、リーダーの新しい店舗を選択します。まだ作成していない場合は、**+ 新規追加**をクリックして店舗を作成します。 1. **登録する**をクリックしてリーダーの登録を完了します。 #### シリアル番号で登録する 1. [リーダー](https://dashboard.stripe.com/terminal/readers)ページで、**リーダーを登録する**をクリックします。 1. デバイスに記載されているシリアル番号を探し、そのシリアル番号を入力します。複数のデバイスを一度に登録するには、複数のシリアル番号をカンマで区切って入力します。 1. 任意でリーダーの名前を選択します。 1. すでに店舗を作成している場合は、リーダーの新しい店舗を選択します。まだ作成していない場合は、**+ 新規追加**をクリックして店舗を作成します。 1. **登録する**をクリックしてリーダーの登録を完了します。 #### ハードウェアの注文で登録する 1. [ハードウェアの注文](https://dashboard.stripe.com/terminal/hardware_orders)ページで、ステータスが「配送済み」または「配達済み」の注文を見つけます。行の最後にあるオーバーフローメニュー (⋯) をクリックし、次に**登録する**をクリックします。 1. **リーダーを登録する**ページで、ハードウェアの注文から登録するリーダーを 1 つ以上選択して、**登録する**をクリックします。 1. 任意でリーダーの名前を選択します。複数のリーダーを選択した場合、名前はプレフィックスとして機能し、Stripe はリーダーに順番に名前を付けます (たとえば、「テストリーダー」と入力した場合、リーダーには「テストリーダー 1」、「テストリーダー 2」のように名前が付けられます)。 1. すでに店舗を作成している場合は、リーダーの新しい店舗を選択します。まだ作成していない場合は、**+ 新規追加**をクリックして店舗を作成します。 1. **登録する**をクリックしてリーダーの登録を完了します。 #### API 大規模なデプロイでは、現場のユーザーがそれぞれ新しいリーダーを受け取って設定できるようにします。アプリで、Stripe API を使用してリーダーを[登録](https://docs.stripe.com/api/terminal/readers/create.md)するフローを構築します。 1. [スマートリーダー](https://docs.stripe.com/terminal/smart-readers.md)をお持ちの場合は、`0-7-1-3-9` の順にキーを入力すると固有の登録コードが表示されます。BBPOS WisePOS E または Stripe Reader S700/S710 を使用している場合は、[リーダーの設定](https://docs.stripe.com/terminal/payments/setup-reader/bbpos-wisepos-e.md#settings)に移動して、**Generate pairing code** をタップします。 1. ユーザーはアプリケーションにそのコードを入力します。 1. アプリケーションはそのコードを Stripe に送信します。 ```curl curl https://api.stripe.com/v1/terminal/readers \ -u "<>:" \ -d registration_code={{READER_REGISTRATION_CODE}} \ --data-urlencode "label=Alice's reader" \ -d "location={{TERMINALLOCATION_ID}}" ``` リーダーが正しく登録されたことを確認するには、その店舗で登録したリーダーをすべて一覧表示します。 #### curl ```bash curl https://api.stripe.com/v1/terminal/readers \ -u <>: ``` ## リーダーを検出する [クライアント側] - [discoverReaders (React Native)](https://stripe.dev/stripe-terminal-react-native/api-reference/interfaces/StripeTerminalSdkType.html#discoverReaders) アカウントにリーダーを登録したら、`discoverReaders` メソッドを使用してすでに登録されているリーダーを検索し、`discoveryMethod` を `internet` に設定して POS 申し込みに接続します。 前の手順でリーダーを登録した `location` を使用して、検索範囲を設定できます。 ```js export default function DiscoverScreen() { const { discoverReaders, discoveredReaders } = useStripeTerminal({ onUpdateDiscoveredReaders: (readers) => { // After the SDK discovers a reader, your app can connect to it. }, }); useEffect(() => { const fetchReaders = async () => { const { error } = await discoverReaders({ discoveryMethod: 'internet', }); } fetchReaders(); }, [discoverReaders]); return ; } ``` ## リーダーに接続する [クライアント側] > React Native SDK のバージョン `0.0.1-beta.29` では、[easyConnect](https://stripe.dev/stripe-terminal-react-native/api-reference/interfaces/StripeTerminalSdkType.html#easyconnect) メソッドを使用して、リーダーの検出と接続を 1 つの API コールに統合し、導入を簡素化できます。 POS 申し込みをリーダーに接続するには、選択したリーダーで `connectReader` を呼び出します。 ```js const { reader, error } = await connectReader({ discoveryMethod: 'internet', reader, }); if (error) { console.log('connectReader error:', error); return; } console.log('Reader connected successfully', reader); ``` - [connectReader (React Native)](https://stripe.dev/stripe-terminal-react-native/api-reference/interfaces/StripeTerminalSdkType.html#connectreader-1) ### 複数の接続 リーダーに一度に接続できるのは、1 つの Stripe Terminal SDK インスタンスのみです。デフォルトでは、別のアプリケーションから `connectReader` を呼び出すと、SDK からリーダーへの既存の接続が受信した接続に置き換えられ、接続されていた SDK はリーダーから切断されます。`connectReader` メソッドでは、`failIfInUse` プロパティを含む設定オブジェクトを使用します。このプロパティのデフォルト値は `false` です。アプリケーションで `failIfInUse` を true に設定すると、`connectReader` コールに代替の動作が適用されます。そのため、別の SDK によって開始された `collectPaymentMethod` コールまたは `confirmPaymentIntent` コールをリーダーが処理している間は、受信する接続が失敗します。リーダーが別の SDK に接続されているにもかかわらず待機状態である場合 (`collectPaymentMethod` が呼び出される前にスプラッシュスクリーンが表示されます)、`failIfInUse` を設定しても接続の動作は変更されず、受信する接続リクエストにより、SDK からリーダーへの既存の接続は常に切断されます。 ```js const { reader: connectedReader, error } = await connectReader({ discoveryMethod: 'internet', reader, failIfInUse: true, }); ``` | | failIfInUse は false (デフォルト) | failIfInUse は true | | ------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | | リーダーが待機状態の間、新しい SDK から `connectInternetReader` が呼び出されます。 | 既存の SDK からリーダーへの接続が切断され、新しい SDK がリーダーに接続します。以前に接続した SDK からの次のコマンドはリーダーエラーで失敗し、そのアプリの `onDidDisconnect` メソッドが呼び出されます。 | 既存の SDK からリーダーへの接続が切断され、新しい SDK がリーダーに接続します。以前に接続した SDK からの次のコマンドはリーダーエラーで失敗し、そのアプリの `onDidDisconnect` メソッドが呼び出されます。 | | リーダーが取引を処理している間、新しい SDK から `connectInternetReader` が呼び出されます。 | 既存の SDK からリーダーへの接続が切断され、新しい SDK がリーダーに接続します。以前に接続した SDK からの次のコマンドはリーダーエラーで失敗し、そのアプリの `onDidDisconnect` メソッドが呼び出されます。 | 受信する接続がリーダーのエラーで失敗します。SDK からリーダーへの既存の接続は切断されず、進行中のコマンドは続行されます。 | 複数リーダーがある環境で接続の中断を最小限に抑えるため、アプリケーションを初めて接続する際に `failIfInUse` を `true` に設定することをお勧めします。次に、接続が最初に失敗した場合に `failIfInUse` を `false` に設定してユーザーが接続を再試行できるようにします。 このように設定すると、ユーザーの 1 人が使用中のリーダーに誤って接続しても、取引の処理が中断されることはありません。必要に応じて接続することもできます。 ### 接続切断に対処する - [UserCallbacks (React Native)](https://stripe.dev/stripe-terminal-react-native/api-reference/index.html#UserCallbacks) アプリは、`onDidDisconnect`コールバックを実装し、リーダーが接続を解除したときに処理する必要があります。このコールバックを実装したら、ユーザーに接続を解除したリーダーを通知する UI を表示します。`discoverReaders`を呼び出してリーダーをスキャンし、再接続を開始することができます。 接続が切断されたリーダーへの再接続をアプリで自動的に試行したり、別のリーダーへの再接続を促す UI をユーザーに表示したりもできます。 リーダーでは、ネットワークへの接続が失われるとアプリとの接続が切断されることがあります。想定外の接続の切断をシミュレーションするには、リーダーの電源をオフにします。 ```js const terminal = useStripeTerminal({ onDidDisconnect: (result) => { // Consider displaying a UI to notify the user and start rediscovering readers }, }); ``` ### 自動再接続 Stripe Terminal は、アプリケーションの起動時にリーダーに自動的に再接続しません。代わりに、リーダー ID を保存し、起動時に既知のリーダーへの接続を行うことで、再接続フローを構築できます。 検出および接続プロセス中に何らかの UI を表示して、自動再接続が実行されていることを示します。 # インターネットリーダー > This is a インターネットリーダー for when terminal-sdk-platform is java and reader-type is internet. View the full page at https://docs.stripe.com/terminal/payments/connect-reader?terminal-sdk-platform=java&reader-type=internet. スマートリーダーは Stripe リーダーソフトウェアを実行し、インターネットを介して Stripe と直接通信します。アプリをスマートリーダーに接続するには、以下の 3 つのステップが必要です。 1. Stripe アカウントに[リーダーを登録](https://docs.stripe.com/terminal/payments/connect-reader.md#register-reader)します。 1. SDK を使い[リーダーを検出](https://docs.stripe.com/terminal/payments/connect-reader.md#discover-readers)します。 1. SDK を使い[リーダーに接続](https://docs.stripe.com/terminal/payments/connect-reader.md#connect-reader)します。 ## リーダーを登録する [サーバー側] アプリケーションをスマートリーダーに接続するには、事前にリーダーをアカウントに登録しておく必要があります。 #### ダッシュボード ### ダッシュボードで登録する リーダーは[ダッシュボード](https://dashboard.stripe.com/test/terminal)で直接追加できます。 #### 登録コードで登録する 1. [リーダー](https://dashboard.stripe.com/terminal/readers)ページで、**リーダーを登録する**をクリックします。 1. [スマートリーダー](https://docs.stripe.com/terminal/smart-readers.md)をお持ちの場合は、`0-7-1-3-9` の順にキーを入力すると固有の登録コードが表示されます。BBPOS WisePOS E または Stripe Reader S700/S710 を使用している場合は、[リーダーの設定](https://docs.stripe.com/terminal/payments/setup-reader/bbpos-wisepos-e.md#settings)に移動して、**Generate pairing code** をタップします。 1. 登録コードを入力して、**次へ**をクリックします。 1. 任意でリーダーの名前を選択します。 1. すでに店舗を作成している場合は、リーダーの新しい店舗を選択します。まだ作成していない場合は、**+ 新規追加**をクリックして店舗を作成します。 1. **登録する**をクリックしてリーダーの登録を完了します。 #### シリアル番号で登録する 1. [リーダー](https://dashboard.stripe.com/terminal/readers)ページで、**リーダーを登録する**をクリックします。 1. デバイスに記載されているシリアル番号を探し、そのシリアル番号を入力します。複数のデバイスを一度に登録するには、複数のシリアル番号をカンマで区切って入力します。 1. 任意でリーダーの名前を選択します。 1. すでに店舗を作成している場合は、リーダーの新しい店舗を選択します。まだ作成していない場合は、**+ 新規追加**をクリックして店舗を作成します。 1. **登録する**をクリックしてリーダーの登録を完了します。 #### ハードウェアの注文で登録する 1. [ハードウェアの注文](https://dashboard.stripe.com/terminal/hardware_orders)ページで、ステータスが「配送済み」または「配達済み」の注文を見つけます。行の最後にあるオーバーフローメニュー (⋯) をクリックし、次に**登録する**をクリックします。 1. **リーダーを登録する**ページで、ハードウェアの注文から登録するリーダーを 1 つ以上選択して、**登録する**をクリックします。 1. 任意でリーダーの名前を選択します。複数のリーダーを選択した場合、名前はプレフィックスとして機能し、Stripe はリーダーに順番に名前を付けます (たとえば、「テストリーダー」と入力した場合、リーダーには「テストリーダー 1」、「テストリーダー 2」のように名前が付けられます)。 1. すでに店舗を作成している場合は、リーダーの新しい店舗を選択します。まだ作成していない場合は、**+ 新規追加**をクリックして店舗を作成します。 1. **登録する**をクリックしてリーダーの登録を完了します。 #### API 大規模なデプロイでは、現場のユーザーがそれぞれ新しいリーダーを受け取って設定できるようにします。アプリで、Stripe API を使用してリーダーを[登録](https://docs.stripe.com/api/terminal/readers/create.md)するフローを構築します。 1. [スマートリーダー](https://docs.stripe.com/terminal/smart-readers.md)をお持ちの場合は、`0-7-1-3-9` の順にキーを入力すると固有の登録コードが表示されます。BBPOS WisePOS E または Stripe Reader S700/S710 を使用している場合は、[リーダーの設定](https://docs.stripe.com/terminal/payments/setup-reader/bbpos-wisepos-e.md#settings)に移動して、**Generate pairing code** をタップします。 1. ユーザーはアプリケーションにそのコードを入力します。 1. アプリケーションはそのコードを Stripe に送信します。 ```curl curl https://api.stripe.com/v1/terminal/readers \ -u "<>:" \ -d registration_code={{READER_REGISTRATION_CODE}} \ --data-urlencode "label=Alice's reader" \ -d "location={{TERMINALLOCATION_ID}}" ``` リーダーが正しく登録されたことを確認するには、その店舗で登録したリーダーをすべて一覧表示します。 #### curl ```bash curl https://api.stripe.com/v1/terminal/readers \ -u <>: ``` ## リーダーを検出する [クライアント側] - [discoverReaders (Java)](https://stripe.dev/stripe-terminal-java/core/com.stripe.stripeterminal/-terminal/discover-readers.html) - [InternetDiscoveryConfiguration (Java)](https://stripe.dev/stripe-terminal-java/external/com.stripe.stripeterminal.external.models/-discovery-configuration/-internet-discovery-configuration/index.html) アカウントにリーダーを登録したら、`InternetDiscoveryConfiguration` を使用してすでに登録されているリーダーを検索し、`discoverReaders` で POS 申し込みに接続します。 前の手順でリーダーを登録した `location` を使用して、検索範囲を設定できます。 ```java private Cancelable discoveryCancelable; public void onDiscoverReaders() { int timeout = 0; boolean isSimulated = false; InternetDiscoveryConfiguration config = new InternetDiscoveryConfiguration( timeout, ""{{LOCATION_ID}}"", isSimulated, DiscoveryFilter.None.INSTANCE ); // Save this cancelable to an instance variable discoveryCancelable = Terminal.getInstance().discoverReaders( config, readers -> { // Display the discovered readers to the user }, new Callback() { @Override public void onSuccess() { // Placeholder for handling successful operation } @Override public void onFailure(@NotNull TerminalException e) { // Placeholder for handling exception } } ); } ``` ## リーダーに接続する [クライアント側] > Java SDK のバージョン `1.0.0-b15` では、[easyConnect](https://stripe.dev/stripe-terminal-java/core/com.stripe.stripeterminal/-terminal/easy-connect.html) メソッドを使用して、リーダーの検出と接続を 1 つの API コールに統合し、実装を簡素化できます。 POS 申し込みをリーダーに接続するには、`InternetConnectionConfiguration` を使用して、選択したリーダーで `connectReader` を呼び出します。 ```java InternetReaderListener internetReaderListener = yourInternetReaderListener; InternetConnectionConfiguration config = new InternetConnectionConfiguration(internetReaderListener); Terminal.getInstance().connectReader( reader, config, new ReaderCallback() { @Override public void onSuccess(@NotNull Reader reader) { // Placeholder for handling successful operation } @Override public void onFailure(@NotNull TerminalException e) { // Placeholder for handling exception } } ); ``` - [connectReader (Java)](https://stripe.dev/stripe-terminal-java/core/com.stripe.stripeterminal/-terminal/connect-reader.html) - [InternetConnectionConfiguration (Java)](https://stripe.dev/stripe-terminal-java/external/com.stripe.stripeterminal.external.models/-connection-configuration/-internet-connection-configuration/index.html) ### 複数の接続 リーダーに一度に接続できるのは、1 つの Stripe Terminal SDK インスタンスのみです。デフォルトでは、別のアプリケーションから `connectReader` を呼び出すと、SDK からリーダーへの既存の接続が受信した接続に置き換えられ、接続されていた SDK はリーダーから切断されます。`connectReader` メソッドでは、`failIfInUse` プロパティを含む設定オブジェクトを使用します。このプロパティのデフォルト値は `false` です。アプリケーションで `failIfInUse` を true に設定すると、`connectReader` コールに代替の動作が適用されます。そのため、別の SDK によって開始された `collectPaymentMethod` コールまたは `confirmPaymentIntent` コールをリーダーが処理している間は、受信する接続が失敗します。リーダーが別の SDK に接続されているにもかかわらず待機状態である場合 (`collectPaymentMethod` が呼び出される前にスプラッシュスクリーンが表示されます)、`failIfInUse` を設定しても接続の動作は変更されず、受信する接続リクエストにより、SDK からリーダーへの既存の接続は常に切断されます。 ```java boolean failIfInUse = true; InternetReaderListener internetReaderListener = yourInternetReaderListener; InternetConnectionConfiguration config = new InternetConnectionConfiguration(internetReaderListener, failIfInUse); Terminal.getInstance().connectReader( reader, config, new ReaderCallback() { @Override public void onSuccess(@NotNull Reader reader) { // Placeholder for handling successful operation } @Override public void onFailure(@NotNull TerminalException e) { // Placeholder for handling exception } } ); ``` | | failIfInUse は false (デフォルト) | failIfInUse は true | | ---------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | | リーダーが待機状態の間、新しい SDK から `connectReader` が呼び出されます。 | 既存の SDK からリーダーへの接続が切断され、新しい SDK がリーダーに接続します。以前に接続した SDK からの次のコマンドはリーダーエラーで失敗し、そのアプリの `onDisconnect` メソッドが呼び出されます。 | 既存の SDK からリーダーへの接続が切断され、新しい SDK がリーダーに接続します。以前に接続した SDK からの次のコマンドはリーダーエラーで失敗し、そのアプリの `onDisconnect` メソッドが呼び出されます。 | | リーダーが取引を処理している間、新しい SDK から `connectReader` が呼び出されます。 | 既存の SDK からリーダーへの接続が切断され、新しい SDK がリーダーに接続します。以前に接続した SDK からの次のコマンドはリーダーエラーで失敗し、そのアプリの `onDisconnect` メソッドが呼び出されます。 | 受信する接続がリーダーのエラーで失敗します。SDK からリーダーへの既存の接続は切断されず、進行中のコマンドは続行されます。 | 複数リーダーがある環境で接続の中断を最小限に抑えるため、アプリケーションを初めて接続する際に `failIfInUse` を `true` に設定することをお勧めします。次に、接続が最初に失敗した場合に `failIfInUse` を `false` に設定してユーザーが接続を再試行できるようにします。 このように設定すると、ユーザーの 1 人が使用中のリーダーに誤って接続しても、取引の処理が中断されることはありません。必要に応じて接続することもできます。 ### 接続切断に対処する - [onDisconnect (Java)](https://stripe.dev/stripe-terminal-java/external/com.stripe.stripeterminal.external.callable/-reader-disconnect-listener/on-disconnect.html) リーダーの接続の切断に備え、アプリに `onDisconnect` コールバックを実装します。このコールバックを実装する際は、リーダーの接続が切断されることを知らせる UI を表示するようにしてください。`discoverReaders` を呼び出してリーダーをスキャンすると、再接続が開始されます。 接続が切断されたリーダーへの再接続をアプリで自動的に試行したり、別のリーダーへの再接続を促す UI をユーザーに表示したりもできます。 リーダーでは、ネットワークへの接続が失われるとアプリとの接続が切断されることがあります。想定外の接続の切断をシミュレーションするには、リーダーの電源をオフにします。 ```java public class CustomReaderListener implements InternetReaderListener { // ... @Override public void onDisconnect(@NotNull DisconnectReason reason) { // Consider displaying a UI to notify the user and start rediscovering readers } // ... } ``` ### 自動再接続 Stripe Terminal は、アプリケーションの起動時にリーダーに自動的に再接続しません。代わりに、リーダー ID を保存し、起動時に既知のリーダーへの接続を行うことで、再接続フローを構築できます。 1. リーダーに正常に接続したら、シリアル番号を [Preferences API](https://docs.oracle.com/javase/8/docs/api/java/util/prefs/Preferences.html) などの永続的なデータ格納場所に保存します。 1. アプリが起動したら、その永続的な格納場所に保存されているシリアル番号を確認します。確認できた場合は、`discoverReaders` メソッドを呼び出して、アプリケーションがそのリーダーを再度見つけられるようにします。 1. 保存されたシリアル番号が検出されたリーダーのいずれかと一致する場合は、`discoverReaders` の呼び出しから返された一致するリーダーオブジェクトを使用して、そのリーダーへの接続を試してください。以前に接続したリーダーが見つからない場合は、検出プロセスを停止します。 検出および接続プロセス中に何らかの UI を表示して、自動再接続が実行されていることを示します。 # インターネットリーダー > This is a インターネットリーダー for when terminal-sdk-platform is dotnet and reader-type is internet. View the full page at https://docs.stripe.com/terminal/payments/connect-reader?terminal-sdk-platform=dotnet&reader-type=internet. スマートリーダーは Stripe リーダーソフトウェアを実行し、インターネットを介して Stripe と直接通信します。アプリをスマートリーダーに接続するには、以下の 3 つのステップが必要です。 1. Stripe アカウントに[リーダーを登録](https://docs.stripe.com/terminal/payments/connect-reader.md#register-reader)します。 1. SDK を使い[リーダーを検出](https://docs.stripe.com/terminal/payments/connect-reader.md#discover-readers)します。 1. SDK を使い[リーダーに接続](https://docs.stripe.com/terminal/payments/connect-reader.md#connect-reader)します。 ## リーダーを登録する [サーバー側] アプリケーションをスマートリーダーに接続するには、事前にリーダーをアカウントに登録しておく必要があります。 #### ダッシュボード ### ダッシュボードで登録する リーダーは[ダッシュボード](https://dashboard.stripe.com/test/terminal)で直接追加できます。 #### 登録コードで登録する 1. [リーダー](https://dashboard.stripe.com/terminal/readers)ページで、**リーダーを登録する**をクリックします。 1. [スマートリーダー](https://docs.stripe.com/terminal/smart-readers.md)をお持ちの場合は、`0-7-1-3-9` の順にキーを入力すると固有の登録コードが表示されます。BBPOS WisePOS E または Stripe Reader S700/S710 を使用している場合は、[リーダーの設定](https://docs.stripe.com/terminal/payments/setup-reader/bbpos-wisepos-e.md#settings)に移動して、**Generate pairing code** をタップします。 1. 登録コードを入力して、**次へ**をクリックします。 1. 任意でリーダーの名前を選択します。 1. すでに店舗を作成している場合は、リーダーの新しい店舗を選択します。まだ作成していない場合は、**+ 新規追加**をクリックして店舗を作成します。 1. **登録する**をクリックしてリーダーの登録を完了します。 #### シリアル番号で登録する 1. [リーダー](https://dashboard.stripe.com/terminal/readers)ページで、**リーダーを登録する**をクリックします。 1. デバイスに記載されているシリアル番号を探し、そのシリアル番号を入力します。複数のデバイスを一度に登録するには、複数のシリアル番号をカンマで区切って入力します。 1. 任意でリーダーの名前を選択します。 1. すでに店舗を作成している場合は、リーダーの新しい店舗を選択します。まだ作成していない場合は、**+ 新規追加**をクリックして店舗を作成します。 1. **登録する**をクリックしてリーダーの登録を完了します。 #### ハードウェアの注文で登録する 1. [ハードウェアの注文](https://dashboard.stripe.com/terminal/hardware_orders)ページで、ステータスが「配送済み」または「配達済み」の注文を見つけます。行の最後にあるオーバーフローメニュー (⋯) をクリックし、次に**登録する**をクリックします。 1. **リーダーを登録する**ページで、ハードウェアの注文から登録するリーダーを 1 つ以上選択して、**登録する**をクリックします。 1. 任意でリーダーの名前を選択します。複数のリーダーを選択した場合、名前はプレフィックスとして機能し、Stripe はリーダーに順番に名前を付けます (たとえば、「テストリーダー」と入力した場合、リーダーには「テストリーダー 1」、「テストリーダー 2」のように名前が付けられます)。 1. すでに店舗を作成している場合は、リーダーの新しい店舗を選択します。まだ作成していない場合は、**+ 新規追加**をクリックして店舗を作成します。 1. **登録する**をクリックしてリーダーの登録を完了します。 #### API 大規模なデプロイでは、現場のユーザーがそれぞれ新しいリーダーを受け取って設定できるようにします。アプリで、Stripe API を使用してリーダーを[登録](https://docs.stripe.com/api/terminal/readers/create.md)するフローを構築します。 1. [スマートリーダー](https://docs.stripe.com/terminal/smart-readers.md)をお持ちの場合は、`0-7-1-3-9` の順にキーを入力すると固有の登録コードが表示されます。BBPOS WisePOS E または Stripe Reader S700/S710 を使用している場合は、[リーダーの設定](https://docs.stripe.com/terminal/payments/setup-reader/bbpos-wisepos-e.md#settings)に移動して、**Generate pairing code** をタップします。 1. ユーザーはアプリケーションにそのコードを入力します。 1. アプリケーションはそのコードを Stripe に送信します。 ```curl curl https://api.stripe.com/v1/terminal/readers \ -u "<>:" \ -d registration_code={{READER_REGISTRATION_CODE}} \ --data-urlencode "label=Alice's reader" \ -d "location={{TERMINALLOCATION_ID}}" ``` リーダーが正しく登録されたことを確認するには、その店舗で登録したリーダーをすべて一覧表示します。 #### curl ```bash curl https://api.stripe.com/v1/terminal/readers \ -u <>: ``` ## リーダーを検出する [クライアント側] - [DiscoverReadersAsync (.NET)](https://docs.stripe.com/terminal/payments/connect-reader.md#TODO-DOTNET-FIXME) アカウントにリーダーを登録したら、`DiscoverReadersAsync` メソッドを使用してすでに登録されているリーダーを検索し、POS 申し込みに接続します。 前の手順でリーダーを登録した `location` を使用して、検索範囲を設定できます。 ```csharp public async Task> DiscoverReadersAsync() { try { var config = new DiscoveryConfiguration.Builder() .SetIsSimulated(false) .SetLocation("{{LOCATION_ID}}") .Build(); Console.WriteLine("Discovered readers"); return await Terminal.Instance.DiscoverReadersAsync(config); } catch (TerminalException ex) { // Placeholder for handling exception throw; } } ``` ## リーダーに接続する [クライアント側] POS アプリケーションをリーダーに接続するには、選択したリーダーで `ConnectInternetReaderAsync` を呼び出します。 ```csharp // after selecting a reader to connect to Reader connectedReader; try { var config = new InternetConnectionConfiguration.Builder() .Build(); connectedReader = await Terminal.Instance.ConnectInternetReaderAsync(selectedReader, config); Console.WriteLine("Connected to reader"); } catch (TerminalException ex) { // Placeholder for handling exception throw; } ``` - [ConnectInternetReaderAsync (.NET)](https://docs.stripe.com/terminal/payments/connect-reader.md#TODO-DOTNET-FIXME) ### 複数の接続 リーダーに一度に接続できるのは、1 つの Stripe Terminal SDK インスタンスのみです。デフォルトでは、別のアプリケーションから `ConnectInternetReaderAsync` を呼び出すと、SDK からリーダーへの既存の接続は受信した接続により置き換えられ、接続されていた SDK はリーダーから切断されます。`ConnectInternetReaderAsync` メソッドは、`failIfInUse` プロパティを含む設定オブジェクトを使用します。このプロパティのデフォルト値は `false` です。アプリケーションで `failIfInUse` を true に設定すると、`ConnectInternetReaderAsync` コールに代替の動作が適用されます。そのためリーダーが、別の SDK によって開始された `CollectPaymentMethodAsync` コールまたは `ConfirmPaymentIntentAsymc` コールを処理中の場合は、受信する接続が失敗します。リーダーが別の SDK に接続されていても待機状態である場合 (`CollectPaymentMethodAsync` が呼び出される前にスプラッシュスクリーンが表示される)、`failIfInUse` を設定しても接続の動作は変更されず、受信する接続リクエストにより、SDK からリーダーへの既存の接続は常に切断されます。 ```csharp // after selecting a reader to connect to Reader connectedReader; try { var config = new InternetConnectionConfiguration.Builder() .SetFailIfInUse(true) .Build(); connectedReader = await Terminal.Instance.ConnectInternetReaderAsync(selectedReader, config); Console.WriteLine("Connected to reader"); } catch (TerminalException ex) { // Placeholder for handling exception throw; } ``` | | FailIfInUse は false (デフォルト) | FailIfInUse は true | | ----------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | | リーダーが待機状態の間、新しい SDK から `ConnectInternetReaderAsync` が呼び出されます。 | 既存の SDK からリーダーへの接続が切断され、新しい SDK がリーダーに接続します。以前に接続した SDK からの次のコマンドはリーダーエラーで失敗し、そのアプリの `OnUnexpectedReaderDisconnect` メソッドが呼び出されます。 | 既存の SDK からリーダーへの接続が切断され、新しい SDK がリーダーに接続します。以前に接続した SDK からの次のコマンドはリーダーエラーで失敗し、そのアプリの `OnUnexpectedReaderDisconnect` メソッドが呼び出されます。 | | リーダーが取引を処理している間、新しい SDK から `ConnectInternetReaderAsync` が呼び出されます。 | 既存の SDK からリーダーへの接続が切断され、新しい SDK がリーダーに接続します。以前に接続した SDK からの次のコマンドはリーダーエラーで失敗し、そのアプリの `OnUnexpectedReaderDisconnect` メソッドが呼び出されます。 | 受信する接続がリーダーのエラーで失敗します。SDK からリーダーへの既存の接続は切断されず、進行中のコマンドは続行されます。 | 複数リーダーがある環境で接続の中断を最小限に抑えるため、アプリケーションを初めて接続する際に `failIfInUse` を `true` に設定することをお勧めします。次に、接続が最初に失敗した場合に `failIfInUse` を `false` に設定してユーザーが接続を再試行できるようにします。 このように設定すると、ユーザーの 1 人が使用中のリーダーに誤って接続しても、取引の処理が中断されることはありません。必要に応じて接続することもできます。 ### 接続切断に対処する - [TerminalListener (.NET)](https://docs.stripe.com/terminal/payments/connect-reader.md#TODO-DOTNET-FIXME) リーダーの接続が切れた場合に対処できるように、お客様のアプリに `OnUnexpectedReaderDisconnect` コールバックを実装する必要があります。このコールバックを実装する場合は、リーダーの接続が切れたことをユーザーに知らせる UI を表示します。`DiscoverReadersAsync` を呼び出してリーダーをスキャンし、再接続を開始できます。 接続が切断されたリーダーへの再接続をアプリで自動的に試行したり、別のリーダーへの再接続を促す UI をユーザーに表示したりもできます。 リーダーでは、ネットワークへの接続が失われるとアプリとの接続が切断されることがあります。想定外の接続の切断をシミュレーションするには、リーダーの電源をオフにします。 ```csharp public class TerminalListener : ITerminalListener { // ... Terminal.InitTerminal( connectionTokenProvider: connectionTokenProvider, terminalListener: this, offlineListener: offlineListener, applicationInformation: applicationInformation ); // ITerminalListener public void OnUnexpectedReaderDisconnect(Reader reader) { // Consider displaying a UI to notify the user and start rediscovering readers } } ``` ### 自動再接続 Stripe Terminal は、アプリケーションの起動時にリーダーに自動的に再接続しません。代わりに、リーダー ID を保存し、起動時に既知のリーダーへの接続を行うことで、再接続フローを構築できます。 検出および接続プロセス中に何らかの UI を表示して、自動再接続が実行されていることを示します。 # iPhone のタッチ決済 > This is a iPhone のタッチ決済 for when terminal-sdk-platform is ios and reader-type is tap-to-pay. View the full page at https://docs.stripe.com/terminal/payments/connect-reader?terminal-sdk-platform=ios&reader-type=tap-to-pay. iPhone のタッチ決済を使用すると、ユーザーは、[互換性のある iPhone](https://docs.stripe.com/terminal/payments/setup-reader/tap-to-pay.md?platform=ios#supported-devices) と [Stripe Terminal SDK](https://docs.stripe.com/terminal/payments/setup-integration.md?terminal-sdk-platform=ios) で対面の非接触型決済を受け付けることができます。iPhone のタッチ決済は、Visa、Mastercard、アメリカン・エキスプレス、ディスカバーの非接触型カードと、NFC ベースのモバイルウォレット (Apple Pay、Google Pay、Samsung Pay) に対応しています。iPhone のタッチ決済は、Terminal iOS SDK に含まれていて、iOS モバイルアプリで直接決済を有効にします。 ## リーダーを検出する - [discoverReaders (iOS)](https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPTerminal.html#/c:objc\(cs\)SCPTerminal\(im\)discoverReaders:delegate:completion:) - [TapToPayDiscoveryConfiguration (iOS)](https://stripe.dev/stripe-terminal-ios/docs/Reader%20Discovery%20%26%20Connection.html#/c:objc\(cs\)SCPTapToPayDiscoveryConfiguration) [discoverReaders](https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPTerminal.html#/c:objc\(cs\)SCPTerminal\(im\)discoverReaders:delegate:completion:) メソッドを使用して、ご利用の iPhone がタッチ決済に対応しているかどうかを判定します。 `completion` ハンドラは、アプリケーションが[サポートされているデバイスの条件](https://docs.stripe.com/terminal/payments/setup-reader/tap-to-pay.md?platform=ios#supported-devices)を満たしていないデバイスで実行されている場合、エラーで呼び出されます。 #### Swift ```swift import StripeTerminal class DiscoverReadersViewController: UIViewController, DiscoveryDelegate { var discoverCancelable: Cancelable? // ... // Action for a "Discover Readers" button func discoverReadersAction() throws { let config = try TapToPayDiscoveryConfigurationBuilder().build() // In addition to Terminal's completion block methods, Swift async alternatives are available. // See our Example app for usage examples: https://github.com/stripe/stripe-terminal-ios/tree/master/Example self.discoverCancelable = Terminal.shared.discoverReaders(config, delegate: self) { error in if let error = error { print("discoverReaders failed: \(error)") } else { print("discoverReaders succeeded") } } } // ... // MARK: DiscoveryDelegate func terminal(_ terminal: Terminal, didUpdateDiscoveredReaders readers: [Reader]) { // In your app, display the ability to use your phone as a reader // Call `connectReader` to initiate a session with the phone } } ``` ## リーダーに接続する > iOS SDK のバージョン `5.1.0` では、`easyConnect` メソッドを使用して、リーダーの検出と接続を 1 つの API コールに統合し、実装を簡素化できます。詳細については、[SDK 移行ガイド](https://docs.stripe.com/terminal/references/sdk-migration-guide.md#update-your-reader-connection-usage-ios)を参照してください。 - [connectReader (iOS)](https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPTerminal.html#/c:objc\(cs\)SCPTerminal\(im\)connectReader:connectionConfig:completion:) - [TapToPayConnectionConfiguration (iOS)](https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPTapToPayConnectionConfiguration.html) iPhone のタッチ決済での決済受け付けを開始するには、検出されたリーダーを `connectReader` メソッドに指定します。また、リーダーに必要になる可能性がある更新を処理するために、[デリゲートを作成](https://docs.stripe.com/terminal/payments/connect-reader.md#device-setup)する必要があります。 接続時に[店舗](https://docs.stripe.com/api/terminal/locations.md)に[リーダーを登録](https://docs.stripe.com/terminal/fleet/locations-and-zones.md)する必要があります。これを行うには、接続時に`店舗 ID` を関連する店舗 ID に設定し`た SCPTapToPayConnectionConfiguration` を作成して使用します。 店舗を作成する際は、ビジネス名を表す `display_name` を設定してください。リーダーへの接続時にビジネス名を明示的に指定しない限り、デバイスのタップ画面にはその店舗の `display_name` が顧客に対して表示されます。必要に応じて既存の店舗を編集し、このテキストを調整することも可能です。 [on_behalf_of を使用してデスティネーション支払い](https://docs.stripe.com/terminal/features/connect.md#destination-payment-intents) を行う場合、`SCPTapToPayConnectionConfiguration` に連結アカウント ID を入力する必要があります。 #### Swift ```swift // Call `connectReader` with the selected reader and a connection config // to register to a location as set by your app. let connectionConfig = try TapToPayConnectionConfigurationBuilder.init(locationId: ""{{LOCATION_ID}}"") .delegate(yourTapToPayReaderDelegate) .build() 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)") } } ``` ### デバイスの設定を処理する 互換性のある iPhone のタッチ決済リーダーに接続するとき、設定の更新が必要になる場合があり、そのために数分かかることがあります。加盟店の待ち時間を短縮するために、前もってバックグラウンドでリーダーを接続しておくことをお勧めします。 設定手順を処理し、ビジネスに待機を求めるメッセージを表示させるために、`SCPTapToPayReaderDelegate` をアプリケーションに実装してください。設定手順はソフトウェア更新として表示されるため、ビジネスは進捗の通知を適宜受け取ることができます。 #### Swift ```swift class APPReaderViewController: TapToPayReaderDelegate { // MARK: TapToPayReaderDelegate // ... func tapToPayReader(_ reader: Reader, didStartInstallingUpdate update: ReaderSoftwareUpdate, cancelable: Cancelable?) { // In your app, let the user know that an update is being installed on the reader } func tapToPayReader(_ reader: Reader, didReportReaderSoftwareUpdateProgress progress: Float) { // The update or configuration process has reached the specified progress (0.0 to 1.0) // If you are displaying a progress bar or percentage, this can be updated here } func tapToPayReader(_ reader: Reader, didFinishInstallingUpdate update: ReaderSoftwareUpdate?, error: Error?) { // The reader has finished installing an update // If `error` is nil, it is safe to proceed and start collecting payments // Otherwise, check the value of `error` for more information on what went wrong } func tapToPayReader(_ reader: Reader, didRequestReaderDisplayMesage displayMessage: ReaderDisplayMessage) { // This is called to request that a prompt be displayed in your app. // Use Terminal.stringFromReaderDisplayMessage(:) to get a user-facing string for the prompt } func tapToPayReader(_ reader: Reader, didRequestReaderInput inputOptions: ReaderInputOptions = []) { // This is called when the reader begins waiting for input // Use Terminal.stringFromReaderInputOptions(:) to get a user-facing string for the input options } // ... } ``` ### 口座の関連付けおよび Apple 利用規約 すべてのユーザーは、初めて支払いを受け付ける前に、Apple の iPhone のタッチ決済規約に同意する必要があります。連結するユーザーの場合、以下の場合に各連結アカウントが個別に規約に同意する必要があります。 - Connect ユーザーがダイレクト支払いを作成する - Connect ユーザーがデスティネーション支払いを作成し、`on_behalf_of` アカウントを指定する Users can accept Apple’s Tap to Pay on iPhone Terms and Conditions on the web before connecting to the reader for the first time using [onboarding links](https://docs.stripe.com/api/terminal/onboarding-link.md). Alternatively, users will be presented with Apple’s Tap to Pay on iPhone Terms and Conditions the first time they connect to the reader within a mobile application. To accept Apple’s Terms and Conditions, the user must provide a valid Apple ID representing the business. After users accept Apple’s Tap to Pay on iPhone Terms and Conditions, they aren’t prompted again on subsequent connections using the same Stripe account, including on other mobile devices. ![Apple ID のサインイン、規約への同意、iPhone のタッチ決済の成功確認を示す 3 ステップのプロセス](https://b.stripecdn.com/docs-statics-srv/assets/ttpoi-account-linking-steps.56bc5c0bb037a98f788a7e8d43d0c87e.png) Tap to Pay を受け付けるには、Apple ID アカウントをリンクしてください。 iPhone のタッチ決済で `connectReader` メソッドを呼び出すと、どの iPhone でも 24 時間以内にアプリ間で最大 3 つの Stripe アカウントを使用できます。同じ 24 時間以内に同一デバイスで別のアカウントが使用された場合、`connectReader` メソッドが[SCPErrorTapToPayReaderMerchantBlocked](https://stripe.dev/stripe-terminal-ios/docs/Enums/SCPError.html#/c:@E@SCPError@SCPErrorTapToPayReaderMerchantBlocked)エラーを生成します。 口座の関連付けについて、詳細は [Apple iPhone のタッチ決済 FAQ](https://register.apple.com/tap-to-pay-on-iphone/faq.html) の「iPhoneのタッチ決済のビジネス情報」セクションをご覧ください。 ## 接続切断に対処する アプリケーションがバックグラウンドになるか、iPhone のインターネット接続が失われると、リーダーは切断されます。これを処理する方法は 2 つあります。 - [TapToPayReaderDelegate (iOS)](https://stripe.dev/stripe-terminal-ios/docs/Protocols/SCPTapToPayReaderDelegate.html) #### 切断を手動で処理する この切断に対処するには、アプリケーションで [SCPTapToPayReaderDelegate reader:didDisconnect:](https://stripe.dev/stripe-terminal-ios/docs/Protocols/SCPReaderDelegate.html#/c:objc\(pl\)SCPReaderDelegate\(im\)reader:didDisconnect:) デリゲートメソッドを実装する必要があります。このコールバックをトリガーとして利用することで、問題の発生およびインターネット接続による続行の要求をユーザーに通知できます。また、アプリケーションが再びフォアグラウンドになった場合は、リーダーに手動で再接続することもできます。 #### Swift ```swift import StripeTerminal class ReaderViewController: UIViewController, TapToPayReaderDelegate { override func viewDidLoad() { super.viewDidLoad() // Set the reader delegate when connecting to a reader } // ... func reader(_ reader: Reader, didDisconnect reason: DisconnectReason) { // Consider displaying a UI to notify the user and start rediscovering readers } } ``` #### 自動的に再接続を試行する `SCPTapToPayReaderDelegate` に自動再接続メソッドを実装します。その後、`SCPTapToPayReaderDelegate` を `SCPTapToPayConnectionConfiguration` に渡す必要があります。 #### Swift ```swift let connectionConfig = try TapToPayConnectionConfigurationBuilder(locationId: locationId) .delegate(yourTapToPayReaderDelegate) .build() Terminal.shared.connectReader( reader, connectionConfig: connectionConfig, completion: connectCompletion ) ``` 自動的に再接続を試行すると、以下が発生します。 1. 切断が発生すると、SDK は自動的に再接続しようとし、`onReaderReconnectStarted` を介して通知します。接続が切れて、再接続が進行中であることを必ずアプリで知らせてください。 - `Cancelable` オブジェクトを使用して、いつでも再接続の試行を停止できます。 1. SDK でリーダーへの再接続が成功すると、`onReaderReconnectSucceeded` を介して通知されます。接続が復元され、通常の動作が続行することを、必ずアプリで知らせてください。 1. SDK がリーダーに接続できない場合は、`onReaderReconnectFailed` と `reader:didDisconnect:` の両方を介して通知されます。予期しない切断の発生をアプリが通知できるようにしてください。 #### Swift ```swift import StripeTerminal extension ReaderViewController: TapToPayReaderDelegate { // MARK: ReconnectionDelegate func reader(_ reader: Reader, didStartReaderReconnect cancelable: Cancelable) { // 1. Notified at the start of a reconnection attempt // Use cancelable to stop reconnection at any time } func readerDidSucceedReaderReconnect(_ reader: Reader) { // 2. Notified when reader reconnection succeeds // App is now connected } func readerDidFailReaderReconnect(_ reader: Reader) { // 3. Notified when reader reconnection fails // App is now disconnected } } ``` # Android のタッチ決済 > This is a Android のタッチ決済 for when terminal-sdk-platform is android and reader-type is tap-to-pay. View the full page at https://docs.stripe.com/terminal/payments/connect-reader?terminal-sdk-platform=android&reader-type=tap-to-pay. Androidのタッチ決済 (TTPA) を使用すると、ユーザーは[互換性のある NFC 対応 Android デバイス](https://docs.stripe.com/terminal/payments/setup-reader/tap-to-pay.md?platform=android#supported-devices)で対面の非接触型決済を受け付けることができます。TTPA には最新バージョンの [Terminal Android SDK](https://stripe.dev/stripe-terminal-android/) が必要です。TTPA は、Visa、Mastercard、アメリカン・エキスプレスの非接触カードと NFC ベースのモバイルウォレット (Apple Pay、Google Pay、Samsung Pay) に対応しています。TTPA は Terminal Android SDK の拡張であり、Android アプリで直接決済を可能にします。 サポートされる Android デバイスでアプリをタッチ決済リーダーに接続するには、次のステップを実行します。 1. TTPA の [SDK を初期化](https://docs.stripe.com/terminal/payments/connect-reader.md#initialize)します。 1. SDK を使用して[リーダーを検出](https://docs.stripe.com/terminal/payments/connect-reader.md#discover-readers)し、デバイスの互換性を確認します。 1. SDK を使用して[リーダーに接続](https://docs.stripe.com/terminal/payments/connect-reader.md#connect-reader)し、決済を受け付けます。 1. [予期しない切断に対処](https://docs.stripe.com/terminal/payments/connect-reader.md#handling-disconnects)して、リーダーが予期せず切断した場合にもユーザーが引き続き決済を受け付けられるようにします。 [サポートされるデバイスの条件](https://docs.stripe.com/terminal/payments/setup-reader/tap-to-pay.md?platform=android#supported-devices)を満たさないデバイス上で実行されているアプリケーションの場合、SDK は追加のコンテキストを提供する `TerminalException` を `onFailure` コールバックで返します。 ## SDK を初期化する - [タッチ決済 (Android)](https://stripe.dev/stripe-terminal-android/cots/com.stripe.stripeterminal.taptopay/-tap-to-pay/-companion/is-in-tap-to-pay-process.html) TTPA は、取引の安全性を高めるために専用のプロセスで運営されています。このプロセスでは、`Application` の 2 つ目のインスタンスが作成されます。`TapToPay.isInTapToPayProcess()` を調べ、このプロセスの `Application` の初期化をスキップすることで、コードの実行により発生する予期せぬエラーを避けられます。 ```kotlin // Substitute with your application name, and remember to keep it the same as your AndroidManifest.xml class StripeTerminalApplication : Application() { override fun onCreate() { super.onCreate() // Skip initialization if running in the TTPA process. if (TapToPay.isInTapToPayProcess()) return // For example, this will be skipped. TerminalApplicationDelegate.onCreate(this) } } ``` ## リーダーを検出する - [discoverReaders (Android)](https://stripe.dev/stripe-terminal-android/core/com.stripe.stripeterminal/-terminal/discover-readers.html) - [TapToPayDiscoveryConfiguration (Android)](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-discovery-configuration/-tap-to-pay-discovery-configuration/index.html) `discoverReaders` メソッドを使用して、Android デバイスの Tap to Pay 向けのハードウェアサポートを特定します。`discoverReaders` は Android デバイスの以下の要件を確認します。 - 正常に機能し、統合された NFC センサーと ARM ベースのプロセッサがある - Android 13 以降を実行している - ECDH のハードウェアサポート付きのキーストアがある ([`FEATURE_HARDWARE_KEYSTORE`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_HARDWARE_KEYSTORE) のバージョンは 100 以降である必要があります) - シミュレーションされていないバージョンのタッチ決済リーダーの場合、アプリケーションがデバッグ可能ではない。 タッチ決済リーダーサービスの開始に成功するには、アプリケーションがフォアグラウンドにある「必要があります」。 デバイスで実行されているアプリケーションが上記の要件を満たさない場合、[TerminalErrorCode](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-terminal-error-code/index.html) と追加のコンテキストを含む `TerminalException` で、`onFailure` コールバックが返されます。この段階での失敗に対して、エンドユーザーは対応できません。 シミュレーションされていない本番バージョンの Tap to Pay リーダーは、デバッグ可能なアプリケーションや、デバイスの開発者オプションを有効にした状態では使用できません。Android の Tap to Pay リーダーでの統合をテストするには、リーダーの検出時に `TapToPayDiscoveryConfiguration.isSimulated` を `true` に設定します。リリースバージョンのアプリケーションでは、この値を `false` に設定する必要があります。 #### Kotlin ```kotlin var discoverCancelable: Cancelable? = null fun onDiscoverReaders() { val isApplicationDebuggable = 0 != applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE val config = TapToPayDiscoveryConfiguration(isSimulated = isApplicationDebuggable) // Save this cancelable to an instance variable discoverCancelable = Terminal.getInstance().discoverReaders( config, object : DiscoveryListener { override fun onUpdateDiscoveredReaders(readers: List) { // Automatically connect to supported mobile readers } }, object : Callback { override fun onSuccess() { // Placeholder for handling successful operation } override fun onFailure(e: TerminalException) { // Placeholder for handling exception } } ) } override fun onStop() { super.onStop() // If you're leaving the activity or fragment without selecting a reader, // make sure you cancel the discovery process or the SDK will be stuck in // a discover readers phase discoverCancelable?.cancel( object : Callback { override fun onSuccess() { // Placeholder for handling successful operation } override fun onFailure(e: TerminalException) { // Placeholder for handling exception } } ) } ``` 実行時にデバイスがタッチ決済のハードウェアと OS の要件を満たしているかどうかを確認するには、[端末.supportsReadersOfType](https://stripe.dev/stripe-terminal-android/core/com.stripe.stripeterminal/-terminal/supports-readers-of-type.html) 関数を使用します。この関数では、端末 SDK の初期化の一環として、店舗と Bluetooth にアクセスするための権限リクエストを、エンドユーザーが承認する必要があります。この関数は、ほとんどのデバイスで、実行に約 10 ミリ秒かかります。 ## リーダーに接続する > Android SDK のバージョン `5.0.0` では、`easyConnect` メソッドを使用して、リーダーの検出と接続を 1 つの API コールに統合し、統合を簡素化できます。詳細については、[SDK 移行ガイド](https://docs.stripe.com/terminal/references/sdk-migration-guide.md#update-your-reader-connection-usage)を参照してください。 - [connectReader (Android)](https://stripe.dev/stripe-terminal-android/core/com.stripe.stripeterminal/-terminal/connect-reader.html) - [TapToPayConnectionConfiguration (Android)](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-connection-configuration/-tap-to-pay-connection-configuration/index.html) Tap to Pay で決済を受け付けるには、前のステップで検出されたリーダーを `connectReader` メソッドに指定します。 `connectReader` は、Android デバイスが次の要件を満たしていることを確認します。 - ルート化されておらず、デバイスのブートローダーがロックされ変更されていない - 過去 12 カ月以内にセキュリティアップデートがインストールされている - Google Mobile Services を使用しており、Google Play Store アプリがインストールされている - インターネットへの安定した接続がある - 製造元が提供する未変更の OS を実行している - アプリケーションで Tap to Pay SDK バージョン 2.20.0 以降が使用されている - Tap to Pay リーダーのシミュレーションされていないバージョンでは開発者オプションが無効である デバイスで実行されているアプリケーションが上記の要件を満たさない場合、[TerminalErrorCode](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-terminal-error-code/index.html) と追加のコンテキストを含む `TerminalException` で、`onFailure` コールバックが返されます。エンドユーザーは、以下に挙げるような[失敗理由](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-terminal-error-code/index.html)のいくつかに対処することができます。 - `STRIPE_API_CONNECTION_ERROR`: ユーザーは安定したインターネットソースに接続できます。 - `TAP_TO_PAY_UNSUPPORTED_ANDROID_VERSION`: デバイスの製造元から更新が提供されると、ユーザーはオペレーティングシステムをアップグレードできます。 接続時に[店舗](https://docs.stripe.com/api/terminal/locations.md)に[リーダーを登録](https://docs.stripe.com/terminal/fleet/locations-and-zones.md)する必要があります。これを行うには、接続時に`店舗 ID` を関連する店舗 ID に設定し`た TapToPayConnectionConfiguration` を作成して使用します。 #### Kotlin ```kotlin val tapToPayReaderListener = yourTapToPayReaderListener val autoReconnectOnUnexpectedDisconnect = true val config = TapToPayConnectionConfiguration( ""{{LOCATION_ID}}"", autoReconnectOnUnexpectedDisconnect, tapToPayReaderListener ), Terminal.getInstance().connectReader( firstReader, config, object : ReaderCallback { override fun onSuccess(reader: Reader) { // Placeholder for handling successful operation } override fun onFailure(e: TerminalException) { // Placeholder for handling exception } } ) ``` ## 予期しない切断に対処する - [TapToPayReaderListener (Android)](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-tap-to-pay-reader-listener/index.html) アプリとリーダーの間で予期しない切断が発生することがあります。たとえば、タッチ決済リーダーは以下の理由で予期せず切断される可能性があります。 - メモリーの制約により Android OS が タッチ決済リーダーを停止する。 - デバイスのインターネット接続が失われる。 この問題は、以下の 2 つの方法で処理することが可能です。 #### 自動的に再接続を試行する `autoReconnectOnUnexpectedDisconnect` を `true` に設定すると、予期しない切断が発生したときに SDK が自動的に再接続を試みることができます。この設定を省略すると、SDK はデフォルトでこの動作になります。オプションで、アプリに自動再接続コールバック用の `TapToPayReaderListener` を実装することもできます。 #### Kotlin ```kotlin val tapToPayReaderListener = yourTapToPayReaderListener val autoReconnectOnUnexpectedDisconnect = true Terminal.getInstance().connectReader( reader, TapToPayConnectionConfiguration( ""{{LOCATION_ID}}"", autoReconnectOnUnexpectedDisconnect, tapToPayReaderListener ), readerCallback, ) ``` SDK が自動的に再接続を試行すると、以下が発生します。 1. 切断が発生すると、SDK は自動的に再接続しようとし、`onReaderReconnectStarted` を介して通知します。接続が切れて、再接続が進行中であることを必ずアプリで知らせてください。 - `Cancelable` オブジェクトを使用して、いつでも再接続の試行を停止できます。 1. SDK でリーダーへの再接続が成功すると、`onReaderReconnectSucceeded` を介して通知されます。接続が復元され、通常の動作が続行することを、必ずアプリで知らせてください。 1. SDK がリーダーに接続できない場合は、`onReaderReconnectFailed` と `TapToPayReaderListener.onDisconnect` の両方を介して通知されます。予期しない切断の発生をアプリが通知できるようにしてください。 #### Kotlin ```kotlin class CustomTapToPayReaderListener : TapToPayReaderListener { override fun onReaderReconnectStarted(reader: Reader, cancelReconnect: Cancelable, reason: DisconnectReason) { // 1. Notified at the start of a reconnection attempt // Use cancelable to stop reconnection at any time } override fun onReaderReconnectSucceeded(reader: Reader) { // 2. Notified when reader reconnection succeeds // App is now connected } override fun onReaderReconnectFailed(reader: Reader) { // 3. Notified when reader reconnection fails // App is now disconnected } } ``` #### 切断を手動で処理する 切断を自分で処理するには、次のことを行う必要があります。 1. `autoReconnectOnUnexpectedDisconnect` を `false` に設定して、既定の自動再接続を無効にします。 1. `TapToPayReaderListener` の `onDisconnect` コールバックを実装します。 これにより、アプリは Tap to Pay リーダーに再接続し、必要に応じて、何が問題だったのか、Tap to Pay へのアクセスを有効にする方法をユーザーに通知できます。エンドユーザーは、インターネット接続の問題など、特定のエラーを解決できます。 #### Kotlin ```kotlin class ReaderActivity : AppCompatActivity(), TapToPayReaderListener { // ... override fun onDisconnect(reason: DisconnectReason) { // Consider displaying a UI to notify the user and start rediscovering readers } // ... } ``` > 自動再接続を無効にせずに切断を手動で処理すると、競合が発生し、リーダーセッションが中断される可能性があります。 # React Native のタッチ決済 > This is a React Native のタッチ決済 for when terminal-sdk-platform is react-native and reader-type is tap-to-pay. View the full page at https://docs.stripe.com/terminal/payments/connect-reader?terminal-sdk-platform=react-native&reader-type=tap-to-pay. タッチ決済を使用すると、ユーザーは、[互換性のある NFC 対応 Android デバイス](https://docs.stripe.com/terminal/payments/setup-reader/tap-to-pay.md?platform=android#supported-devices)または[互換性のある iPhone](https://docs.stripe.com/terminal/payments/setup-reader/tap-to-pay.md?platform=ios#supported-devices) で対面の非接触型決済を受け付けることができます。タッチ決済は、Visa、Mastercard、アメリカン・エキスプレスの非接触型カードと、NFC ベースのモバイルウォレット (Apple Pay、Google Pay、Samsung Pay) に対応しています。iPhone と Android のタッチ決済のサポートは、ネイティブ Terminal SDK に含まれていて、モバイルアプリで直接決済を有効にします。 > React Native SDK のバージョン `0.0.1-beta.29` では、[easyConnect](https://stripe.dev/stripe-terminal-react-native/api-reference/interfaces/StripeTerminalSdkType.html#easyconnect) メソッドを使用して、リーダーの検出と接続を 1 つの API コールに統合し、導入を簡素化できます。 サポート対象のデバイスでアプリをタッチ決済リーダーに接続するには、次のステップを実行します。 - Android デバイスで SDK を使用している場合は、TTPA 用に [SDKを初期化](https://docs.stripe.com/terminal/payments/connect-reader.md#initialize)してください。 - SDK を使用して[リーダーを検出](https://docs.stripe.com/terminal/payments/connect-reader.md#discover-readers)し、デバイスの互換性を確認します。 - SDK を使用して[リーダーに接続](https://docs.stripe.com/terminal/payments/connect-reader.md#connect-reader)し、決済を受け付けます。 - [予期しない切断に対処](https://docs.stripe.com/terminal/payments/connect-reader.md#handling-disconnects)して、リーダーが予期せず切断した場合にもユーザーが引き続き決済を受け付けられるようにします。 ## SDK を初期化する Androidのタッチ決済は、取引の安全性を高めるために専用プロセスで動作します。このプロセスでは、`Application` の 2 つ目のインスタンスが作成されます。Android デバイスでコードを実行することによって発生する予期しないエラーを回避するには、`TapToPay.isInTapToPayProcess()` を確認することで、このプロセスでの `Application` の初期化をスキップできます。 ```kotlin class MainApplication : Application(), ReactApplication { override fun onCreate() { super.onCreate() // Skip initialization if running in the TTPA process. if (TapToPay.isInTapToPayProcess()) return // For example, this will be skipped. TerminalApplicationDelegate.onCreate(this) } } ``` ## リーダーを検出する - [discoverReaders (React Native)](https://stripe.dev/stripe-terminal-react-native/api-reference/interfaces/StripeTerminalSdkType.html#discoverReaders) `discoverReaders` メソッドを使用して、デバイスでのタッチ決済のハードウェアサポートを確認します。 ご利用のアプリケーションが上記の要件を満たさないデバイスで実行されている場合、`discoverReaders` メソッドがエラーを返します。 ```js export default function DiscoverReadersScreen() { const { discoverReaders, discoveredReaders } = useStripeTerminal({ onUpdateDiscoveredReaders: (readers) => { // The `readers` variable will contain an array of all the discovered readers. }, }); useEffect(() => { const { error } = await discoverReaders({ discoveryMethod: 'tapToPay', }); }, [discoverReaders]); return ; } ``` ## リーダーに接続する - [connectReader (React Native)](https://stripe.dev/stripe-terminal-react-native/api-reference/interfaces/StripeTerminalSdkType.html#connectreader-1) Tap to Pay で決済を受け付けるには、前のステップで検出されたリーダーを `connectReader` メソッドに指定します。 接続時に[店舗](https://docs.stripe.com/api/terminal/locations.md)に[リーダーを登録](https://docs.stripe.com/terminal/fleet/locations-and-zones.md)する必要があります。そのためには、関連する店舗 ID を `connectReader` に渡す必要があります。 iPhone で [on_behalf_of を指定してデスティネーション支払い](https://docs.stripe.com/terminal/features/connect.md?connect-charge-type=destination)を使用する場合は、連結アカウント ID も指定する必要があります。 ```js const { reader, error } = await connectReader({ discoveryMethod: 'tapToPay', reader: selectedReader, locationId: "{{LOCATION_ID}}", }); if (error) { console.log('connectTapToPayReader error:', error); return; } console.log('Reader connected successfully', reader); ``` ### 口座の関連付けおよび Apple 利用規約 Apple の iPhoneのタッチ決済の利用規約は、リーダーへの初回連結の際に表示されます。Apple に登録するには、Apple が提供する規約に同意する前に、貴社を表す有効な Apple ID を指定する必要があります。これは、Stripe アカウントごとに 1 回のみ実行する必要があります。アカウントは、他のモバイルデバイスを含む後続の連結においては、このプロセスを繰り返す必要はありません。 それぞれの連結アカウントは、次の場合に利用規約に同意する必要があります。 - Connect ユーザーがダイレクト支払いを作成する - Connect ユーザーがデスティネーション支払いを作成し、`on_behalf_of` アカウントを指定する ![Apple ID のサインイン、規約への同意、iPhone のタッチ決済の成功確認を示す 3 ステップのプロセス](https://b.stripecdn.com/docs-statics-srv/assets/ttpoi-account-linking-steps.56bc5c0bb037a98f788a7e8d43d0c87e.png) Tap to Pay を受け付けるには、Apple ID アカウントをリンクしてください。 iPhone のタッチ決済で `connectReader` メソッドを呼び出すと、どの iPhone でも 24 時間以内にアプリ間で最大 3 つの Stripe アカウントを使用できます。同じ 24 時間以内に同一デバイスで別のアカウントが使用された場合、`connectReader` メソッドが[SCPErrorTapToPayReaderMerchantBlocked](https://stripe.dev/stripe-terminal-ios/docs/Enums/SCPError.html#/c:@E@SCPError@SCPErrorTapToPayReaderMerchantBlocked)エラーを生成します。 口座の関連付けについて、詳細は [Apple iPhone のタッチ決済 FAQ](https://register.apple.com/tap-to-pay-on-iphone/faq.html) の「iPhoneのタッチ決済のビジネス情報」セクションをご覧ください。 ## 予期しない切断に対処する - [UserCallbacks (React Native)](https://stripe.dev/stripe-terminal-react-native/api-reference/index.html#REPORT_UNEXPECTED_READER_DISCONNECT) アプリとリーダーの間で予期しない切断が発生することがあります。たとえば、デバイスのインターネット接続が失われ、メモリーの制約により Android OS がタッチ決済リーダーのサービスを終了すると、タッチ決済リーダーは予期せず切断される可能性があります。 テスト中は、デバイスのインターネットアクセスを無効にすることで、予期しない切断をシミュレーションできます。 #### 自動的に再接続を試行する `autoReconnectOnUnexpectedDisconnect` を `true` に設定すると、予期しない切断が発生したときに SDK が自動的に再接続を試みることができます。この設定を省略すると、SDK はデフォルトでこの動作になります。 ```js const { reader, error } = await connectReader({ discoveryMethod: 'tapToPay', reader, autoReconnectOnUnexpectedDisconnect: true, // default setting }); if (error) { console.log('connectReader error:', error); return; } console.log('Reader connected successfully', reader); ``` SDK が自動的に再接続を試行すると、以下が発生します。 1. SDK では、`onDidStartReaderReconnect` を介して通知されます。接続が切れて、再接続が進行中であることを必ずアプリで知らせてください。 - `cancelReaderReconnection` メソッドを使用して、いつでも再接続の試行を停止できます。 1. SDK でリーダーへの再接続が成功すると、Stripe は `onDidSucceedReaderReconnect` を介して通知します。接続が復旧し、通常の動作が続くことを、必ずアプリで知らせてください。 1. SDK がリーダーに接続できない場合、Stripe は `onDidFailReaderReconnect` と `onDidDisconnect` の両方を介して通知します。必ず、予期しない切断が発生したことをアプリで知らせてください。 ```js const { discoverReaders, connectedReader, discoveredReaders } = useStripeTerminal({ onDidStartReaderReconnect: (disconnectReason) => { // 1. Notified at the start of a reconnection attempt // Use cancelable to stop reconnection at any time }, onDidSucceedReaderReconnect: () => { // 2. Notified when reader reconnection succeeds // App is now connected }, onDidFailReaderReconnect: () => { // 3. Notified when reader reconnection fails // App is now disconnected } }); ``` #### 切断を手動で処理する 切断を自分で処理するには、次のことを行う必要があります。 1. `autoReconnectOnUnexpectedDisconnect` を `false` に設定して、既定の自動再接続を無効にします。 1. `onDidReportUnexpectedReaderDisconnect` コールバックを実装します。 これにより、アプリは Tap to Pay リーダーに再接続し、必要に応じて、何が問題だったのか、Tap to Pay へのアクセスを有効にする方法をユーザーに通知できます。エンドユーザーは、インターネット接続の問題など、特定のエラーを解決できます。 ```js const { discoverReaders, connectedReader, discoveredReaders } = useStripeTerminal({ onDidReportUnexpectedReaderDisconnect: (readers) => { // Consider displaying a UI to notify the user and start rediscovering readers }, }); ``` > 自動再接続を無効にせずに切断を手動で処理すると、競合が発生し、リーダーセッションが中断される可能性があります。 ## 次のステップ アプリケーションをリーダーに接続しました。次に、[Stripe Terminal の最初の支払いを回収](https://docs.stripe.com/terminal/payments/collect-card-payment.md)します。 BBPOS および Chipper™ の名称およびロゴは BBPOS Limited のアメリカおよび/またはその他の国における商標または登録商標です。Verifone® の名称およびロゴは Verifone のアメリカおよび/またはその他の国における商標または登録商標のいずれかです。これらの商標の使用は BBPOS または Verifone による何らかの承認を意味するものではありません。