カード支払いを回収する
Stripe Terminal で支払いを回収するには、アプリケーションに支払いフローを記述する必要があります。Stripe Terminal SDK を使用して、1 つの支払いセッションを表すオブジェクトである PaymentIntent (支払いインテント) を作成して更新します。
Terminal の組み込みは支払いプロセスにおける失敗に対応できるように設計されており、支払いプロセスを複数のステップに分割し、各ステップを安全に再試行できるようになっています。
ステップ 1 では、自動または手動のどちらで支払いをキャプチャーするかを定義できます。顧客のカードのオーソリは、SDK が支払いを確定するときにステップ 3 で行われます。
PaymentIntent を作成するクライアント側サーバー側
支払いを回収する最初のステップは、支払いフローを開始することです。顧客が決済フローを開始したときに、アプリケーションは PaymentIntent
オブジェクトを作成する必要があります。これは、Stripe の新しい支払いセッションを表します。
クライアント側またはサーバー側で PaymentIntent を作成できます。
テスト金額を使用して、さまざまな結果を生成してみてください。00
で終わる金額では、支払いが承認されます。
クライアント側
クライアントから PaymentIntent を作成します。
警告
アプリが Verifone P400 に接続されている場合は、iOS SDK から PaymentIntent を作成できません。代わりに、サーバー側で PaymentIntent を作成し、SDK の Terminal.retrievePaymentIntent
メソッドを使用して、アプリ内に PaymentIntent を取得する必要があります。
サーバー側
支払いの開始に必要な情報がアプリですぐに利用できない場合は、サーバーで PaymentIntent
を作成することもできます。
次の例は、サーバーで PaymentIntent
を作成する方法を示しています。
Terminal の支払いでは、payment_method_types
パラメーターに card_present
が含まれている必要があります。
以下のように決済フローを制御できます。
card_present
決済の決済フローを完全に管理するには、capture_method
をmanual
に設定します。これにより、決済を確定する前に照合ステップを追加できます。- 1 ステップで支払いのオーソリとキャプチャーを行うには、
capture_method
をautomatic
に設定します。
注
オーストラリアでは、capture_method
を automatic
または manual_preferred
に設定する必要があります。詳細は、オーストラリ向けのドキュメントをご覧ください。
注
カナダで Interac の支払いを受け付けるには、payment_method_types
に interac_present
も含める必要があります。詳細については、カナダ向けのドキュメントをご覧ください。
PaymentIntent には、各 PaymentIntent の一意のキーである、client secret が格納されます。client secret を使用するには、これをサーバーで PaymentIntent から入手し、クライアント側に渡す必要があります。
最初に client secret を使用して retrievePaymentIntent
をコールしてから、取得した PaymentIntent を使用して collectPaymentMethod
をコールします。
支払い方法を収集する クライアント側
PaymentIntent を作成したら、次のステップは SDK で支払い方法を収集することです。
決済手段を収集するには、アプリをリーダーに接続する必要があります。アプリが collectPaymentMethod
を呼び出した後、接続されたリーダーはカードが提示されるのを待ちます。
この方法では、接続されたカードリーダーを使用して暗号化された支払い方法のデータを収集し、この暗号化されたデータをローカルの PaymentIntent に関連付けます。
注意
決済手段の収集はローカルで行われ、次のステップである支払いの確定 the paymentまで、Payment Intents API オブジェクトのオーソリまたは更新は必要ありません。
決済手段の詳細を調べる (オプション) ベータ
高度なユースケースでは、提示されたカードの決済手段の詳細を調査し、オーソリ前に自社のビジネスロジックを実行できます。
CollectConfiguration
で initWithUpdatePaymentIntent
パラメーターを使用して、PaymentMethod をサーバー側の PaymentIntent に関連付けます。このデータは collectPaymentMethod
レスポンスで返されます。
注
この方法では、収集済みの暗号化された決済手段データを PaymentIntent API オブジェクトへの更新に関連付けます。次のステップである支払いの確定まで、オーソリは必要ありません。
この高度なユースケースは、Verifone P400 またはシミュレーションされた Terminal リーダーではサポートされていません。
この時点で、カードブランド、口座情報、その他の役立つデータなどの属性にアクセスできます。
注
Stripe は wallet.type
属性で示すとおり、取引でモバイルウォレットが使用されたかどうかを検出するよう試みます。ただし、カード発行会社がモバイルウォレットのリーダーによる識別に対応していない場合、この属性は自動入力されないため、正確な検出は保証されません。確定ステップでオーソリが行われた後に、Stripe はネットワークから最新の情報を取得し、wallet.type
を確実に更新します。
収集をキャンセルする
プログラムによるキャンセル
iOS SDK から返される Cancelable
オブジェクトを使用して、支払い方法の収集をキャンセルできます。
顧客によるキャンセル
取引の setEnableCustomerCancellation
を true に設定すると、スマートリーダーのユーザーにはキャンセルボタンが表示されます。キャンセルボタンをタップすると、アクティブな取引がキャンセルされます。
イベントを処理する
内蔵ディスプレイのない BBPOS Chipper 2X BT などのリーダーを使用して決済手段を収集するときは、決済手段の収集プロセスのイベントをアプリからユーザーに表示できるようにする必要があります。これらのイベントは、ユーザーが支払いを正常に回収するのに役立ちます (カードを再試行する、別のカードを試す、別の読み取り方法を使用するなど)。
取引が開始されると、SDK は ReaderInputOptions
値をアプリのリーダー表示ハンドラに渡し、受け入れ可能な入力の種類 (スワイプ、挿入、タップなど) を示します。アプリの決済 UI で、これらのオプションのいずれかを使用してカードを提示することを求める画面をユーザーに表示します。
取引中に、SDK がアプリに対して、アプリのリーダー表示ハンドラに ReaderDisplayMessage
値を渡すことで、ユーザーに追加のメッセージ (「カードを再試行してください」など) を表示するように要求する場合があります。このメッセージが決済 UI でユーザーに表示されることを確認してください。
注
リーダーがイベントを表示するため、決済手段の収集プロセスのイベントをアプリケーションからユーザーに表示する必要はありません。取引の決済手段をクリアするには、リクエストをキャンセルします。
Tap to Pay on iPhone で支払いを回収する
アプリケーション側で支払い回収の準備ができると、Stripe iOS SDK がその画面を引き継いで回収プロセスを進めます。決済手段の収集を呼び出した後は、アプリケーションが実行中のままになりますが、iPhone はカード保有者に全画面のメッセージを表示し、カードまたは NFC ベースのモバイルウォレットを提示するように求めます。カードの読み取りエラーが発生した場合は、再試行を求めるメッセージが表示されます。提示に成功すると、成功のメッセージが表示され、アプリケーションに制御が返されて支払いが確定されます。
支払いの回収
支払いを確定するクライアント側
顧客から決済手段を収集できたら、次のステップでは SDK で支払いを確定します。支払いを続行する準備ができたら、ステップ 2 で更新した PaymentIntent
を使用して、confirmPaymentIntent
を呼び出します。
- 支払いの手動キャプチャーでは、
confirmPaymentIntent
コールが成功すると、PaymentIntent
のステータスがrequires_capture
になります。 - 支払いの自動キャプチャーでは、
PaymentIntent
はsucceeded
状態に移行します。
警告
2 日以内に PaymentIntents
を手動でキャプチャーする必要があり、キャプチャーしなければオーソリは期限切れになり、売上は顧客にリリースされます。
失敗に対処する
支払いの確定に失敗した場合、SDK は、更新された PaymentIntent
を含むエラーを返します。アプリケーションでは、PaymentIntent
を確認してエラーの対処方法を決定する必要があります。
PaymentIntent のステータス | 意味 | 解決策 |
---|---|---|
requires_payment_method | 支払い方法が拒否されました | 同じ PaymentIntent を使用して collectPaymentMethod を再度呼び出し、別の決済手段の収集を試みます。 |
requires_confirmation | 一時的な接続の問題 | 同じ PaymentIntent を使用して、confirmPaymentIntent を再度呼び出し、リクエストを再試行します。 |
PaymentIntent が nil | Stripe へのリクエストがタイムアウトし、PaymentIntent のステータスが不明です | 元の PaymentIntent の確定を再試行します。新しい PaymentIntent を作成しないでください。新しく作成すると、カード保有者に複数のオーソリが発生する可能性があります。 |
タイムアウトが複数回、連続して発生する場合、接続に問題がある可能性があります。アプリがインターネットと通信できることを確認してください。
二重支払いの防止
PaymentIntent オブジェクトは、Stripe での資金移動を可能にします。1 つの取引を表すには、PaymentIntent を 1 つ使用します。
カードが (残高不足などのために) 拒否された後、同じ PaymentIntent を再利用して、顧客が別のカードで再試行できるようにします。
PaymentIntent を編集する場合、collectPaymentMethod
を呼び出して、リーダーの決済情報を更新する必要があります。
PaymentIntent を Stripe で確定するには、ステータスが requires_payment_method
ある必要があります。オーソリ済み、キャプチャー済み、キャンセル済みの PaymentIntent をリーダーで確定することはできません。
支払いをキャプチャーするサーバー側
ステップ 1 の PaymentIntent
の作成時に capture_method
を manual
として定義した場合、SDK はオーソリ済みでキャプチャーはされていない PaymentIntent
をアプリケーションに返します。オーソリとキャプチャーの違いについて、詳細を確認してください。
アプリが SDK から確定済みの PaymentIntent
を受信したら、その支払いをキャプチャーするようにアプリからバックエンドに対して通知するようにしてください。バックエンドにエンドポイントを作成し、PaymentIntent
ID を受け付け、それをキャプチャーするように Stripe API にリクエストを送信します。
capture
コールが成功すると、PaymentIntent
のステータスは succeeded
になります。
注
キャプチャーされたプラットフォーム手数料が連結アカウントに対して正確であることを確認するために、支払いを手動でキャプチャーする前にそれぞれの PaymentIntent
を調べ、必要に応じてプラットフォーム手数料を修正します。
支払いを照合する
ビジネスの支払いアクティビティーを監視するため、毎日の最後の作業としてサーバーで PaymentIntent と内部注文システムを照合することをお勧めします。
PaymentIntent のステータスが requires_capture
のままの場合、以下の 2 つの可能性があります。
顧客のカード明細上の不要なオーソリ
- 原因: ユーザーが取引の途中でアプリの決済フローを中止した
- 解決策: キャプチャーされていない PaymentIntent が、サーバーにある完了済みの注文に関連付けられていない場合は、キャンセルできます。キャンセルされた PaymentIntent は支払いの実行に使用できなくなります。
顧客からの売上回収が未完了
- 原因: 支払いをキャプチャーするようにバックエンドに通知する、アプリからのリクエストのエラー
- 解決策: キャプチャーされていない PaymentIntent が、サーバーにある完了済みの注文に関連付けられていて、その注文について他の支払い (現金による支払いなど) を受けていない場合には、この PaymentIntent をキャプチャーできます。
チップを徴収する アメリカのみ
アメリカでは、対象ユーザーは支払いのキャプチャー時にチップを徴収できます。