カード支払いを回収する
Stripe Terminal を使用したカード支払いの回収ができるように、アプリケーションとバックエンドを準備します。
注
For smart readers, such as the BBPOS WisePOS E reader or Stripe Reader S700, we recommend using the server-driven integration instead of the JavaScript SDK. The server-driven integration uses the Stripe API instead of relying on local network communications to collect payments. See our platform comparison to help you choose the best platform for your needs.
Stripe Terminal で支払いを回収するには、アプリケーションに決済フローを記述する必要があります。Stripe Terminal SDK を使用して、1 つの支払いセッションを表すオブジェクトである PaymentIntent (支払いインテント) を作成して更新します。
Terminal の組み込みは支払いプロセスにおける失敗に対応できるように設計されており、支払いプロセスを複数のステップに分割し、各ステップを安全に再試行できるようになっています。
- Create a PaymentIntent.
- Collect a payment method. You can define whether to automatically or manually capture your payments.
- Process the payment. Authorization on the customer’s card takes place when the SDK processes the payment.
- (オプション) 支払いをキャプチャーする
注
This integration shape does not support offline card payments.
Create a PaymentIntentサーバー側
The first step when collecting payments is to start the payment flow. When a customer begins checking out, your application must create a PaymentIntent
object. This represents a new payment session on Stripe.
Use test amounts to try producing different results. An amount ending in 00
results in an approved payment.
The following example shows how to create a PaymentIntent
on your server:
For Terminal payments, the payment_
parameter must include card_
.
You can control the payment flow as follows:
- To fully control the payment flow for
card_
payments, set thepresent capture_
tomethod manual
. This allows you to add a reconciliation step before finalizing the payment. - To authorize and capture payments in one step, set the
capture_
tomethod automatic
.
To accept Interac payments in Canada, you must also include interac_
in payment_
. For more details, visit our Canada documentation.
The PaymentIntent
contains a client secret, a key that’s unique to the individual PaymentIntent
. To use the client secret, you must obtain it from the PaymentIntent
on your server and pass it to the client side.
Use the client secret as a parameter when calling collectPaymentMethod.
The client_
is all you need in your client-side application to proceed to payment method collection.
支払い方法を収集する クライアント側
After you’ve created a PaymentIntent
, the next step is to collect a payment method with the SDK.
支払い方法を収集するには、アプリをリーダーに接続する必要があります。アプリが collectPaymentMethod
を呼び出した後、接続されたリーダーはカードが提示されるのを待ちます。
async () => { // clientSecret is the client_secret from the PaymentIntent you created in Step 1. const result = await terminal.collectPaymentMethod(clientSecret); if (result.error) { // Placeholder for handling result.error } else { // Placeholder for processing result.paymentIntent } }
This method collects encrypted payment method data using the connected card reader, and associates the encrypted data with the local PaymentIntent
.
注
支払い方法の収集はローカルで行われ、次のステップである支払いの処理 the paymentまで、Payment Intents API オブジェクトのオーソリまたは更新は必要ありません。
支払い方法の詳細を調べる (オプション) ベータ
高度なユースケースでは、提示されたカードの支払い方法の詳細を調査し、オーソリ前に自社のビジネスロジックを実行できます。
Use the update_
parameter to attach a PaymentMethod
to the server-side PaymentIntent
. This data is returned in the collectPaymentMethod
response.
async () => { // clientSecret is the client_secret from the PaymentIntent you created in Step 1. const result = await terminal.collectPaymentMethod(clientSecret, { config_override: { update_payment_intent: true } }); if (result.error) { // Placeholder for handling result.error } else { const pm = result.paymentIntent.payment_method const card = pm?.card_present ?? pm?.interac_present // Placeholder for business logic on card before processing result.paymentIntent } }
注
This method attaches the collected encrypted payment method data with an update to the PaymentIntent
object. It requires no authorization until the next step, process the payment.
This advanced use case isn’t supported on the Verifone P400.
After payment method collection you must authorize the payment or cancel collection within 30 seconds.
この時点で、カードブランド、口座情報、その他の役立つデータなどの属性にアクセスできます。
注
Stripe は wallet.
属性で示すとおり、取引でモバイルウォレットが使用されたかどうかを検出するよう試みます。ただし、カード発行会社がモバイルウォレットのリーダーによる識別に対応していない場合、この属性は自動入力されないため、正確な検出は保証されません。確定ステップでオーソリが行われた後に、Stripe はネットワークから最新の情報を取得し、wallet.
を確実に更新します。
収集をキャンセルする
プログラムによるキャンセル
You can cancel collecting a payment method by calling cancelCollectPaymentMethod in the JavaScript SDK.
顧客によるキャンセル
When you set enable_
to true for a transaction, smart reader users see a cancel button.
Tapping the cancel button cancels the active transaction.
terminal.collectPaymentMethod( clientSecret, { config_override: { enable_customer_cancellation: true } } )
イベントを処理する
注
The JavaScript SDK only supports the Verifone P400, BBPOS WisePOS E, and Stripe Reader S700, which have a built-in display. Your application doesn’t need to display events from the payment method collection process to users, because the reader displays them. To clear the payment method on a transaction, the cashier can press the red X key.
支払いを確定するクライアント側
After successfully collecting a payment method from the customer, the next step is to process the payment with the SDK. When you’re ready to proceed with the payment, call processPayment
with the updated PaymentIntent
from Step 2.
- 支払いの手動キャプチャーでは、
processPayment
コールが成功すると、PaymentIntent
のステータスがrequires_
になります。capture - 支払いの自動キャプチャーでは、
PaymentIntent
はsucceeded
状態に移行します。
async () => { const result = await terminal.processPayment(paymentIntent); if (result.error) { // Placeholder for handling result.error } else if (result.paymentIntent) { // Placeholder for notifying your backend to capture result.paymentIntent.id } }
警告
You must manually capture a PaymentIntent within 2 days or the authorization expires and funds are released to the customer.
失敗に対処する
支払いの処理に失敗した場合、SDK は、更新された PaymentIntent
を含むエラーを返します。アプリケーションでは、PaymentIntent
を確認してエラーの対処方法を決定する必要があります。
PaymentIntent のステータス | 意味 | 解決策 |
---|---|---|
requires_ | 支払い方法が拒否されました | Try collecting a different payment method by calling collectPaymentMethod again with the same PaymentIntent . |
requires_ | 一時的な接続の問題 | Call processPayment again with the same PaymentIntent to retry the request. |
PaymentIntent is nil | Request to Stripe timed out, unknown PaymentIntent status | Retry processing the original PaymentIntent . Don’t create a new one, because that could result in multiple authorizations for the cardholder. |
タイムアウトが複数回、連続して発生する場合、接続に問題がある可能性があります。アプリがインターネットと通信できることを確認してください。
二重支払いの防止
The PaymentIntent
object enables money movement at Stripe—use a single PaymentIntent
to represent a transaction.
Re-use the same PaymentIntent
after a card is declined (for example, if it has insufficient funds), so your customer can try again with a different card.
If you edit the PaymentIntent
, you must call collectPaymentMethod
to update the payment information on the reader.
A PaymentIntent
must be in the requires_
state before Stripe can process it. An authorized, captured, or canceled PaymentIntent
can’t be processed by a reader.
支払いをキャプチャーするサーバー側
ステップ 1 の PaymentIntent
の作成時に capture_
を manual
として定義した場合、SDK はオーソリ済みでキャプチャーはされていない PaymentIntent
をアプリケーションに返します。オーソリとキャプチャーの違いについて、詳細を確認してください。
アプリが SDK から確定済みの PaymentIntent
を受信したら、その支払いをキャプチャーするようにアプリからバックエンドに対して通知するようにしてください。バックエンドにエンドポイントを作成し、PaymentIntent
ID を受け付け、それをキャプチャーするように Stripe API にリクエストを送信します。
capture
コールが成功すると、PaymentIntent
のステータスは succeeded
になります。
注
To make sure the application fee captured is correct for connected accounts, inspect each PaymentIntent
and modify the application fee, if needed, before manually capturing the payment.
支払いを照合する
To monitor the payments activity of your business, you might want to reconcile PaymentIntents with your internal orders system on your server at the end of a day’s activity.
A PaymentIntent
that retains a requires_
status might represent two things:
顧客のカード明細上の不要なオーソリ
- 原因: ユーザーが取引の途中でアプリの決済フローを中止した
- Solution: If the uncaptured
PaymentIntent
isn’t associated with a completed order on your server, you can cancel it. You can’t use a canceledPaymentIntent
to perform charges.
顧客からの売上回収が未完了
- 原因: 支払いをキャプチャーするようにバックエンドに通知する、アプリからのリクエストのエラー
- Solution: If the uncaptured
PaymentIntent
is associated with a completed order on your server, and no other payment has been taken for the order (for example, a cash payment), you can capture it.
チップを徴収する アメリカのみ
アメリカでは、対象ユーザーは支払いのキャプチャー時にチップを徴収できます。