# Connect で Terminal を使用 Stripe Terminal を Connect プラットフォームに組み込みます。 Stripe Terminal は、*Connect* (Connect is Stripe's solution for multi-party businesses, such as marketplace or software platforms, to route payments between sellers, customers, and other recipients) と互換性があり、プラットフォームおよび連結アカウントで対面支払いを受け付けられるようにします。 プラットフォームが連結アカウントの支払いを処理する方法に従って、Terminal を Connect に統合します。 - [ダイレクト支払い](https://docs.stripe.com/connect/direct-charges.md)を使用する場合は、プラットフォームの API キーと `Stripe-Account` ヘッダーを使用して連結アカウントを識別し、リーダーを設定して決済を受け付けるための Terminal API リクエストを送信します。 - [デスティネーション支払い](https://docs.stripe.com/connect/destination-charges.md)を使用する場合は、Terminal API リクエストを送信してリーダーを設定し、プラットフォーム API キーを使用して決済を受け付け、メタデータを使用して連結アカウントを識別します。 - [支払いと送金別方式](https://docs.stripe.com/connect/separate-charges-and-transfers.md)を使用する場合は、プラットフォーム API キーを使用して Terminal API リクエストを送信し、プラットフォームアカウントで決済を作成し、連結アカウントに資金を移動する別送金を作成します。 どちらの場合も、[Locations](https://docs.stripe.com/api/terminal/locations.md)を使用してリーダーをグループ化します。 > Terminal 連結アカウントが取引を行うには、`card_payments` ケイパビリティが必要です。 # ダイレクト支払い > This is a ダイレクト支払い for when connect-charge-type is direct. View the full page at https://docs.stripe.com/terminal/features/connect?connect-charge-type=direct. ## 連結アカウントがリーダーを所有 この導入では、すべての API リソースはプラットフォームではなく連結アカウントに属します。連結アカウントが、Stripe の手数料、返金、チャージバックのコストに責任を負います。 ダッシュボードに連結アカウントとしてログインすると、Terminal データを表示することができます。 ### 店舗とリーダーの作成 (サーバー側) API リクエストに `Stripe-Account` ヘッダーを含めることで、連結アカウント用の [Locations](https://docs.stripe.com/terminal/fleet/locations-and-zones.md?dashboard-or-api=dashboard#create-locations-and-zones) と [Readers](https://docs.stripe.com/terminal/payments/connect-reader.md?reader-type=internet) を作成できます。連結アカウントの Stripe ダッシュボードで **View as** をクリックすると、リーダーを登録することもできます。 ```curl curl https://api.stripe.com/v1/terminal/locations \ -u "<>:" \ -H "Stripe-Account: {{CONNECTEDACCOUNT_ID}}" \ -d display_name=HQ \ -d "address[line1]=1272 Valencia Street" \ -d "address[city]=San Francisco" \ -d "address[state]=CA" \ -d "address[country]=US" \ -d "address[postal_code]=94110" ``` ```curl curl https://api.stripe.com/v1/terminal/readers \ -u "<>:" \ -H "Stripe-Account: {{CONNECTEDACCOUNT_ID}}" \ -d registration_code={{READER_REGISTRATION_CODE}} \ --data-urlencode "label=Alice's reader" \ -d "location={{TERMINALLOCATION_ID}}" ``` ### 接続トークンの作成 (サーバー側) > [Connect OAuth](https://docs.stripe.com/connect/oauth-reference.md) 認証を使用する場合、本番環境とサンドボックスでそれぞれ、各モード専用のアプリケーションクライアント ID を使用して連結アカウントを別々にオーソリする必要があります。 Terminal SDK 用に [ConnectionToken](https://docs.stripe.com/api/terminal/connection_tokens.md) を作成する際は、`Stripe-Account` ヘッダーで、支払いを受け付ける連結アカウントを設定します。リーダーのアクセスを制御するために、`location` パラメーターを指定することもできます。location を指定した場合、`ConnectionToken` はその店舗に割り当てられたリーダーでのみ利用可能になります。location を指定しない場合、すべてのリーダーが `ConnectionToken` を使用できます。 ```curl curl https://api.stripe.com/v1/terminal/connection_tokens \ -u "<>:" \ -H "Stripe-Account: {{CONNECTEDACCOUNT_ID}}" \ -d "location={{TERMINALLOCATION_ID}}" ``` サーバー主導型の実装を使用している場合は、接続トークンを作成する必要はありません。 ### PaymentIntents を作成する (クライアント側) (サーバー側) iOS、Android、React Native の SDK を使用すると、クライアントまたはサーバーで `PaymentIntent` を作成できます。JavaScript SDK は、サーバー側の作成のみに対応しています。 #### クライアント側 クライアント側でダイレクト支払い用の `PaymentIntent` を作成するときに、`PaymentIntent` に追加のパラメーターを指定する必要はありません。その代わり、ConnectionToken を作成するときに、決済を受け付ける連結アカウントの `Stripe-Account` ヘッダーで `ConnectionToken` を作成します。クライアントの SDK では、`ConnectionToken` が属する同じ連結アカウントで `PaymentIntent` を作成します。詳細については、[クライアント側の PaymentIntents を作成する](https://docs.stripe.com/terminal/payments/collect-card-payment.md#create-client-side)をご覧ください。 #### サーバー側 JavaScript SDK では、サーバー上で `PaymentIntent` を作成する必要があります。他のクライアントの SDK で、支払いの開始に必要な情報をアプリですぐに利用できない場合には、サーバー上に `PaymentIntent` を作成することをお勧めします。詳細については、[PaymentIntents を作成する (サーバー側)](https://docs.stripe.com/terminal/payments/collect-card-payment.md?terminal-sdk-platform=js#create-payment) をご覧ください。 サーバー側でダイレクト支払い用の `PaymentIntent` を作成するときは、`Stripe-Account` ヘッダーに連結アカウントを設定します。 ```curl curl https://api.stripe.com/v1/payment_intents \ -u "<>:" \ -H "Stripe-Account: {{CONNECTEDACCOUNT_ID}}" \ -d amount=1000 \ -d currency=usd \ -d "payment_method_types[]=card_present" \ -d capture_method=manual ``` 次に、PaymentIntent を処理するために[決済を徴収](https://docs.stripe.com/terminal/payments/collect-card-payment.md)するステップに従います。 ## プラットフォーム所有のリーダー (Private preview) > プラットフォームがリーダーを所有し、ダイレクト支払いで管理することに関心をお持ちの場合は、[Stripe にお問い合わせください](mailto:stripe-terminal-betas@stripe.com)。このプライベートプレビュー機能は、現在[サーバー主導型実装](https://docs.stripe.com/terminal/payments/setup-integration.md?terminal-sdk-platform=server-driven)を使用する[スマートリーダー](https://docs.stripe.com/terminal/smart-readers.md)でご利用いただけます。この実装は、単一のプラットフォームを通じて管理する連結アカウントでのみ機能します。 この導入では、プラットフォームは [Location](https://docs.stripe.com/api/terminal/locations.md) や [Reader](https://docs.stripe.com/api/terminal/readers.md) などのデバイスリソースを所有し、連結アカウントは [PaymentIntents](https://docs.stripe.com/api/payment_intents.md) などの決済リソースを所有します。これにより、プラットフォームは、複数の連結アカウントの支払いを処理する 1 つのリーダーを管理できます。Stripe の手数料、返金、チャージバックのコストは連結アカウントが負担します。 ダッシュボードでは、プラットフォームアカウントにログインしているときに Terminal デバイス管理データを直接表示できます。連結アカウントとしてログインすることで、支払いデータを表示できます。 ### 店舗とリーダーの作成 連結アカウント別に Reader オブジェクトをグループ化するには、オブジェクトを `Locations` に割り当てます。プラットフォームアカウントで、アカウントを識別する表示名を使用して、連結アカウントの [Location を作成](https://docs.stripe.com/terminal/fleet/locations-and-zones.md?dashboard-or-api=dashboard#create-locations-and-zones)します。 ```curl curl https://api.stripe.com/v1/terminal/locations \ -u "<>:" \ -d display_name=HQ \ -d "address[line1]=1272 Valencia Street" \ -d "address[city]=San Francisco" \ -d "address[state]=CA" \ -d "address[country]=US" \ -d "address[postal_code]=94110" ``` アプリケーションを[スマートリーダー](https://docs.stripe.com/terminal/payments/connect-reader.md?reader-type=internet)に接続するには、事前にリーダーをプラットフォームアカウントに登録しておく必要があります。 ```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}}" ``` ### PaymentIntent を作成する ダイレクト支払い用の `PaymentIntent` を作成するときは、`Stripe-Account` ヘッダーに連結アカウントを設定します。 > 単一のプラットフォームで管理する連結アカウントのために作成した PaymentIntents のみ、プラットフォームは後から処理できます。 ```curl curl https://api.stripe.com/v1/payment_intents \ -u "<>:" \ -H "Stripe-Account: {{CONNECTEDACCOUNT_ID}}" \ -d amount=1000 \ -d currency=usd \ -d "payment_method_types[]=card_present" \ -d capture_method=manual ``` ### PaymentIntents を処理する プラットフォームは、プラットフォームが所有するリーダーを使用して、連結アカウントの `PaymentIntent` を処理できます。 > PaymentIntent は、`Stripe-Account` ヘッダーを使用して作成した場合にのみ処理できます。 ```curl curl https://api.stripe.com/v1/terminal/readers/{{TERMINALREADER_ID}}/process_payment_intent \ -u "<>:" \ -d "payment_intent={{PAYMENTINTENT_ID}}" ``` # デスティネーション支払い > This is a デスティネーション支払い for when connect-charge-type is destination. View the full page at https://docs.stripe.com/terminal/features/connect?connect-charge-type=destination. [デスティネーション支払い](https://docs.stripe.com/connect/destination-charges.md)を使用する場合、プラットフォームは [PaymentIntents](https://docs.stripe.com/api/payment_intents.md) や[店舗](https://docs.stripe.com/api/terminal/locations.md) などの API リソースを所有します。各支払いは、連結アカウントに送金を自動的に作成します。 ダッシュボードにプラットフォームアカウントでログインすると、Terminal データを直接表示することができます。 ## 店舗とリーダーの作成 (サーバー側) 連結アカウント別に Reader オブジェクトをグループ化するには、オブジェクトを `Locations` に割り当てます。プラットフォームアカウントで、アカウントを識別する表示名を使用して、連結アカウントの [Location を作成](https://docs.stripe.com/terminal/fleet/locations-and-zones.md?dashboard-or-api=dashboard#create-locations-and-zones)します。 ```curl curl https://api.stripe.com/v1/terminal/locations \ -u "<>:" \ -d display_name=HQ \ -d "address[line1]=1272 Valencia Street" \ -d "address[city]=San Francisco" \ -d "address[state]=CA" \ -d "address[country]=US" \ -d "address[postal_code]=94110" ``` アプリケーションを[スマートリーダー](https://docs.stripe.com/terminal/payments/connect-reader.md?reader-type=internet)に接続するには、事前にリーダーをプラットフォームアカウントに登録しておく必要があります。 ```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}}" ``` ## 接続トークンの作成 (サーバー側) Terminal SDK の `ConnectionToken` を作成するときは、プラットフォームアカウントのシークレットキーを使用します。`Stripe-Account` ヘッダーは設定しないでください。リーダーへのアクセスを制御するには、`location` パラメーターを指定します。店舗を指定すると、`ConnectionToken` はその店舗に割り当てられたリーダーでのみ利用可能になります。店舗を指定しないと、`ConnectionToken` はすべてのリーダーで利用可能になります。 ```curl curl https://api.stripe.com/v1/terminal/connection_tokens \ -u "<>:" \ -d "location={{TERMINALLOCATION_ID}}" ``` サーバー主導型の実装を使用している場合は、接続トークンを作成する必要はありません。 ## PaymentIntents を作成する (クライアント側) (サーバー側) デスティネーション支払いを使用して `PaymentIntent` を作成するときは、[on_behalf_of](https://docs.stripe.com/api/payment_intents/create.md#create_payment_intent-on_behalf_of)、[transfer_data[destination]](https://docs.stripe.com/api/payment_intents/create.md#create_payment_intent-transfer_data-destination)、[application_fee_amount](https://docs.stripe.com/api/payment_intents/create.md#create_payment_intent-application_fee_amount) の各パラメーターを指定します。 `on_behalf_of` パラメーターは、支払いの売上処理加盟店となる連結アカウントの ID です。Terminal の取引では、プラットフォームの国と連結アカウントの国が異なる場合、このパラメーターを設定する必要があります。`on_behalf_of` が設定されていると、Stripe は自動的に次のように動作します: - 指定されたアカウントの国での売上処理。この処理によって支払い拒否を最小限に抑え、通貨換算を回避します。 - 連結アカウントの国の手数料体系を使用します。 - 顧客のクレジットカード明細書に、プラットフォームの住所と電話番号ではなく、連結アカウントの住所と電話番号を記載します (アカウントとプラットフォームの国が異なる場合のみ)。 `transfer_data[destination]` には、送金を受け取る連結アカウントの ID を設定します。 最後に、[application_fee_amount](https://docs.stripe.com/api/payment_intents/create.md#create_payment_intent-application_fee_amount) パラメーターを指定することによって、プラットフォーム手数料を差し引くことができます。 ### クライアント側 iOS、Android、React Native の SDK では、クライアント側で `PaymentIntent` を作成して、`onBehalfOf`、`transferDataDestination`、`applicationFeeAmount` の各パラメーターを指定できます。 #### JavaScript > クライアント側では、他の SDK を使用して `PaymentIntent` を作成できます。Stripe Terminal で JavaScript SDK を使用している場合は、サーバ側で `PaymentIntent` を作成します。 #### iOS - [PaymentIntentParameters (iOS)](https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPPaymentIntentParameters.html) > アプリが Verifone P400 に接続されている場合は、iOS SDK から `PaymentIntent` を作成できません。 > > 代わりに、[サーバ側で PaymentIntent を作成](https://docs.stripe.com/terminal/payments/collect-card-payment.md#create-server-side)し、SDK の `Terminal.retrievePaymentIntent` メソッドを使用して、`PaymentIntent` をアプリ内に取得する必要があります。 #### Swift ```swift import UIKit import StripeTerminal class PaymentViewController: UIViewController { // ... // Action for a "Checkout" button func checkoutAction() throws { let params = try PaymentIntentParametersBuilder(amount: 1000, currency: "usd") .setOnBehalfOf(""{{CONNECTED_ACCOUNT_ID}}"") .setTransferDataDestination(""{{CONNECTED_ACCOUNT_ID}}"") .setApplicationFeeAmount(200) .build() Terminal.shared.createPaymentIntent(params) { createResult, createError in if let error = createError { print("createPaymentIntent failed: \(error)") } else if let paymentIntent = createResult { print("createPaymentIntent succeeded") // ... } } } // ... } ``` #### Android - [PaymentIntentParameters (Android)](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-payment-intent-parameters/index.html) > アプリが Verifone P400 に接続されている場合は、Android SDK から `PaymentIntent` を作成できません。 > > 代わりに、[サーバ側で PaymentIntent を作成](https://docs.stripe.com/terminal/payments/collect-card-payment.md#create-server-side)し、SDK の `Terminal.retrievePaymentIntent` メソッドを使用して、`PaymentIntent` をアプリ内に取得する必要があります。 #### Kotlin ```kotlin val params = PaymentIntentParameters.Builder() .setAmount(1000) .setCurrency("usd") .setOnBehalfOf(""{{CONNECTED_ACCOUNT_ID}}"") .setTransferDataDestination(""{{CONNECTED_ACCOUNT_ID}}"") .setApplicationFeeAmount(200) .build() Terminal.getInstance().createPaymentIntent( params, object : PaymentIntentCallback { override fun onSuccess(paymentIntent: PaymentIntent) { // Placeholder for handling successful operation } override fun onFailure(e: TerminalException) { // Placeholder for handling exception } } ) ``` #### React Native - [CreatePaymentIntentParams (React Native)](https://stripe.dev/stripe-terminal-react-native/api-reference/index.html#CreatePaymentIntentParams) > アプリが Verifone P400 に接続されている場合は、React Native SDK から `PaymentIntent` を作成できません。 > > 代わりに、[サーバ側で PaymentIntent を作成](https://docs.stripe.com/terminal/payments/collect-card-payment.md#create-server-side)し、SDK の `retrievePaymentIntent` メソッドを使用して、`PaymentIntent` をアプリ内に取得する必要があります。 ```js const {paymentIntent, error} = await createPaymentIntent({ amount: 1000, currency: "usd", onBehalfOf: "{{CONNECTED_ACCOUNT_ID}}" , transferDataDestination: "{{CONNECTED_ACCOUNT_ID}}", applicationFeeAmount: 200, }); if (error) { // Placeholder for handling exception return; } // Placeholder for collecting a payment method with PaymentIntent ``` ### サーバー側 JavaScript SDK では、サーバー上で `PaymentIntent` を作成する必要があります。他のクライアントの SDK で、支払いの開始に必要な情報をアプリですぐに利用できない場合には、サーバー上に `PaymentIntent` を作成することをお勧めします。詳細については、[PaymentIntents を作成する (サーバー側)](https://docs.stripe.com/terminal/payments/collect-card-payment.md?terminal-sdk-platform=js#create-payment) をご覧ください。 ```curl curl https://api.stripe.com/v1/payment_intents \ -u "<>:" \ -d amount=1000 \ -d currency=usd \ -d "payment_method_types[]=card_present" \ -d capture_method=manual \ -d application_fee_amount=200 \ -d "on_behalf_of={{CONNECTEDACCOUNT_ID}}" \ -d "transfer_data[destination]={{CONNECTEDACCOUNT_ID}}" ``` 次に、PaymentIntent を処理するために[決済を徴収](https://docs.stripe.com/terminal/payments/collect-card-payment.md)するステップに従います。 # 支払いと送金別方式 > This is a 支払いと送金別方式 for when connect-charge-type is separate. View the full page at https://docs.stripe.com/terminal/features/connect?connect-charge-type=separate. [支払いと送金別方式](https://docs.stripe.com/connect/separate-charges-and-transfers.md)を使用する場合、プラットフォームは [PaymentIntents](https://docs.stripe.com/api/payment_intents.md) や[Locations](https://docs.stripe.com/api/terminal/locations.md)などの API リソースを所有します。最初にプラットフォームのアカウントで決済を作成し、次に連結アカウントに資金を移動する送金を作成します。これにより、複数の連結アカウント間で決済を分割できます。 ダッシュボードにプラットフォームアカウントでログインすると、Terminal データを直接表示することができます。 ## 店舗とリーダーの作成 (サーバー側) 連結アカウント別に `Reader` オブジェクトをグループ化するには、オブジェクトを `Locations` に割り当てます。プラットフォームアカウントで、アカウントを識別する表示名を使用して、連結アカウントの [店舗を作成](https://docs.stripe.com/terminal/fleet/locations-and-zones.md?dashboard-or-api=dashboard#create-locations-and-zones)します。 ```curl curl https://api.stripe.com/v1/terminal/locations \ -u "<>:" \ -d display_name=HQ \ -d "address[line1]=1272 Valencia Street" \ -d "address[city]=San Francisco" \ -d "address[state]=CA" \ -d "address[country]=US" \ -d "address[postal_code]=94110" ``` アプリケーションを[スマートリーダー](https://docs.stripe.com/terminal/payments/connect-reader.md?reader-type=internet)に接続するには、事前にリーダーをプラットフォームアカウントに登録しておく必要があります。 ```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}}" ``` ## 接続トークンの作成 (サーバー側) Terminal SDK の `ConnectionToken` を作成するときは、プラットフォームアカウントのシークレットキーを使用します。`Stripe-Account` ヘッダーは設定しないでください。リーダーへのアクセスを制御するには、`location` パラメーターを指定します。店舗を指定すると、`ConnectionToken` はその店舗に割り当てられたリーダーでのみ利用可能になります。店舗を指定しないと、`ConnectionToken` はすべてのリーダーで利用可能になります。 ```curl curl https://api.stripe.com/v1/terminal/connection_tokens \ -u "<>:" \ -d "location={{TERMINALLOCATION_ID}}" ``` サーバー主導型の実装を使用している場合は、接続トークンを作成する必要はありません。 ## PaymentIntents を作成する (Server-side) プラットフォームアカウントで `PaymentIntent` を作成します。オプションで、`transfer_group` パラメーターを指定して、追跡目的で関連する決済と送金を特定できます。 ```curl curl https://api.stripe.com/v1/payment_intents \ -u "<>:" \ -d amount=1000 \ -d currency=usd \ -d "payment_method_types[]=card_present" \ -d capture_method=manual \ -d transfer_group=ORDER_95 ``` 次に、PaymentIntent を処理するために[決済を徴収](https://docs.stripe.com/terminal/payments/collect-card-payment.md)するステップに従います。 ## 送金を作成する (Server-side) `PaymentIntent` をキャプチャーしたら、1つ以上の[送金](https://docs.stripe.com/api/transfers.md)を作成して連結アカウントに資金を移動できます。 連結アカウントを送金先として指定して送金します。オプションとして `transfer_group` を含めて、送金を元の決済に関連付けることができます。 ```curl curl https://api.stripe.com/v1/transfers \ -u "<>:" \ -d amount=700 \ -d currency=usd \ -d "destination={{CONNECTEDACCOUNT_ID}}" \ -d transfer_group=ORDER100 ``` ### 送金利用可能性 デフォルトでは、金額がプラットフォームの利用可能なアカウント残高を超えると、送金リクエストは失敗します。これを回避するには、[source_transaction](https://docs.stripe.com/api/transfers/create.md#create_transfer-source_transaction) パラメーターを使用して送金を特定の決済に関連付けます。これにより、資金が利用可能な残高でまだ売上処理されていなくても、送金リクエストを成功させることができます。送金リクエストは、関連する決済からの資金が利用可能になると自動的に実行されます。 `source_transaction` を使用するには、まず PaymentIntent の [latest_charge](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-latest_charge) 属性から決済 ID を取得します。 ```curl curl https://api.stripe.com/v1/transfers \ -u "<>:" \ -d amount=700 \ -d currency=usd \ -d "destination={{CONNECTEDACCOUNT_ID}}" \ -d "source_transaction={{CHARGE_ID}}" \ -d transfer_group=ORDER100 ``` ### 複数のアカウントに決済を分割する 決済を複数の連結アカウントに分割するには、アカウントごとに送金を作成します。 ```curl curl https://api.stripe.com/v1/transfers \ -u "<>:" \ -d amount=400 \ -d currency=usd \ -d "destination={{CONNECTEDACCOUNT_ID}}" \ -d transfer_group=ORDER100 ``` ```curl curl https://api.stripe.com/v1/transfers \ -u "<>:" \ -d amount=300 \ -d currency=usd \ -d destination={{OTHER_CONNECTED_ACCOUNT_ID}} \ -d transfer_group=ORDER100 ``` ## See also - [カートの表示](https://docs.stripe.com/terminal/features/display.md) - [領収書](https://docs.stripe.com/terminal/features/receipts.md)