カード支払いを回収する
Stripe Terminal を使用したカード支払いの回収ができるように、アプリケーションとバックエンドを準備します。
Stripe Terminal で支払いを回収するには、アプリケーションに決済フローを記述する必要があります。Stripe Terminal SDK を使用して、1 つの支払いセッションを表すオブジェクトである PaymentIntent (支払いインテント) を作成して更新します。
Terminal の組み込みは支払いプロセスにおける失敗に対応できるように設計されており、支払いプロセスを複数のステップに分割し、各ステップを安全に再試行できるようになっています。
- PaymentIntent を作成します。
- 決済手段を収集する支払いを自動と手動のどちらでキャプチャーするかを定義できます。
- 決済を確定します。顧客のカードの承認は、SDK が決済を確定したときに行われます。
- (オプション) 支払いをキャプチャーする
PaymentIntent を作成するクライアント側サーバー側
支払いを回収する最初のステップは、支払いフローを開始することです。顧客がチェックアウトを開始するとき、アプリケーションは PaymentIntent オブジェクトを作成する必要があります。これは、Stripe での新しい支払いセッションを表します。
クライアント側またはサーバー側で PaymentIntent を作成できます。
テスト金額を使用して、さまざまな結果を生成してみてください。00 で終わる金額では、支払いが承認されます。
拒否されたカードの PaymentIntents を再作成しない
クレジットカードが拒否された場合は、決済インテントを再作成しないでください。代わりに、同じ決済インテントを再利用して、二重請求を回避します。
クライアント側
クライアントから PaymentIntent を作成します。
警告
アプリが Verifone P400 に接続されている場合は、React Native SDK から PaymentIntent を作成できません。代わりに、サーバー側で PaymentIntent を作成し、SDK の retrievePaymentIntent メソッドを使用して、アプリ内に PaymentIntent を取得する必要があります。
const {error, paymentIntent} = await createPaymentIntent({ amount: 1000, currency: "usd", });
サーバー側
支払いの開始に必要な情報がアプリですぐに利用できない場合は、サーバで PaymentIntent を作成することができます。
次の例は、サーバで PaymentIntent を作成する方法を示しています。
Terminal の支払いでは、payment_ パラメータに card_ が含まれている必要があります。
以下のように決済フローを制御できます。
card_支払いの支払いフローを完全に制御するには、present capture_をmethod manualに設定します。これにより、支払いを確定する前に照合ステップを追加できます。- 1 ステップで支払いのオーソリとキャプチャーを行うには、
capture_をmethod automaticに設定します。
オーストラリアで決済を受け付けるには、capture_ をautomaticまたは manual_ に設定する必要があります。詳細については、Stripe のオーストラリアのドキュメントをご覧ください。カナダで Interac 支払いを受け付けるには、payment_ に interac_ も含める必要があります。詳細については、Stripe のカナダのドキュメントをご覧ください。
PaymentIntent には、個々の PaymentIntent に固有のキーである client secret が含まれています。client secret を使用するには、これをサーバーで PaymentIntent から取得し、クライアント側に渡す必要があります。
PaymentIntent を取得するには、client secret を使用して retrievePaymentIntent を呼び出します。
PaymentIntent を取得したら、それを使用して collectPaymentMethod を呼び出します。
const { paymentIntent, error } = await retrievePaymentIntent(clientSecret); if (error) { // Placeholder for handling exception return; } // Placeholder for collecting payment method
支払い方法を収集する クライアント側
PaymentIntent を作成したら、次のステップは SDK で決済手段を収集することです。
決済手段を収集するには、アプリがリーダーに接続されている必要があります。アプリが collectPaymentMethod を呼び出した後、接続されたリーダーはカードの提示を待ちます。
const { paymentIntent, error } = await collectPaymentMethod({ paymentIntent: paymentIntent }); if (error) { // Placeholder for handling exception } // Placeholder for processing PaymentIntent
この方法では、接続されたカードリーダーを使用して暗号化された決済手段のデータを収集し、その暗号化されたデータをローカルの PaymentIntent に関連付けます。
支払い方法の詳細をオプションで調査する
高度なユースケースでは、提示されたカードの支払い方法の詳細を調査し、オーソリ前に自社のビジネスロジックを実行できます。
updatePaymentIntent パラメーターを使用して、PaymentMethod をサーバー側の PaymentIntent に関連付けます。このデータは collectPaymentMethod レスポンスで返されます。
const { paymentIntent, error } = await collectPaymentMethod({ paymentIntent: paymentIntent, updatePaymentIntent: true, }); if (error) { // Placeholder for handling exception } // Placeholder for processing PaymentIntent
このメソッドは、収集された暗号化された決済手段データを PaymentIntent オブジェクトの更新に関連付けます。 決済を確定するまでオーソリは必要ありません。この高度なユースケースは Verifone P400 ではサポートされていません。
決済手段を収集したら、30 秒以内に支払いを承認するか、収集をキャンセルする必要があります。
SDK がオフラインで実行されている場合、PaymentIntent オブジェクトには paymentMethod フィールドがありません。
この時点で、カードブランド、口座情報、その他の役立つデータなどの属性にアクセスできます。
Stripe は wallet. 属性で示すとおり、取引でモバイルウォレットが使用されたかどうかを検出するよう試みます。ただし、カード発行会社がモバイルウォレットのリーダーによる識別に対応していない場合、この属性は自動入力されないため、正確な検出は保証されません。確定ステップでオーソリが行われた後に、Stripe はネットワークから最新の情報を取得し、wallet. を確実に更新します。
収集をキャンセルする
プログラムによるキャンセル
React Native SDK で cancelCollectPaymentMethod を呼び出すと、決済手段の収集をキャンセルできます。
顧客によるキャンセル
取引の enableCustomerCancellation を true に設定すると、スマートリーダーのユーザーにキャンセルボタンが表示されます。
キャンセルボタンをタップすると、現在の取引がキャンセルされます。
const { paymentIntent, error } = await collectPaymentMethod({ paymentIntent: paymentIntent, enableCustomerCancellation: true }); if (error) { // Placeholder for handling exception } // Placeholder for processing PaymentIntent
イベントを処理する
内蔵ディスプレイのない Stripe M2 などのリーダーを使用して決済手段を収集する場合、決済手段収集プロセスのイベントをアプリからユーザーに表示できるようにする必要があります。これらのイベントは、ユーザーが決済を正常に収集するのに役立ちます (カードを再試行する、別のカードを試す、別の読み取り方法を使用するなど)。
取引が開始されると、SDK は ReaderInputOptions 値をアプリのリーダー表示ハンドラに渡し、受け入れ可能な入力の種類 (Swipe、Insert、Tap など) を示します。アプリの決済 UI で、これらのオプションのいずれかを使用してカードを提示することを求めるプロンプトをユーザーに表示します。
取引中に、SDK がアプリに対して、アプリのリーダー表示ハンドラに ReaderDisplayMessage 値を渡すことで、ユーザーに追加のプロンプト (Retry Card など) を表示するように要求する場合があります。これらのメッセージが決済 UI でユーザーに表示されることを確認してください。
useStripeTerminal({ onDidRequestReaderInput: (options) => { // Placeholder for updating your app's checkout UI Alert.alert(options.join('/')); }, onDidRequestReaderDisplayMessage: (message) => { Alert.alert(message); }, });
支払いを確定するクライアント側
顧客から決済手段を収集できたら、次のステップでは SDK で決済を確定します。決済を続行する準備ができたら、ステップ 2 からの更新後の PaymentIntent を使用して confirmPaymentIntent を呼び出します。
- 決済の手動キャプチャーでは、
confirmPaymentIntent呼び出しが成功すると、PaymentIntentのステータスがrequires_になります。capture - 支払いの自動キャプチャーでは、
PaymentIntentはsucceeded状態に移行します。
クライアント側で必ず Terminal SDK を使用して PaymentIntents を確定してください。サーバー側での確定では PIN プロンプトなどの重要なメッセージが無視されるため、取引の失敗につながる可能性があります。
const { paymentIntent, error } = await confirmPaymentIntent({ paymentIntent: paymentIntent }); if (error) { // Placeholder for handling exception return; } // Placeholder for notifying your backend to capture paymentIntent.id
2 日以内に PaymentIntent を手動でキャプチャーする必要があり、キャプチャーしなければオーソリは期限切れになり、売上は顧客にリリースされます。
失敗に対処する
決済の確定に失敗すると、SDK は更新された PaymentIntent を含むエラーを返します。アプリケーションは PaymentIntent を調べて、エラーへの対処方法を決定する必要があります。
| PaymentIntent のステータス | 意味 | 解決策 |
|---|---|---|
requires_ | 支払い方法が拒否されました | 同じ PaymentIntent を使用して collectPaymentMethod を再度呼び出し、別の決済手段の収集を試みます。 |
requires_ | 一時的な接続の問題 | 同じ PaymentIntent を使用して confirmPaymentIntent を再度呼び出し、リクエストを再試行します。 |
PaymentIntent が nil です | Stripe へのリクエストがタイムアウトし、PaymentIntent のステータスが不明です | 元の PaymentIntent の確定を再試行します。新しい PaymentIntent を作成しないでください。新しく作成すると、カード会員に複数の承認が発生する可能性があります。 |
タイムアウトが複数回、連続して発生する場合、接続に問題がある可能性があります。アプリがインターネットと通信できることを確認してください。
二重支払いの防止
PaymentIntent オブジェクトは、Stripe での資金移動を可能にします。1 つの取引を表すには、PaymentIntent を 1 つ使用します。
カードが (残高不足などのために) 拒否された後、同じ PaymentIntent を再利用して、顧客が別のカードで再試行できるようにします。
PaymentIntent を編集する場合は、collectPaymentMethod を呼び出してリーダー上の決済情報を更新する必要があります。
PaymentIntent は、Stripe で確定する前に requires_ ステータスである必要があります。承認済み、キャプチャー済み、キャンセル済みの PaymentIntent はリーダーで確定できません。
支払いをキャプチャーするサーバー側
ステップ 1 の PaymentIntent の作成時に capture_ を manual として定義した場合、SDK はオーソリ済みでキャプチャーはされていない PaymentIntent をアプリケーションに返します。オーソリとキャプチャーの違いについて、詳細を確認してください。
アプリが SDK から確定済みの PaymentIntent を受信したら、その支払いをキャプチャーするようにアプリからバックエンドに対して通知するようにしてください。バックエンドにエンドポイントを作成し、PaymentIntent ID を受け付け、それをキャプチャーするように Stripe API にリクエストを送信します。
capture コールが成功すると、PaymentIntent のステータスは succeeded になります。
キャプチャーされたプラットフォーム手数料が連結アカウントに対して正確であることを確認するために、支払いを手動でキャプチャーする前にそれぞれの PaymentIntent を調べ、必要に応じてプラットフォーム手数料を修正します。
支払いを照合する
ビジネスの支払いアクティビティを監視するため、毎日の最後の作業としてサーバで PaymentIntent と内部注文システムを照合することをお勧めします。
PaymentIntent のステータスが requires_ のままの場合には、以下の 2 つの可能性があります。
顧客のカード明細上の不要なオーソリ
- 原因: ユーザーが取引の途中でアプリの決済フローを中止した
- 解決策:キャプチャーされていない
PaymentIntentが、サーバーにある完了済みの注文に関連付けられていない場合には、キャンセルできます。キャンセルされたPaymentIntentを使用して支払いを実行することはできません。
顧客からの売上回収が未完了
- 原因: 支払いをキャプチャーするようにバックエンドに通知する、アプリからのリクエストのエラー
- 解決策:キャプチャーされていない
PaymentIntentが、サーバにある完了済みの注文に関連付けられており、その注文について他の支払い (現金による支払いなど) を受けていない場合には、この PaymentIntent をキャプチャーできます。
チップを徴収する アメリカのみ
In the US, eligible users can collect a tip on the receipt when capturing payments.