# 実装方法を設定する
Stripe Terminal SDK またはサーバー主導型の組み込みを設定して、対面決済の受け付けを開始できるようにします。
# サーバー主導型
> This is a サーバー主導型 for when terminal-sdk-platform is server-driven. View the full page at https://docs.stripe.com/terminal/payments/setup-integration?terminal-sdk-platform=server-driven.
サーバー主導の実装では、Terminal SDK の代わりに Stripe API を使用して [WisePOS E、Stripe Reader S700/S710、Verifone スマートリーダー](https://docs.stripe.com/terminal/smart-readers.md)に接続し、対面で決済を回収します。これにより、次のことが可能になります。
- インフラストラクチャーで iOS SDK、Android SDK、または JavaScript SDK をサポートしていなくても Terminal を使用する
- カスタムのミドルウェアまたはクラウドベースのインフラストラクチャーを利用する Terminal 連携を構築する
- Terminal に .NET ベースの POS を含むあらゆるデバイスを連携する
- ローカルエリアネットワークの代わりにインターネットを使用してリーダーのネットワーク接続を向上させる
- curl リクエストを行って連携のプロトタイプを作成する
サーバー主導型の導入は、以下には対応していません。
- [Stripe Terminal モバイルリーダー](https://docs.stripe.com/terminal/mobile-readers.md)
- [オフライン中にカード支払いを回収する](https://docs.stripe.com/terminal/features/operate-offline/collect-card-payments.md)
## 始める
[Terminal クイックスタートガイド](https://docs.stripe.com/terminal/quickstart.md)の説明をもとに、以下のコンポーネントを使用してサーバー主導型の連携を行います。
- **POS アプリケーション:** 従業員が取引を作成するときに表示するオペレーター向け UI です。
- **バックエンドインフラ:** 取引中に POS アプリケーションからのリクエストを仲介し、Stripe API にリクエストを送信します。
- **Stripe API:** リクエストを受け取り、[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)などのスマートリーダーに転送します。また、Stripe は決済ステータスを含む *Webhook* をバックエンドインフラにも送信します。
- **BBPOS WisePOS E リーダー、Stripe Reader S700/S710、Verifone リーダー、またはシミュレーションリーダー:** カード会員に決済を促し、Stripe および金融インフラと通信して決済を処理します。物理リーダーがない場合は、シミュレーションリーダーを作成できます。

## See also
- [Terminal クイックスタートガイド](https://docs.stripe.com/terminal/quickstart.md)
- [リーダーに接続する](https://docs.stripe.com/terminal/payments/connect-reader.md?terminal-sdk-platform=server-driven&reader-type=internet)
# JavaScript
> This is a JavaScript for when terminal-sdk-platform is js. View the full page at https://docs.stripe.com/terminal/payments/setup-integration?terminal-sdk-platform=js.
> #### スマートリーダーの推奨事項
>
> [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 の [SDK リファレンス完全版](https://docs.stripe.com/terminal/references/api/js-sdk.md)を参照してください。
### Terminal JavaScript SDK の要件
JavaScript SDK を使用して[スマートリーダー](https://docs.stripe.com/terminal/smart-readers.md)を導入する場合、ネットワークの設定が[ネットワーク要件](https://docs.stripe.com/terminal/network-requirements.md)を満たしていることを確認してください。
JavaScript SDK の使用を開始する際に必要なステップは、以下の 3 つです。
1. チェックアウトページに [SDK およびクライアントライブラリをインストールする](https://docs.stripe.com/terminal/payments/setup-integration.md#install)
1. ウェブアプリケーションとバックエンドで[接続トークンのエンドポイントを設定する](https://docs.stripe.com/terminal/payments/setup-integration.md#connection-token)
1. ウェブアプリケーションで [SDK を初期化する](https://docs.stripe.com/terminal/payments/setup-integration.md#initialize)
> お客様のウェブアプリケーションを JavaScript SDK に組み込むと、それをモバイルブラウザで実行できます。ただし、モバイルデバイスがリーダーと同じローカルネットワークに接続され、そのネットワーク上のデバイスが互いに直接通信できる状態である必要があります。
## SDK およびクライアントライブラリーをインストールする [クライアント側] [サーバー側]
#### クライアント側
作業を開始するには、このスクリプトを決済ページに含めます。最新のリーダーソフトウェアとの互換性を保つため、このスクリプトは常に **https://js.stripe.com** から直接読み込む必要があります。スクリプトをバンドルに含めたり、そのコピーを自身でホストすることがないようにしてください。これを行うと、組み込みが警告なく破損することがあります。
```html
```
#### Terminal JS SDK をモジュールとして使用する
Stripe では、npm パッケージも用意しています。これを使用すると、Terminal JS SDK をモジュールとして読み込み、使用できます。詳細については、[GitHub のプロジェクト](https://github.com/stripe/terminal-js)をご覧ください。
> JavaScript SDK のベータ版からの移行の詳細については、[Stripe Terminal ベータの移行ガイド](https://docs.stripe.com/terminal/references/sdk-migration-guide.md)をご覧ください。
#### サーバー側
アプリケーションから Stripe API にアクセスするには、Stripe の公式ライブラリーを使用します。
#### Ruby
```bash
# Available as a gem
sudo gem install stripe
```
```ruby
# If you use bundler, you can add this line to your Gemfile
gem 'stripe'
```
## ConnectionToken エンドポイントを設定する [サーバー側] [クライアント側]
#### サーバー側
リーダーに接続するには、バックエンドからご自身の Stripe アカウントに、リーダーを使用するための SDK 権限を付与する必要があります。それには、[ConnectionToken (接続トークン)](https://docs.stripe.com/api/terminal/connection_tokens.md) から [secret (シークレット)](https://docs.stripe.com/api/terminal/connection_tokens/object.md#terminal_connection_token_object-secret) を提供します。バックエンドは信頼できるクライアントに対してのみ、接続トークンを作成するようにする必要があります。
#### curl
```bash
curl https://api.stripe.com/v1/terminal/connection_tokens \
-u <>: \
-X "POST"
```
サーバー側の `ConnectionToken` からシークレットを取得してクライアント側に渡します。
#### Ruby
```ruby
post '/connection_token' do
token = # ... Create or retrieve the ConnectionToken
{secret: token.secret}.to_json
end
```
> `ConnectionToken` の `secret` により、お客様は任意の Stripe Terminal リーダーに接続して、Stripe アカウントで支払いを受け取ることができます。必ず、接続トークンの作成に使用するエンドポイントを認証し、クロスサイトリクエストフォージェリ (CSRF) から保護してください。
#### クライアント側
SDK にこのエンドポイントへのアクセスを許可するには、バックエンドから `ConnectionToken` をリクエストし、`ConnectionToken` オブジェクトから `secret` を返す関数をウェブアプリケーションで作成します。
```javascript
async function fetchConnectionToken() {
// Your backend should call /v1/terminal/connection_tokens and return the JSON response from Stripe
const response = await fetch('https://{{YOUR_BACKEND_URL}}/connection_token', { method: "POST" });
const data = await response.json();
return data.secret;
}
```
この関数は、SDK で Stripe またはリーダーの認証が必要になるたびに呼び出されます。また、リーダーへの接続に新しい接続トークンが必要な場合 (アプリがリーダーから切断されたときなど) にも呼び出されます。SDK がバックエンドから新しい接続トークンを取得できない場合、リーダーへの接続は失敗し、サーバーからエラーが返されます。
> 接続トークンのキャッシュやハードコードはしないでください。SDK が接続トークンのライフサイクルを管理します。
## SDK を初期化する [クライアント側]
> 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)をご覧ください。
SDK によって利用可能になった [StripeTerminal](https://docs.stripe.com/terminal/references/api/js-sdk.md#stripeterminal-create) オブジェクトは、リーダーを検出し、リーダーに接続し、支払いを作成する汎用インターフェイスを提供します。お使いの JavaScript アプリケーションで `StripeTerminal` インスタンスを初期化するには、[ステップ 2](https://docs.stripe.com/terminal/payments/setup-integration.md#connection-token) で実装した `ConnectionToken` 関数を指定します。
また、リーダーからの意図しない切断を処理するための関数、[onUnexpectedReaderDisconnect](https://docs.stripe.com/terminal/references/api/js-sdk.md#stripeterminal-create) も指定する必要があります。この関数では、アプリからユーザーにリーダーが切断されたことを知らせる必要があります。リーダーへの再接続を試行する方法を含めることもできます。詳細については、[接続切断に対処する](https://docs.stripe.com/terminal/payments/connect-reader.md?terminal-sdk-platform=js&reader-type=internet#handling-disconnects)をご覧ください。
```javascript
const terminal = StripeTerminal.create({
onFetchConnectionToken: fetchConnectionToken,
onUnexpectedReaderDisconnect: unexpectedDisconnect,
});
function unexpectedDisconnect() {
// You might want to display UI to notify the user and start re-discovering readers
}
```
## SDK の更新
Stripe は定期的に、新機能、バグ修正、セキュリティー更新を含む更新をリリースしています。SDK は、新しいバージョンが利用可能になり次第すぐに更新してください。現在利用可能な SDK は以下のとおりです。
- [Stripe Terminal Android SDK](https://github.com/stripe/stripe-terminal-android/releases)
- [Stripe Terminal iOS SDK](https://github.com/stripe/stripe-terminal-ios/releases)
- [Stripe Terminal JavaScript SDK](https://docs.stripe.com/terminal/references/api/js-sdk.md#changelog)
- [Stripe Terminal React Native SDK](https://github.com/stripe/stripe-terminal-react-native)
## サポートされるブラウザ
Stripe Terminal JavaScript SDK は、主なブラウザの最新バージョンをすべてサポートしています。以下をサポートします。
- Windows の Edge。
- Firefox (デスクトッププラットフォーム)
- Chrome および Safari (あらゆるプラットフォーム)
- Android ネイティブブラウザ (Android 4.4 以降)
特定のブラウザーで、Stripe Terminal JavaScript SDK に問題がある場合は、[support-terminal@stripe.com](mailto:support-terminal@stripe.com) にメールでお問い合わせください。
> 注: React Native での Stripe Terminal JavaScript SDK の使用はサポートされていません。React Native を使用してモバイルアプリに Stripe Terminal を構築するには[Stripe Terminal React Native SDK](https://github.com/stripe/stripe-terminal-react-native) を使用します。
## 次のステップ
- [リーダーに接続する](https://docs.stripe.com/terminal/payments/connect-reader.md?terminal-sdk-platform=js&reader-type=internet)
# iOS
> This is a iOS for when terminal-sdk-platform is ios. View the full page at https://docs.stripe.com/terminal/payments/setup-integration?terminal-sdk-platform=ios.
利用可能なすべてのメソッド、オブジェクト、エラーの詳細を確認するには、Stripe の [SDK リファレンス完全版](https://stripe.dev/stripe-terminal-ios)を参照してください。
iOS SDK の使用を開始する際に必要なステップは以下の 4 つです。
1. アプリに [SDK をインストール](https://docs.stripe.com/terminal/payments/setup-integration.md#install)します。
1. アプリを[設定](https://docs.stripe.com/terminal/payments/setup-integration.md#configure)します。
1. アプリとバックエンドで[接続トークンのエンドポイントを設定](https://docs.stripe.com/terminal/payments/setup-integration.md#connection-token)します。
1. アプリで [SDK を初期化](https://docs.stripe.com/terminal/payments/setup-integration.md#initialize)します。
## SDK をインストールする [クライアント側]
Stripe Terminal iOS SDK は、次のようなアプリと互換性があります。
- iOS 13 以上をサポートしている
- CocoaPods、Swift Package Manager を使用するか、手動でフレームワークを導入することによってインストールされている
#### CocoaPods
1. まだ [CocoaPods](https://guides.cocoapods.org/using/getting-started.html) の最新バージョンをインストールしていない場合は、インストールします。
1. 既存の [Podfile](https://guides.cocoapods.org/syntax/podfile.html) がない場合は、以下のコマンドを実行して作成します。
```bash
pod init
```
1. この行を Podfile に追加します。
```podfile
pod 'StripeTerminal', '~> 5.0'
```
1. 以下のコマンドを実行します。
```bash
pod install
```
1. これ以降は、Xcode でプロジェクトを開く際に、`.xcodeproj` ファイルではなく、`.xcworkspace` ファイルを使用します。
#### Swift Package Manager
1. Xcode で、メニューバーの **File** > **Add Packages…** を選択します
1. Stripe Terminal iOS SDK の GitHub URL (`https://github.com/stripe/stripe-terminal-ios`) を入力します。
1. プロジェクトにインストールする SDK バージョンを入力します。デフォルト値の「Up to Next Major」を指定すると、互換性に関わる変更の影響を受けることなく、セキュリティと機能を最新の状態に更新できます。
#### 手動
1. GitHub の Stripe Terminal iOS リポジトリーにアクセスして、[最新リリース](https://github.com/stripe/stripe-terminal-ios/releases) に移動します。
1. GitHub リリースに添付されている `StripeTerminal.xcframework.zip` ファイルをダウンロードします。
1. ファイルを解凍してから、XCFramework を Xcode プロジェクトにドラッグアンドドロップします。
1. フレームワークの記号が読み込めない場合は、ターゲットの「General (一般)」ペインに移動し、「Frameworks, Libraries, and Embedded Content (フレームワーク、ライブラリー、埋め込みコンテンツ)」ドロップダウンを探します。`StripeTerminal.xcframework` を、「Don’t Embed (埋め込まない)」から「Embed and Sign (埋め込んで署名)」に切り替えます。
> 最新の SDK リリースと過去のバージョンの詳細については、GitHub の [リリース](https://github.com/stripe/stripe-terminal-ios/releases) ページを参照してください。新しいリリースが公開されたときに通知を受け取るには、[リポジトリのリリースを確認](https://docs.github.com/en/github/managing-subscriptions-and-notifications-on-github/configuring-notifications#configuring-your-watch-settings-for-an-individual-repository) するか、[GitHub リリース RSS フィードを購読](https://github.com/stripe/stripe-terminal-ios/releases.atom) してください。
>
> 以前のバージョンの iOS SDK からの移行の詳細については、[Stripe Terminal SDK 移行ガイド](https://docs.stripe.com/terminal/references/sdk-migration-guide.md)をご覧ください。
## アプリを設定する [クライアント側]
アプリが Stripe Terminal SDK で動作するように準備するには、Xcode の **Info.plist** ファイルにいくつかの変更を加えます。
1. 次のキーと値のペアを使用して位置サービスを有効にします。
| プライバシー: Location When In Use Usage Description (使用されている位置の確認に関する記述) |
| ------------------------------------------------------------------- |
| **キー** | [NSLocationWhenInUseUsageDescription](https://developer.apple.com/documentation/bundleresources/information_property_list/nslocationwheninuseusagedescription) |
| **値** | **決済を受け付けるには、位置情報へのアクセスが必要です。** |
決済に関連する不正使用のリスクを減らし、不審請求の申請を最小限に抑えるため、Stripe は決済が発生した場所を把握する必要があります。SDK が iOS デバイスの場所を特定できない場合は、位置情報へのアクセスが復元されるまで決済無効化されます。
1. アプリがバックグラウンドで実行され、Bluetooth リーダーに接続されたままであることを確認してください。
| Bluetooth リーダーに必要なバックグラウンドモード |
| ----------------------------- |
| **キー** | [UIBackgroundModes](https://developer.apple.com/documentation/bundleresources/information_property_list/uibackgroundmodes) |
| **値** | **bluetooth-central** (Bluetooth LE アクセサリーを使用) |
[bluetooth-central](https://developer.apple.com/library/archive/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/CoreBluetoothBackgroundProcessingForIOSApps/PerformingTasksWhileYourAppIsInTheBackground.html#//apple_ref/doc/uid/TP40013257-CH7-SW6) バックグラウンドモードを設定すると、アプリがバックグラウンドで実行されている場合、または iOS デバイスがロックされている場合に、リーダーをスタンバイモードで保持することができます。この値がないと、スタンバイは失敗します。アプリがバックグラウンドで実行されている場合、リーダーは電力を節約するために自動的にオフになります。
1. アプリで Bluetooth に対する権限のダイアログを表示できるようにします。これは、アプリが Bluetooth リーダーへの接続に対応していない場合でも含める必要がある、アプリストアの必須要件です。
| プライバシー: Bluetooth Always Usage Description (Bluetooth の常時使用に関する記述) |
| ------------------------------------------------------------------ |
| **キー** | [NSBluetoothAlwaysUsageDescription](https://developer.apple.com/documentation/bundleresources/information_property_list/NSBluetoothAlwaysUsageDescription) |
| **値** | **このアプリは、Bluetooth を使用してサポート対象のカードリーダーに接続します。** |
iOS 13 では、アプリによる Bluetooth 周辺機器の使用に関して、これまでよりも具体的な権限が新たに導入されました。Core Bluetooth とリンクするアプリは、初回起動時にアプリがクラッシュしないように、このキーを Info.plist ファイルに含める必要があります。
1. App Store に提出する際に、アプリの検証確認を渡します。SDK バージョン 3.4.0 では、この権限要件は削除されています。
| プライバシー: Bluetooth Peripheral Usage Description (Bluetooth 周辺機器の使用に関する記述) |
| ------------------------------------------------------------------------ |
| **キー** | [NSBluetoothPeripheralUsageDescription](https://developer.apple.com/documentation/bundleresources/information_property_list/nsbluetoothperipheralusagedescription) |
| **値** | **サポート対象のカードリーダーに接続するには、Bluetooth 接続が必要です。** |
これは一例です。アプリ内でのユーザーの権限を求めるプロンプトの文言を変更することもできます。
1. アプリの **Info.plist** を保存します。これで、正しく設定され、Stripe Terminal SDK で使用できるようになりました。
> iPhone のタッチ決済を使用している場合は、Apple 開発者アカウントから iPhone のタッチ決済開発エンタイトルメントを [リクエストおよび設定](https://developer.apple.com/documentation/proximityreader/setting-up-the-entitlement-for-tap-to-pay-on-iphone) する必要があります。
## ConnectionToken エンドポイントを設定する [サーバー側] [クライアント側]
### サーバー側
リーダーに接続するには、バックエンドからご自身の Stripe アカウントに、リーダーを使用するための SDK 権限を付与する必要があります。それには、[ConnectionToken (接続トークン)](https://docs.stripe.com/api/terminal/connection_tokens.md) から [secret (シークレット)](https://docs.stripe.com/api/terminal/connection_tokens/object.md#terminal_connection_token_object-secret) を提供します。バックエンドは信頼できるクライアントに対してのみ、接続トークンを作成するようにする必要があります。
#### curl
```bash
curl https://api.stripe.com/v1/terminal/connection_tokens \
-u <>: \
-X "POST"
```
サーバー側の `ConnectionToken` からシークレットを取得してクライアント側に渡します。
#### Ruby
```ruby
post '/connection_token' do
token = # ... Create or retrieve the ConnectionToken
{secret: token.secret}.to_json
end
```
> `ConnectionToken` の `secret` により、お客様は任意の Stripe Terminal リーダーに接続して、Stripe アカウントで支払いを受け取ることができます。必ず、接続トークンの作成に使用するエンドポイントを認証し、クロスサイトリクエストフォージェリ (CSRF) から保護してください。
### クライアント側
SDK にこのエンドポイントへのアクセスを許可するには、アプリに [ConnectionTokenProvider](https://stripe.dev/stripe-terminal-ios/docs/Protocols/SCPConnectionTokenProvider.html) プロトコルを実装します。これは、バックエンドから `ConnectionToken` を要求する単一の関数を定義します。
```swift
import StripeTerminal
// Example API client class for communicating with your backend
class APIClient: ConnectionTokenProvider {
// For simplicity, this example class is a singleton
static let shared = APIClient()
// Fetches a ConnectionToken from your backend
func fetchConnectionToken(_ completion: @escaping ConnectionTokenCompletionBlock) {
let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)
guard let url = URL(string: "https://{{YOUR_BACKEND_URL}}/connection_token") else {
fatalError("Invalid backend URL")
}
var request = URLRequest(url: url)
request.httpMethod = "POST"
let task = session.dataTask(with: request) { (data, response, error) in
if let data = data {
do {
// Warning: casting using `as? [String: String]` looks simpler, but isn't safe:
let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]
if let secret = json?["secret"] as? String {
completion(secret, nil)
}
else {
let error = NSError(domain: "com.stripe-terminal-ios.example",
code: 2000,
userInfo: [NSLocalizedDescriptionKey: "Missing `secret` in ConnectionToken JSON response"])
completion(nil, error)
}
}
catch {
completion(nil, error)
}
}
else {
let error = NSError(domain: "com.stripe-terminal-ios.example",
code: 1000,
userInfo: [NSLocalizedDescriptionKey: "No data in response from ConnectionToken endpoint"])
completion(nil, error)
}
}
task.resume()
}
}
```
この関数は、SDK で Stripe またはリーダーの認証が必要になるたびに呼び出されます。また、リーダーへの接続に新しい接続トークンが必要な場合 (アプリがリーダーから切断されたときなど) にも呼び出されます。SDK がバックエンドから新しい接続トークンを取得できない場合、リーダーへの接続は失敗し、サーバーからエラーが返されます。
> 接続トークンのキャッシュやハードコードはしないでください。SDK が接続トークンのライフサイクルを管理します。
> #### 証明書のピンニング
>
> ほとんどの場合、アプリケーションで証明書のピンニングを設定する必要はありません。アプリケーションにこの機能が必要な場合は、[証明書のピンニング](https://docs.stripe.com/tls-certificates.md#certificate-pinning)に関するドキュメントをご覧ください。
## SDK を初期化する [クライアント側]
Stripe Terminal SDK によって提供される [Terminal](https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPTerminal.html) クラスは、リーダーの検出、リーダーへの接続、リーダーでの操作の実行 (カートの詳細の表示、支払いの作成、将来の使用に備えたカードの保存など) のための汎用インターフェイスを表示します。
[接続トークンの設定](https://docs.stripe.com/terminal/payments/setup-integration.md#connection-token)時に実装した `ConnectionTokenProvider` を指定します。`Terminal.shared` にアクセスする前に、アプリで `initWithTokenProvider` を 1 回だけ呼び出します。通常は、`AppDelegate` メソッドの `application:didFinishLaunchingWithOptions` または SwiftUI `App` タイプの `init()` で呼び出します。あるいは、Objective-C で `dispatch_once` を使用するか、Swift で `static` イニシャライザを使用します。
```swift
import UIKit
import StripeTerminal
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
Terminal.initWithTokenProvider(APIClient.shared)
// ...
return true
}
// ...
}
```
## SDK の更新
Stripe は定期的に、新機能、バグ修正、セキュリティー更新を含む更新をリリースしています。SDK は、新しいバージョンが利用可能になり次第すぐに更新してください。現在利用可能な SDK は以下のとおりです。
- [Stripe Terminal Android SDK](https://github.com/stripe/stripe-terminal-android/releases)
- [Stripe Terminal iOS SDK](https://github.com/stripe/stripe-terminal-ios/releases)
- [Stripe Terminal JavaScript SDK](https://docs.stripe.com/terminal/references/api/js-sdk.md#changelog)
- [Stripe Terminal React Native SDK](https://github.com/stripe/stripe-terminal-react-native)
## 次のステップ
- [リーダーに接続する](https://docs.stripe.com/terminal/payments/connect-reader.md?terminal-sdk-platform=ios&reader-type=internet)
# Android
> This is a Android for when terminal-sdk-platform is android. View the full page at https://docs.stripe.com/terminal/payments/setup-integration?terminal-sdk-platform=android.
利用可能なすべてのメソッド、オブジェクト、エラーの詳細を確認するには、Stripe の [SDK リファレンス完全版](https://stripe.dev/stripe-terminal-android/)をご覧ください。
Android SDK の使用を開始するには、以下の 4 つのステップが必要です。
1. アプリに [SDK をインストール](https://docs.stripe.com/terminal/payments/setup-integration.md#install)します。
1. アプリを[設定](https://docs.stripe.com/terminal/payments/setup-integration.md#configure)します。
1. アプリとバックエンドで[接続トークンのエンドポイントを設定](https://docs.stripe.com/terminal/payments/setup-integration.md#connection-token)します。
1. アプリで [SDK を初期化](https://docs.stripe.com/terminal/payments/setup-integration.md#initialize)します。
## SDK をインストールする [クライアント側]
> アプリのライフサイクル全体で状態を保存したり、維持したりする際には Room が使用されるため、SDK はサポートライブラリーとの互換性がなくなりました。ご使用のアプリが AndroidX に移行されていることを確認してください。
SDK をインストールするには、[アプリのビルドファイル](https://developer.android.com/studio/build/dependencies)の `dependencies` ブロックに `stripeterminal` を追加します。
#### Kotlin
```kotlin
plugins {
id("com.android.application")
}
android { ... }
dependencies {
implementation("com.stripe:stripeterminal:5.3.0")
// ...
}
```
### (オプション) Kotlin Coroutine サポート
SDK バージョン 5.0.0 には、オプションのモジュール `stripeterminal-ktx` が含まれています。このモジュールは、非同期 Terminal API の `suspend` 関数ラッパーを提供し、コールバックをネストするのではなく、シンプルで連続したコードを記述できるようにします。
これを使用するには、依存関係を追加します。
#### Kotlin
```kotlin
dependencies {
implementation("com.stripe:stripeterminal:5.3.0")
// Add the coroutines module
implementation("com.stripe:stripeterminal-ktx:5.3.0")
// ...
}
```
この統合パターンの例については、GitHub の [Kotlin サンプルアプリ](https://github.com/stripe/stripe-terminal-android/tree/master/Example/kotlinapp)をご覧ください。
### ターゲット Java バージョンを設定
次に、SDK は Java 8 を使用しているため、アプリのビルドファイルで対象の Java バージョンとして Java 8 を指定する必要があります。
#### Kotlin
```kotlin
android {
// ...
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
}
}
```
> SDK の最新リリースおよび過去バージョンの詳細については、GitHub の [Releases](https://github.com/stripe/stripe-terminal-android/releases) ページをご覧ください。新しいリリースの公開時に通知を受け取るには、[リポジトリーのリリースを確認](https://docs.github.com/en/github/managing-subscriptions-and-notifications-on-github/configuring-notifications#configuring-your-watch-settings-for-an-individual-repository)してください。
>
> Android SDK の以前のバージョンまたはベータ版からの移行については、[Stripe Terminal 移行ガイド](https://docs.stripe.com/terminal/references/sdk-migration-guide.md)を参照してください。
## アプリを設定する [クライアント側]
`ACCESS_FINE_LOCATION` 権限を有効化する必要があります。Bluetooth リーダーを接続するには、Bluetooth の権限も有効にする必要があります。以下に示すように、適切な権限をマニフェストに追加してください。
```xml
```
[Terminal](https://stripe.dev/stripe-terminal-android/core/com.stripe.stripeterminal/-terminal/index.html) オブジェクトを初期化する前に以下のチェックを追加して、アプリで `ACCESS_FINE_LOCATION` 権限が有効になっていることを確認します。
```kotlin
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
val permissions = arrayOf(android.Manifest.permission.ACCESS_FINE_LOCATION)
ActivityCompat.requestPermissions(this, permissions, REQUEST_CODE_LOCATION)
}
```
また、SDK が機能するには位置情報へのアクセス許可が必要になるため、アプリのユーザーがその許可を付与していることを確認してください。これを行うには、アプリで `onRequestPermissionsResult` メソッドをオーバーライドして、アクセス許可の結果を確認します。
```kotlin
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == REQUEST_CODE_LOCATION && grantResults.isNotEmpty()
&& grantResults[0] != PackageManager.PERMISSION_GRANTED
) {
throw RuntimeException("Location services are required to connect to a reader.")
}
}
```
また、申し込みだけでなく、デバイスで場所情報と Bluetooth サービスが有効であることを確認する必要があります。デバイス設定でどのように表示されるかの例をご覧ください。

店舗設定

Bluetooth の設定
> 支払いに関連する不正使用のリスクを減らし、不審請求の申請を最小限に抑えるため、Stripe は支払いの発生場所を把握する必要があります。SDK が Android デバイスの場所を特定できない場合には、位置情報へのアクセスが復元されるまで支払いは無効になります。
## ConnectionToken エンドポイントを設定する [サーバー側] [クライアント側]
### サーバー側
リーダーに接続するには、バックエンドからご自身の Stripe アカウントに、リーダーを使用するための SDK 権限を付与する必要があります。それには、[ConnectionToken (接続トークン)](https://docs.stripe.com/api/terminal/connection_tokens.md) から [secret (シークレット)](https://docs.stripe.com/api/terminal/connection_tokens/object.md#terminal_connection_token_object-secret) を提供します。バックエンドは信頼できるクライアントに対してのみ、接続トークンを作成するようにする必要があります。
#### curl
```bash
curl https://api.stripe.com/v1/terminal/connection_tokens \
-u <>: \
-X "POST"
```
サーバー側の `ConnectionToken` からシークレットを取得してクライアント側に渡します。
#### Ruby
```ruby
post '/connection_token' do
token = # ... Create or retrieve the ConnectionToken
{secret: token.secret}.to_json
end
```
> `ConnectionToken` の `secret` により、お客様は任意の Stripe Terminal リーダーに接続して、Stripe アカウントで支払いを受け取ることができます。必ず、接続トークンの作成に使用するエンドポイントを認証し、クロスサイトリクエストフォージェリ (CSRF) から保護してください。
### クライアント側
SDK にこのエンドポイントへのアクセス権を付与するには、アプリで [ConnectionTokenProvider](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-connection-token-provider/index.html) インターフェイスを実装します。このインターフェイスはバックエンドから `ConnectionToken` をリクエストする単一の関数を定義します。
```kotlin
class CustomConnectionTokenProvider : ConnectionTokenProvider {
override fun fetchConnectionToken(callback: ConnectionTokenCallback) {
try {
// Your backend should call /v1/terminal/connection_tokens and return the
// JSON response from Stripe. When the request to your backend succeeds,
// return the `secret` from the response to the SDK.
callback.onSuccess(secret)
} catch (e: Exception) {
callback.onFailure(
ConnectionTokenException("Failed to fetch connection token", e)
)
}
}
}
```
この関数は、SDK で Stripe またはリーダーの認証が必要になるたびに呼び出されます。また、リーダーへの接続に新しい接続トークンが必要な場合 (アプリがリーダーから切断されたときなど) にも呼び出されます。SDK がバックエンドから新しい接続トークンを取得できない場合、リーダーへの接続は失敗し、サーバーからエラーが返されます。
> 接続トークンのキャッシュやハードコードはしないでください。SDK が接続トークンのライフサイクルを管理します。
> #### 証明書のピンニング
>
> ほとんどの場合、アプリケーションで証明書のピンニングを設定する必要はありません。アプリケーションにこの機能が必要な場合は、[証明書のピンニング](https://docs.stripe.com/tls-certificates.md#certificate-pinning)に関するドキュメントをご覧ください。
## SDK を初期化する [クライアント側]
Android SDK はライフサイクル対応です。メモリーリークを防止し、長期間実行される Terminal SDK プロセスのクリーンアップを適切に行うために、アプリケーションには、`TerminalApplicationDelegate.onCreate()` を使用して SDK にライフサイクルイベントを通知する `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()
TerminalApplicationDelegate.onCreate(this)
}
}
```
> Android のタッチ決済 (TTPA) を使用する場合、`Application` での初期化は、この例とは若干異なります。[TTPA を使用してリーダーに接続する](https://docs.stripe.com/terminal/payments/connect-reader.md?terminal-sdk-platform=android&reader-type=tap-to-pay#initialize)をご覧ください。
Stripe Terminal SDK によって提供される [Terminal](https://stripe.dev/stripe-terminal-android/core/com.stripe.stripeterminal/-terminal/index.html) クラスは、リーダーの検出、リーダーへの接続、リーダーでの操作の実行 (カートの詳細の表示、支払いの作成、将来の使用に備えたカードの保存など) のための汎用インターフェイスを表示します。
まずはじめに、現在のアプリケーションコンテキスト、[ステップ 3](https://docs.stripe.com/terminal/payments/setup-integration.md#connection-token) で実装した [ConnectionTokenProvider](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-connection-token-provider/index.html)、および [TerminalListener](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-terminal-listener/index.html) オブジェクトを指定します。このリスナーを使用して、SDK からの支払いや接続ステータスの更新などのイベントを処理できます。
```kotlin
// Create your listener object. Override any methods that you want to be notified about
val listener = object : TerminalListener {
override fun onConnectionStatusChange(status: ConnectionStatus) {
println("onConnectionStatusChange: $status");
}
override fun onPaymentStatusChange(status: PaymentStatus) {
println("onPaymentStatusChange: $status");
}
}
// Choose the level of messages that should be logged to your console
val logLevel = LogLevel.VERBOSE
// Create your token provider.
val tokenProvider = CustomConnectionTokenProvider()
// Offline listener is optional and only needed if processing offline transactions.
// See https://docs.stripe.com/terminal/features/operate-offline/collect-card-payments
val offlineListener: OfflineListener? = null
// Pass in the current application context, your desired logging level, your token provider, and the listener you created
if (!Terminal.isInitialized()) {
Terminal.init(applicationContext, logLevel, tokenProvider, listener, offlineListener)
}
// Since the Terminal is a singleton, you can call getInstance whenever you need it
Terminal.getInstance()
```
## SDK の更新
Stripe は定期的に、新機能、バグ修正、セキュリティー更新を含む更新をリリースしています。SDK は、新しいバージョンが利用可能になり次第すぐに更新してください。現在利用可能な SDK は以下のとおりです。
- [Stripe Terminal Android SDK](https://github.com/stripe/stripe-terminal-android/releases)
- [Stripe Terminal iOS SDK](https://github.com/stripe/stripe-terminal-ios/releases)
- [Stripe Terminal JavaScript SDK](https://docs.stripe.com/terminal/references/api/js-sdk.md#changelog)
- [Stripe Terminal React Native SDK](https://github.com/stripe/stripe-terminal-react-native)
## 次のステップ
- [リーダーに接続する](https://docs.stripe.com/terminal/payments/connect-reader.md?terminal-sdk-platform=android&reader-type=internet)
# React Native
> This is a React Native for when terminal-sdk-platform is react-native. View the full page at https://docs.stripe.com/terminal/payments/setup-integration?terminal-sdk-platform=react-native.
> Terminal の React Native ライブラリは[公開プレビュー](https://docs.stripe.com/release-phases.md)中で、現在開発中です。問題が発生した場合は、[GitHub プロジェクト](https://github.com/stripe/stripe-terminal-react-native/issues/new/choose) に報告してください。
React Native SDK の使用を開始する際に必要なステップは以下の 4 つです。
1. アプリに [SDK をインストール](https://docs.stripe.com/terminal/payments/setup-integration.md#install)します。
1. アプリを[設定](https://docs.stripe.com/terminal/payments/setup-integration.md#configure)します。
1. アプリとバックエンドで[接続トークンのエンドポイントを設定](https://docs.stripe.com/terminal/payments/setup-integration.md#connection-token)します。
1. アプリで [SDK を初期化](https://docs.stripe.com/terminal/payments/setup-integration.md#initialize)します。
> **Apps on Devices** 導入を構築している場合 (S700/S710 などの Stripe スマートリーダーでアプリを実行) は、このガイドに従ってから、追加の [Android ネイティブ設定ステップ](https://docs.stripe.com/terminal/features/apps-on-devices/build.md?terminal-sdk-platform=react-native#setup-app) を実行する必要もあります。
## SDK をインストールする [クライアント側]
[React Native SDK](https://github.com/stripe/stripe-terminal-react-native) はオープンソースであり、詳細なドキュメントが提供されています。この内部ではネイティブの iOS SDK および Android SDK が使用されます。以下を実行して SDK をインストールします。
#### NPM
```bash
npm install @stripe/stripe-terminal-react-native
```
#### Yarn
```bash
yarn add @stripe/stripe-terminal-react-native
```
#### Expo
```bash
npx expo install @stripe/stripe-terminal-react-native
```
## アプリを設定する [クライアント側]
#### React Native CLI
#### iOS
### Pod
ネイティブ依存関係をインストールするには、`ios` ディレクトリーで `pod install` を実行する必要があります。
### 権限
アプリが Stripe Terminal SDK で動作するように準備するには、Xcode の **Info.plist** ファイルにいくつかの変更を加えます。
1. 次のキーと値のペアを使用して位置サービスを有効にします。
| プライバシー: Location When In Use Usage Description (使用されている位置の確認に関する記述) |
| ------------------------------------------------------------------- |
| **キー** | [NSLocationWhenInUseUsageDescription](https://developer.apple.com/documentation/bundleresources/information_property_list/nslocationwheninuseusagedescription) |
| **値** | **決済を受け付けるには、位置情報へのアクセスが必要です。** |
決済に関連する不正使用のリスクを減らし、不審請求の申請を最小限に抑えるため、Stripe は決済が発生した場所を把握する必要があります。SDK が iOS デバイスの場所を特定できない場合は、位置情報へのアクセスが復元されるまで決済無効化されます。
1. アプリがバックグラウンドで実行され、Bluetooth リーダーに接続されたままであることを確認してください。
| Bluetooth リーダーに必要なバックグラウンドモード |
| ----------------------------- |
| **キー** | [UIBackgroundModes](https://developer.apple.com/documentation/bundleresources/information_property_list/uibackgroundmodes) |
| **値** | **bluetooth-central** (Bluetooth LE アクセサリーを使用) |
[bluetooth-central](https://developer.apple.com/library/archive/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/CoreBluetoothBackgroundProcessingForIOSApps/PerformingTasksWhileYourAppIsInTheBackground.html#//apple_ref/doc/uid/TP40013257-CH7-SW6) バックグラウンドモードを設定すると、アプリがバックグラウンドで実行されている場合、または iOS デバイスがロックされている場合に、リーダーをスタンバイモードで保持することができます。この値がないと、スタンバイは失敗します。アプリがバックグラウンドで実行されている場合、リーダーは電力を節約するために自動的にオフになります。
1. アプリで Bluetooth に対する権限のダイアログを表示できるようにします。これは、アプリが Bluetooth リーダーへの接続に対応していない場合でも含める必要がある、アプリストアの必須要件です。
| プライバシー: Bluetooth Always Usage Description (Bluetooth の常時使用に関する記述) |
| ------------------------------------------------------------------ |
| **キー** | [NSBluetoothAlwaysUsageDescription](https://developer.apple.com/documentation/bundleresources/information_property_list/NSBluetoothAlwaysUsageDescription) |
| **値** | **このアプリは、Bluetooth を使用してサポート対象のカードリーダーに接続します。** |
iOS 13 では、アプリによる Bluetooth 周辺機器の使用に関して、これまでよりも具体的な権限が新たに導入されました。Core Bluetooth とリンクするアプリは、初回起動時にアプリがクラッシュしないように、このキーを Info.plist ファイルに含める必要があります。
1. App Store に提出する際に、アプリの検証確認を渡します。SDK バージョン 3.4.0 では、この権限要件は削除されています。
| プライバシー: Bluetooth Peripheral Usage Description (Bluetooth 周辺機器の使用に関する記述) |
| ------------------------------------------------------------------------ |
| **キー** | [NSBluetoothPeripheralUsageDescription](https://developer.apple.com/documentation/bundleresources/information_property_list/nsbluetoothperipheralusagedescription) |
| **値** | **サポート対象のカードリーダーに接続するには、Bluetooth 接続が必要です。** |
これは一例です。アプリ内でのユーザーの権限を求めるプロンプトの文言を変更することもできます。
1. アプリの **Info.plist** を保存します。これで、正しく設定され、Stripe Terminal SDK で使用できるようになりました。
> iPhone のタッチ決済を使用している場合は、Apple 開発者アカウントから iPhone のタッチ決済開発エンタイトルメントを [リクエストおよび設定](https://developer.apple.com/documentation/proximityreader/setting-up-the-entitlement-for-tap-to-pay-on-iphone) する必要があります。
#### Android
### 権限
Stripe Terminal SDK を正しく機能させるには、次の Android 権限が必要です。
- `PermissionsAndroid.PERMISSIONS.BLUETOOTH_CONNECT`
- `PermissionsAndroid.PERMISSIONS.BLUETOOTH_SCAN`
- `PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION`
Terminal SDK を初期化する前に、`requestNeededAndroidPermissions` ヘルパー関数を使用して、必要なすべての権限を自動的にリクエストしてください。
```js
import { requestNeededAndroidPermissions } from '@stripe/stripe-terminal-react-native';
try {
const granted = await requestNeededAndroidPermissions({
accessFineLocation: {
title: 'Location Permission',
message: 'Stripe Terminal needs access to your location',
buttonPositive: 'Accept',
},
});
if (granted) {
// Initialize the SDK
} else {
console.error(
'Location and BT services are required to connect to a reader.'
);
}
} catch (e) {
console.error(e);
}
```
また、権限リクエストを細かく制御する必要がある場合は、`PermissionsAndroid.request` を使用して各権限を手動でリクエストできます。
```js
import { PermissionsAndroid } from 'react-native';
// Mobile readers using Bluetooth connection require BLUETOOTH_CONNECT, BLUETOOTH_SCAN, and ACCESS_FINE_LOCATION.
// This example shows the pattern for requesting one permission.
const granted = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
{
title: 'Location Permission',
message: 'Stripe Terminal needs access to your location',
buttonPositive: 'Accept',
},
);
if (granted === PermissionsAndroid.RESULTS.GRANTED) {
console.log('Location permission granted');
} else {
console.error('Location permission denied');
}
```
### マニフェスト
Android 12 以降との互換性を確保するため、必ず `android:exported="true"` を `AndroidManifest.xml` に追加してください。
```xml
```
Android 12 で行われた変更についての詳細は、[Android のドキュメント、コンポーネントのエクスポートの安全性を改善](https://developer.android.com/about/versions/12/behavior-changes-12#exported)をご覧ください。
Android 11 以前を実行するデバイスについては、マニフェストでも権限を付与する必要があります。
```xml
```
#### Expo
> [カスタムネイティブコード](https://docs.expo.io/workflow/customizing/)が必要なため、このパッケージは「Expo Go」アプリでは使用できません。ネイティブプロジェクトを生成し、`npx expo run:ios` または `npx expo run:android` を使用してアプリを実行するには、`npx expo prebuild` を使用する必要があります。
#### iOS
### SDK を設定する
SDK を[インストール](https://docs.stripe.com/terminal/payments/setup-integration.md#installation)したら、[設定プラグイン](https://docs.expo.io/guides/config-plugins/)を `app.json` または `app.config.js` の [plugins](https://docs.expo.io/versions/latest/config/app/#plugins) 配列に追加します。
お使いのリーダーの種類に応じて、以下の設定オプションを設定してください。
- `localNetworkUsagePermission` - LAN 接続を使用するスマートリーダーに必須です
- `appDelegate` - Android のタッチ決済に必須です
- `tapToPayCheck` - タッチ決済互換性チェックを有効にします
```json
{
"expo": {
"plugins": [
[
"@stripe/stripe-terminal-react-native",
{
"bluetoothBackgroundMode": true,
"locationWhenInUsePermission": "Location access is required to accept payments.",
"bluetoothPeripheralPermission": "Bluetooth access is required to connect to supported bluetooth card readers.",
"bluetoothAlwaysUsagePermission": "This app uses Bluetooth to connect to supported card readers.",
"localNetworkUsagePermission": "This app uses the local WiFi network to connect to supported card readers.",
"appDelegate": true,
"tapToPayCheck": true
}
]
]
}
}
```
### 構築する
次に、以下を使用し、[カスタムのネイティブコードを追加する](https://docs.expo.io/workflow/customizing/)ガイドの説明に従って、アプリを再構築します。
```bash
npx expo prebuild
```
次に、以下を実行します。
```bash
npx expo run:ios
```
> iPhone のタッチ決済を使用している場合は、Apple 開発者アカウントから iPhone のタッチ決済開発エンタイトルメントを [リクエストおよび設定](https://developer.apple.com/documentation/proximityreader/setting-up-the-entitlement-for-tap-to-pay-on-iphone) する必要があります。
#### Android
### 権限
Stripe Terminal SDK を正しく機能させるには、次の Android 権限が必要です。
- `PermissionsAndroid.PERMISSIONS.BLUETOOTH_CONNECT`
- `PermissionsAndroid.PERMISSIONS.BLUETOOTH_SCAN`
- `PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION`
Terminal SDK を初期化する前に、`requestNeededAndroidPermissions` ヘルパー関数を使用して、必要なすべての権限を自動的にリクエストしてください。
```js
import { requestNeededAndroidPermissions } from '@stripe/stripe-terminal-react-native';
try {
const granted = await requestNeededAndroidPermissions({
accessFineLocation: {
title: 'Location Permission',
message: 'Stripe Terminal needs access to your location',
buttonPositive: 'Accept',
},
});
if (granted) {
// Initialize the SDK
} else {
console.error(
'Location and BT services are required to connect to a reader.'
);
}
} catch (e) {
console.error(e);
}
```
また、権限リクエストを細かく制御する必要がある場合は、`PermissionsAndroid.request` を使用して各権限を手動でリクエストできます。
```js
import { PermissionsAndroid } from 'react-native';
// Mobile readers using Bluetooth connection require BLUETOOTH_CONNECT, BLUETOOTH_SCAN, and ACCESS_FINE_LOCATION.
// This example shows the pattern for requesting one permission.
const granted = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
{
title: 'Location Permission',
message: 'Stripe Terminal needs access to your location',
buttonPositive: 'Accept',
},
);
if (granted === PermissionsAndroid.RESULTS.GRANTED) {
console.log('Location permission granted');
} else {
console.error('Location permission denied');
}
```
### SDK を設定する
SDK を[インストール](https://docs.stripe.com/terminal/payments/setup-integration.md#installation)したら、[設定プラグイン](https://docs.expo.io/guides/config-plugins/)を `app.json` または `app.config.js` の [plugins](https://docs.expo.io/versions/latest/config/app/#plugins) 配列に追加します。
お使いのリーダーの種類に応じて、以下の設定オプションを設定してください。
- `localNetworkUsagePermission` - LAN 接続を使用するスマートリーダーに必須です
- `appDelegate` - Android のタッチ決済に必須です
- `tapToPayCheck` - タッチ決済互換性チェックを有効にします
```json
{
"expo": {
"plugins": [
[
"@stripe/stripe-terminal-react-native",
{
"bluetoothBackgroundMode": true,
"locationWhenInUsePermission": "Location access is required to accept payments.",
"bluetoothPeripheralPermission": "Bluetooth access is required to connect to supported bluetooth card readers.",
"bluetoothAlwaysUsagePermission": "This app uses Bluetooth to connect to supported card readers.",
"localNetworkUsagePermission": "This app uses the local WiFi network to connect to supported card readers.",
"appDelegate": true,
"tapToPayCheck": true
}
]
]
}
}
```
#### 構築する
次に、以下を使用し、[カスタムのネイティブコードを追加する](https://docs.expo.io/workflow/customizing/)ガイドの説明に従って、アプリを再構築します。
```bash
npx expo prebuild
```
次に、以下を実行します。
```bash
npx expo run:android
```
## 接続トークンのエンドポイントを設定する [サーバー側] [クライアント側]
### サーバー側
リーダーに接続するには、バックエンドからご自身の Stripe アカウントに、リーダーを使用するための SDK 権限を付与する必要があります。それには、[ConnectionToken (接続トークン)](https://docs.stripe.com/api/terminal/connection_tokens.md) から [secret (シークレット)](https://docs.stripe.com/api/terminal/connection_tokens/object.md#terminal_connection_token_object-secret) を提供します。バックエンドは信頼できるクライアントに対してのみ、接続トークンを作成するようにする必要があります。
#### curl
```bash
curl https://api.stripe.com/v1/terminal/connection_tokens \
-u <>: \
-X "POST"
```
サーバー側の `ConnectionToken` からシークレットを取得してクライアント側に渡します。
#### Ruby
```ruby
post '/connection_token' do
token = # ... Create or retrieve the ConnectionToken
{secret: token.secret}.to_json
end
```
> `ConnectionToken` の `secret` により、お客様は任意の Stripe Terminal リーダーに接続して、Stripe アカウントで支払いを受け取ることができます。必ず、接続トークンの作成に使用するエンドポイントを認証し、クロスサイトリクエストフォージェリ (CSRF) から保護してください。
### クライアント側
SDK にこのエンドポイントへのアクセスを許可するには、バックエンドから `ConnectionToken` をリクエストするトークンプロバイダーの単一の関数を作成します。
```js
import { StripeTerminalProvider } from '@stripe/stripe-terminal-react-native';
const fetchTokenProvider = async () => {
const response = await fetch(`{YOUR BACKEND URL}/connection_token`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
});
const { secret } = await response.json();
return secret;
};
```
この関数は、SDK で Stripe またはリーダーの認証が必要になるたびに呼び出されます。また、リーダーへの接続に新しい接続トークンが必要な場合 (アプリがリーダーから切断されたときなど) にも呼び出されます。SDK がバックエンドから新しい接続トークンを取得できない場合、リーダーへの接続は失敗し、サーバーからエラーが返されます。
> 接続トークンのキャッシュやハードコードはしないでください。SDK が接続トークンのライフサイクルを管理します。
## SDK を初期化する [クライアント側]
作業を開始するには、[ステップ 3](https://docs.stripe.com/terminal/payments/setup-integration.md#connection-token) で実装したトークンプロバイダーをプロパティとして `StripeTerminalProvider` に渡します。
```js
import { StripeTerminalProvider } from '@stripe/stripe-terminal-react-native';
function Root() {
const fetchTokenProvider = async () => {
const response = await fetch(`${API_URL}/connection_token`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
});
const { secret } = await response.json();
return secret;
};
return (
);
}
```
最後のステップとして、`useStripeTerminal` フックから `initialize` メソッドを呼び出します。
> `initialize` メソッドは、`StripeTerminalProvider` を含むコンポーネントからではなく、`StripeTerminalProvider` 内にネストされたコンポーネントから呼び出す必要があります。
>
> 初期化が完了すると、`discoverReaders`、`collectPaymentMethod`、`confirmPaymentIntent` などの他の SDK メソッドを使用できます。初期化の前にこれらのメソッドを呼び出そうとすると、「アクションを実行する前に、まず Stripe Terminal SDK を初期化してください」というエラーが表示されます。
```js
function App() {
const { initialize } = useStripeTerminal();
useEffect(() => {
initialize();
}, []);
return ;
}
```
## SDK の更新
Stripe は定期的に、新機能、バグ修正、セキュリティー更新を含む更新をリリースしています。SDK は、新しいバージョンが利用可能になり次第すぐに更新してください。現在利用可能な SDK は以下のとおりです。
- [Stripe Terminal Android SDK](https://github.com/stripe/stripe-terminal-android/releases)
- [Stripe Terminal iOS SDK](https://github.com/stripe/stripe-terminal-ios/releases)
- [Stripe Terminal JavaScript SDK](https://docs.stripe.com/terminal/references/api/js-sdk.md#changelog)
- [Stripe Terminal React Native SDK](https://github.com/stripe/stripe-terminal-react-native)
## 次のステップ
- [リーダーに接続する](https://docs.stripe.com/terminal/payments/connect-reader.md?terminal-sdk-platform=react-native&reader-type=internet)
# Apps on Devices
> This is a Apps on Devices for when terminal-sdk-platform is apps-on-devices. View the full page at https://docs.stripe.com/terminal/payments/setup-integration?terminal-sdk-platform=apps-on-devices.
Apps on Devices を使用して、お客様のデバイスで他のアプリとともに POS アプリケーションを実行します。POS アプリを Stripe スマートリーダーにデプロイして、オールインワンのソリューションを提供したり、別のデバイスで実行されている POS を利用する顧客向けの決済用アプリを構築したりすることができます。
Stripe が Stripe Terminal Android SDK ですべての決済とコンプライアンスを処理します。
[Apps on Devices](https://docs.stripe.com/terminal/features/apps-on-devices/overview.md) の詳細をご覧ください。また、[サンプルアプリ](https://github.com/stripe-samples/terminal-apps-on-devices)では、導入のベストプラクティスや、支払いを回収して確定する方法などもご覧いただけます。