カード支払いの事前設定
手動でのサーバー側の確定を使用するか、支払い方法を別途提示します。
警告
将来の支払いの設定ガイドに従うことをお勧めします。このガイドは、手動によるサーバー側の確定を行う必要がある場合、または構築済みのシステムで決済手段を別途提示する必要がある場合にのみ使用してください。すでに Elements の実装が完了している場合は、Payment Element 移行ガイドをご覧ください。
Setup Intents API を使用すると、初回の支払いなしで顧客のカードを保存することができます。これは、今すぐ顧客をアカウント登録して支払いを設定し、将来顧客がオフラインの際に請求するときに役立ちます。
この組み込みを使用して、継続支払いを設定したり、最終金額が後で (顧客がサービスを受け取った後などに) 決定される 1 回限りの支払いを作成します。
Stripe を設定する
まず、Stripe アカウントが必要です。今すぐ登録してください。
サーバー側
この接続方法では、Stripe API と通信するエンドポイントがサーバー上に必要です。サーバーから Stripe API にアクセスするには、Stripe の公式ライブラリーを使用します。
クライアント側
Stripe Android SDK はオープンソースであり、詳細なドキュメントが提供されています。
SDK をインストールするには、app/build.gradle ファイルの dependencies ブロックに stripe-android を追加します。
メモ
SDK の最新リリースおよび過去バージョンの詳細については、GitHub の Releases ページをご覧ください。新しいリリースの公開時に通知を受け取るには、リポジトリのリリースを確認してください。
Stripe の公開可能キーを使用して SDK を設定し、 Application サブクラスなどで、Stripe API へのリクエストを実行できるようにします。
設定前に Customer を作成するサーバー側
将来の支払いに備えてカードを設定するには、カードを Customer (顧客) に関連付ける必要があります。顧客がビジネスでアカウントを作成する際に、Customer オブジェクトを作成します。Customer オブジェクトを使用すると、支払い方法を再利用したり、複数の支払いを追跡したりできます。
Customers v1 と Accounts v2 のリファレンスを比較する
Connect プラットフォームが customer-configured Accounts を使用している場合は、Stripe の ガイドをご確認の上、コード内の Customer およびイベント参照を同等の Accounts v2 API リファレンスに置き換えてください。
作成に成功すると、Customer オブジェクトが返されます。オブジェクトで顧客の id を調べて、その値を後で取得できるようにデータベースに保存できます。
これらの顧客は、ダッシュボードの顧客ページで見つけることができます。
SetupIntent を作成するサーバー側
SetupIntent (支払い方法設定インテント) は、将来の支払いに備えて支払い方法を設定するという意図を示すオブジェクトです。
SetupIntent オブジェクトには、client secret が含まれています。これは、お客様のアプリに渡す一意のキーです。client secret により、customer などの機密情報を非表示にすると同時に、設定の確認や支払い方法の詳細の更新などの一定のアクションをクライアント側で実行できます。client secret を使用すると、クレジットカードネットワークを使ってカード詳細を検証および認証できます。client secret は機密情報ですので、ログに記録したり、URL に埋め込んだり、当該の顧客以外に漏洩することがないようにしてください。
サーバー側
サーバー側で SetupIntent を作成し、その client secret をアプリに返すエンドポイントを作成します。
顧客がチェックアウトフローでオンセッション時にのみ、今後の支払いでカードを使用する場合、usage パラメータを on_session に設定して、オーソリ率を改善します。
クライアント側
クライアント側でサーバーの SetupIntent をリクエストします。
カード詳細を収集するクライアント側
顧客が支払いフォームを送信したら、SDK が提供するドロップイン UI コンポーネント、CardInputWidget を使用してカード情報を収集します。このコンポーネントは、カード番号、有効期限、セキュリティコード、郵便番号を収集します。
CardInputWidget は、リアルタイムで検証と形式の設定を行います。
注意
特にヨーロッパでは、カードの再利用に関する規制があるため、カード詳細を保存して今後のオフセッションの支払いに使用する際は、カードを保存するための 許可を取得 します。カードをどのように使用するかをユーザーに知らせるテキストを決済フローに含めてください。
カード詳細を取得するには、getPaymentMethodCard メソッドを呼び出します。収集した情報を新しい PaymentMethodCreateParams と PaymentMethod. のインスタンスに渡して、ConfirmSetupIntentParams インスタンスを作成します。
セットアップを完了するにはSetupIntentParams オブジェクトを現在の Activity とともに PaymentLauncher confirm に渡します。SetupIntent は、顧客が使用しているカード情報がネットワーク上で有効であることを確認します。ただし、自動確認が常に行われるわけではありません。詳細は支払いをせずにクレジットカードの有効性を確認するを参照してください。また、長期間保持され未処理の SetupIntent はPaymentLauncher#confirm() を呼び出す時点で無効になっている可能性があるため、管理しないでください。
一部の決済手段では、支払いを完了するために追加の認証手順が必要です。SDK は、支払いの確認と認証のフローを管理しますが、これには認証に必要な追加の画面の表示が含まれる場合があります。3D セキュア認証と認証体験のカスタマイズについて、詳細は Android での 3D セキュア認証のサポートを参照してください。
フローの結果は、指定されたコールバック (ここでは onPaymentResult) を介して呼び出し元のアクティビティに返されます。PaymentLauncher によって返される PaymentResult には、次のタイプがあります。
Completed: 確定または認証に成功したCanceled: 必要な認証が顧客によってキャンセルされたFailed: 認証の試行が失敗し、throwable によって理由が提供される
以上でカード詳細を収集して認証リクエストを処理するフローができました。認証プロセスをテストするには、任意のセキュリティコード、郵便番号、および有効期限を指定して、テストカード 4000 0025 0000 3155 を使用します。
SetupIntent が成功すると、(setupIntent. で) 生成された PaymentMethod ID が、指定された Customer に保存されます。
保存されたカードに後で請求するサーバー側
顧客にオフセッションで請求する準備ができたら、Customer ID と PaymentMethod ID を使用して、PaymentIntent を作成します。請求するカードを見つけるには、Customer に関連付けられた PaymentMethod のリストを作成します。
Customer ID と PaymentMethod ID を取得したら、支払いの金額と通貨を使用して PaymentIntent を作成します。下記のパラメータを設定し、オフセッションの支払いを行います。
- off_session を
trueに設定して、支払いの実行時に顧客が決済フローに存在しないことを示します。これにより、認証が必要な場合は PaymentIntent からエラーが返されます。 - PaymentIntent の confirm プロパティの値を
trueに設定します。これにより、PaymentIntent が作成されると直ちに確定されます。 - payment_method を PaymentMethod の ID に設定し、customer を Customer の ID に設定します。
PaymentIntent の status プロパティを調べ、支払いが成功したことを確認します。支払いの試行が成功した場合、PaymentIntent のステータスが succeeded になり、オフセッションの支払いが完了します。
リカバリフローを開始する
PaymentIntent に他のステータスがある場合、支払いは成功せず、リクエストは失敗します。支払いを完了するために (メール、テキスト、プッシュ通知などで) アプリケーションに戻るように顧客に通知します。支払いが最初に失敗した理由を示し、顧客が再試行できるようにするリカバリフローをアプリで作成することをお勧めします。
リカバリフローで client secret を使用して PaymentIntent を取得します。PaymentIntent の lastPaymentError を確認して、支払いの試行が失敗した理由を調べます。カードエラーの場合、最後の支払いエラーのメッセージをユーザーに表示できます。それ以外の場合は、一般的な失敗メッセージを表示できます。
顧客に再試行してもらう
保存されたカードを更新または削除し、支払いを再試行するオプションをリカバリフローで顧客に提供します。最初の支払いを受け付けるのと同じ手順に従いますが、1 つ異なる点があります。元の失敗した PaymentIntent を確定するために新しい支払いインテントを作成するのではなく、その client secret を再利用します。
認証が必要なために支払いが失敗した場合は、新しい支払い方法を作成するのではなく、既存の PaymentMethod を使用して再試行してください。
組み込みをテストする
ここまでで、以下を実行する組み込みが完成しています。
- SetupIntent を使用して、顧客に請求することなくカード詳細を収集・保存する
- オフセッションでカードに請求し、支払い拒否と認証リクエストを処理するリカバリーフローが備わっている
この組み込みの稼働準備ができていることを確認するために使用できるいくつかのテストカードがあります。任意のセキュリティコード、郵便番号、および今後の有効期限を指定して使用します。
| 番号 | 説明 |
|---|---|
| 成功し、支払いがすぐに処理されます。 | |
初めての購入には認証が必要ですが、カードに setup_ の設定があれば、以降の支払い (オフセッションの支払いを含む) に成功します。 | |
初めての購入には認証が必要で、以降の支払い (オフセッションの支払いを含む) には失敗し、支払い拒否コード authentication_ が返されます。 | |
初めての購入には認証が必要で、以降の支払い (オフセッションの支払いを含む) には失敗し、支払い拒否コード insufficient_ が返されます。 | |
(初めての購入を含め) 常に失敗し、支払い拒否コード insufficient_ が返されます。 |
テストカードの全一覧をご覧ください。