コンテンツにスキップ
アカウントを作成
または
サインイン
Stripe ドキュメントのロゴ
/
AI に質問する
アカウントを作成
サインイン
始める
支払い
売上
プラットフォームおよびマーケットプレイス
資金管理
開発者向けリソース

注

このページはまだ日本語ではご利用いただけません。より多くの言語で文書が閲覧できるように現在取り組んでいます。準備が整い次第、翻訳版を提供いたしますので、もう少しお待ちください。

カード支払いの事前設定

手動でのサーバー側の確定を使用するか、支払い方法を別途提示します。

警告

将来の支払いの設定ガイドに従うことをお勧めします。このガイドは、手動によるサーバー側の確定を行う必要がある場合、または構築済みのシステムで決済手段を別途提示する必要がある場合にのみ使用してください。すでに Elements の実装が完了している場合は、Payment Element 移行ガイドをご覧ください。

Setup Intents API を使用すると、初回の支払いなしで顧客のカードを保存することができます。これは、今すぐ顧客をアカウント登録して支払いを設定し、将来顧客がオフラインの際に請求するときに役立ちます。

この組み込みを使用して、継続支払いを設定したり、最終金額が後で (顧客がサービスを受け取った後などに) 決定される 1 回限りの支払いを作成します。

注

このガイドのステップは、GitHub で完全に実装されています。リポジトリのクローンを作成し、手順に従ってデモ用のアプリを実行します。

Stripe を設定する

まず、Stripe アカウントが必要です。今すぐ登録してください。

サーバー側

この接続方法では、Stripe API と通信するエンドポイントがサーバー上に必要です。サーバーから Stripe API にアクセスするには、Stripe の公式ライブラリーを使用します。

Command Line
Ruby
# Available as a gem sudo gem install stripe
Gemfile
Ruby
# If you use bundler, you can add this line to your Gemfile gem 'stripe'

クライアント側

Stripe Android SDK はオープンソースであり、詳細なドキュメントが提供されています。

SDK をインストールするには、app/build.gradle ファイルの dependencies ブロックに stripe-android を追加します。

build.gradle.kts
Kotlin
plugins { id("com.android.application") } android { ... } dependencies { // ... // Stripe Android SDK implementation("com.stripe:stripe-android:21.20.2") // Include the financial connections SDK to support US bank account as a payment method implementation("com.stripe:financial-connections:21.20.2") }

注

SDK の最新リリースおよび過去バージョンの詳細については、GitHub の Releases ページをご覧ください。新しいリリースの公開時に通知を受け取るには、リポジトリのリリースを確認してください。

Stripe の公開可能キーを使用して SDK を設定し、 Application サブクラスなどで、Stripe API へのリクエストを実行できるようにします。

Kotlin
import com.stripe.android.PaymentConfiguration class MyApp : Application() { override fun onCreate() { super.onCreate() PaymentConfiguration.init( applicationContext,
"pk_test_TYooMQauvdEDq54NiTphI7jx"
) } }

注

テストおよび開発時にはテストキーを使用し、アプリの公開時には本番環境キーを使用します。

設定前に Customer を作成する
サーバー側

将来の支払いに備えてカードを設定するには、カードを Customer (顧客) に関連付ける必要があります。顧客がビジネスでアカウントを作成する際に、Customer オブジェクトを作成します。Customer オブジェクトを使用すると、支払い方法を再利用したり、複数の支払いを追跡したりできます。

Command Line
cURL
curl https://api.stripe.com/v1/customers \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -d name="Jenny Rosen" \ --data-urlencode email="jennyrosen@example.com"

作成に成功すると、Customer オブジェクトが返されます。オブジェクトで顧客の id を調べて、その値を後で取得できるようにデータベースに保存できます。

これらの顧客は、ダッシュボードの顧客ページで見つけることができます。

SetupIntent を作成する
サーバー側

SetupIntent (支払い方法設定インテント) は、将来の支払いに備えて支払い方法を設定するという意図を示すオブジェクトです。

SetupIntent オブジェクトには、client secret が含まれています。これは、お客様のアプリに渡す一意のキーです。client secret により、customer などの機密情報を非表示にすると同時に、設定の確認や支払い方法の詳細の更新などの一定のアクションをクライアント側で実行できます。client secret を使用すると、クレジットカードネットワークを使ってカード詳細を検証および認証できます。client secret は機密情報ですので、ログに記録したり、URL に埋め込んだり、当該の顧客以外に漏洩することがないようにしてください。

サーバー側

サーバー側で SetupIntent を作成し、その client secret をアプリに返すエンドポイントを作成します。

Command Line
curl
curl https://api.stripe.com/v1/setup_intents/ \ -u
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:
\ -d "customer"="{{CUSTOMER_ID}}"

顧客がチェックアウトフローでオンセッション時にのみ、今後の支払いでカードを使用する場合、usage パラメータを on_session に設定して、オーソリ率を改善します。

クライアント側

クライアント側でサーバーの SetupIntent をリクエストします。

CheckoutActivity.kt
Kotlin
サンプル全体を表示
class CheckoutActivity : AppCompatActivity() { private lateinit var setupIntentClientSecret: String private fun loadPage() { // Request a SetupIntent from your server and store its client secret // Click View full sample to see a complete implementation } }

カード詳細を収集する
クライアント側

顧客が支払いフォームを送信したら、SDK が提供するドロップイン UI コンポーネント、CardInputWidget を使用してカード情報を収集します。このコンポーネントは、カード番号、有効期限、セキュリティコード、郵便番号を収集します。

CardInputWidget は、リアルタイムで検証と形式の設定を行います。

注意

特にヨーロッパでは、カードの再利用に関する規制があるため、カード詳細を保存して今後のオフセッションの支払いに使用する際は、カードを保存するための許可を取得します。カードをどのように使用するかをユーザーに知らせるテキストを決済フローに含めてください。

カード詳細を取得するには、getPaymentMethodCard メソッドを呼び出します。収集した情報を新しい PaymentMethodCreateParams と PaymentMethod.BillingDetails のインスタンスに渡して、ConfirmSetupIntentParams インスタンスを作成します。

MyPaymentActivity.kt
Kotlin
サンプル全体を表示
// Collect card details val cardInputWidget = findViewById<CardInputWidget>(R.id.cardInputWidget) val paymentMethodCard = cardInputWidget.paymentMethodCard // Later, you will need to attach the PaymentMethod to the Customer it belongs to. // This example collects the customer's email to know which customer the PaymentMethod belongs to, but your app might use an account id, session cookie, and so on. val emailInput = findViewById<EditText>(R.id.emailInput) val billingDetails = PaymentMethod.BillingDetails.Builder() .setEmail((emailInput.text ?: "").toString()) .build() // Create SetupIntent confirm parameters with the above if (paymentMethodCard != null) { val paymentMethodParams = PaymentMethodCreateParams .create(paymentMethodCard, billingDetails, null) val confirmParams = ConfirmSetupIntentParams .create(paymentMethodParams, setupIntentClientSecret) lifecycleScope.launch { paymentLauncher.confirm(confirmParams) } }

設定を完了するには、現在の Activity を含む SetupIntentParams オブジェクトを PaymentLauncher confirm に渡します。SetupIntent は、顧客が使用しているカード情報がネットワーク上で有効であることを検証します。ただし自動検証が常に行われるわけではありません。詳細は、請求しないでクレジットカードの有効性を確認するでご確認ください。また PaymentLauncher#confirm() を呼び出す時点で無効になっている可能性があるため、作成から長時間が経過した未処理の SetupIntents を保持しないでください。

一部の決済手段では、支払いを完了するために追加の認証手順が必要です。SDK は、支払いの確認と認証のフローを管理しますが、これには認証に必要な追加の画面の表示が含まれる場合があります。3D セキュア認証と認証体験のカスタマイズについて、詳細は Android での 3D セキュア認証のサポートを参照してください。

フローの結果は、指定されたコールバック (ここでは onPaymentResult) を介して呼び出し元のアクティビティに返されます。PaymentLauncher によって返される PaymentResult には、次のタイプがあります。

  • Completed: 確定または認証に成功した
  • Canceled: 必要な認証が顧客によってキャンセルされた
  • Failed: 認証の試行が失敗し、throwable によって理由が提供される
MyPaymentActivity.kt
Kotlin
サンプル全体を表示
private fun onPaymentResult(paymentResult: PaymentResult) { var title = "" var message = "" var restartDemo = false when (paymentResult) { is PaymentResult.Completed -> { title = "Setup Completed" restartDemo = true } is PaymentResult.Canceled -> { title = "Setup Canceled" } is PaymentResult.Failed -> { title = "Setup Failed" message = paymentResult.throwable.message!! } } displayAlert(title, message, restartDemo) }

以上でカード詳細を収集して認証リクエストを処理するフローができました。認証プロセスをテストするには、任意のセキュリティコード、郵便番号、および有効期限を指定して、テストカード 4000 0025 0000 3155 を使用します。

SetupIntent が成功すると、(setupIntent.getPaymentMethodId() で) 生成された PaymentMethod ID が、指定された Customer に保存されます。

保存されたカードに後で請求する
サーバー側

顧客にオフセッションで請求する準備ができたら、Customer ID と PaymentMethod ID を使用して、PaymentIntent を作成します。請求するカードを見つけるには、Customer に関連付けられた PaymentMethod のリストを作成します。

Command Line
cURL
curl -G https://api.stripe.com/v1/payment_methods \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -d customer=
{{CUSTOMER_ID}}
\ -d type=card

Customer ID と PaymentMethod ID を取得したら、支払いの金額と通貨を使用して PaymentIntent を作成します。下記のパラメータを設定し、オフセッションの支払いを行います。

  • off_session を true に設定して、支払いの実行時に顧客が決済フローに存在しないことを示します。これにより、認証が必要な場合は PaymentIntent からエラーが返されます。
  • PaymentIntent の confirm プロパティの値を true に設定します。これにより、PaymentIntent が作成されると直ちに確定されます。
  • payment_method を PaymentMethod の ID に設定し、customer を Customer の ID に設定します。
Command Line
curl
curl https://api.stripe.com/v1/payment_intents \ -u
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:
\ -d amount=1099 \ -d currency=usd \ -d customer="{{CUSTOMER_ID}}" \ -d payment_method="{{PAYMENT_METHOD_ID}}" \ -d off_session=true \ -d confirm=true

PaymentIntent の status プロパティを調べ、支払いが成功したことを確認します。支払いの試行が成功した場合、PaymentIntent のステータスが succeeded になり、オフセッションの支払いが完了します。

リカバリフローを開始する

PaymentIntent に他のステータスがある場合、支払いは成功せず、リクエストは失敗します。支払いを完了するために (メール、テキスト、プッシュ通知などで) アプリケーションに戻るように顧客に通知します。支払いが最初に失敗した理由を示し、顧客が再試行できるようにするリカバリフローをアプリで作成することをお勧めします。

リカバリフローで client secret を使用して PaymentIntent を取得します。PaymentIntent の lastPaymentError を確認して、支払いの試行が失敗した理由を調べます。カードエラーの場合、最後の支払いエラーのメッセージをユーザーに表示できます。それ以外の場合は、一般的な失敗メッセージを表示できます。

RecoveryFlowActivity.kt
Kotlin
fun startRecoveryFlow(clientSecret: String) { val stripe = Stripe( applicationContext, PaymentConfiguration.getInstance(applicationContext).publishableKey ) lifecycleScope.launch { runCatching { stripe.retrievePaymentIntent(clientSecret) }.fold( onSuccess = { paymentIntent -> var failureReason = "Payment failed, try again" // Default to a generic error message paymentIntent.lastPaymentError?.let { lastPaymentError -> if (lastPaymentError.type == PaymentIntent.Error.Type.CardError) { lastPaymentError.message?.let { errorMessage -> failureReason = errorMessage // Display the failure reason to your customer } } } }, onFailure = { // Handle error } ) } }

顧客に再試行してもらう

保存されたカードを更新または削除し、支払いを再試行するオプションをリカバリフローで顧客に提供します。最初の支払いを受け付けるのと同じ手順に従いますが、1 つ異なる点があります。元の失敗した PaymentIntent を確定するために新しい支払いインテントを作成するのではなく、その client secret を再利用します。

認証が必要なために支払いが失敗した場合は、新しい支払い方法を作成するのではなく、既存の PaymentMethod を使用して再試行してください。

RecoveryFlowActivity.kt
Kotlin
fun startRecoveryFlow(clientSecret: String) { // ...continued from previous step val paymentConfiguration = PaymentConfiguration.getInstance(applicationContext) val paymentLauncher = PaymentLauncher.Companion.create( this, paymentConfiguration.publishableKey, paymentConfiguration.stripeAccountId, ::onPaymentResult ) val lastPaymentError = paymentIntent.lastPaymentError val lastPaymentMethodId = lastPaymentError.paymentMethod?.id if (lastPaymentError?.code == "authentication_required" && lastPaymentMethodId != null) { // Payment failed because authentication is required, reuse the PaymentMethod val paymentIntentParams = ConfirmPaymentIntentParams.createWithPaymentMethodId( lastPaymentMethodId, clientSecret // Reuse the existing PaymentIntent ) // Submit the payment... paymentLauncher.confirm(paymentIntentParams) } else { // Collect a new PaymentMethod from the customer... } }

組み込みをテストする

ここまでで、以下を実行する組み込みが完成しています。

  1. SetupIntent を使用して、顧客に請求することなくカード詳細を収集・保存する
  2. オフセッションでカードに請求し、支払い拒否と認証リクエストを処理するリカバリーフローが備わっている

この組み込みの稼働準備ができていることを確認するために使用できるいくつかのテストカードがあります。任意のセキュリティコード、郵便番号、および今後の有効期限を指定して使用します。

番号説明
成功し、支払いがすぐに処理されます。
初めての購入には認証が必要ですが、カードに setup_future_usage の設定があれば、以降の支払い (オフセッションの支払いを含む) に成功します。
初めての購入には認証が必要で、以降の支払い (オフセッションの支払いを含む) には失敗し、支払い拒否コード authentication_required が返されます。
初めての購入には認証が必要で、以降の支払い (オフセッションの支払いを含む) には失敗し、支払い拒否コード insufficient_funds が返されます。
(初めての購入を含め) 常に失敗し、支払い拒否コード insufficient_funds が返されます。

テストカードの全一覧をご覧ください。

このページはお役に立ちましたか。
はいいいえ
  • お困りのことがございましたら 、サポートにお問い合わせください。
  • 早期アクセスプログラムにご参加ください。
  • 変更ログをご覧ください。
  • ご不明な点がございましたら、お問い合わせください。
  • LLM ですか?llms.txt を読んでください。
  • Powered by Markdoc