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

注

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

Webhook なしでカード支払いを受け付ける

サーバでカード決済を確定して、カードの認証リクエストを処理する方法をご紹介します。

注意

Stripe は、Card Element ではなく、新しい Payment Element の使用をお勧めしています。これにより、1 つの Element で複数の決済手段を受け付けることができます。Card Element と Payment Element を使用する状況についてご紹介します。

より幅広いサポートと将来の保証のために、非同期的な支払いを目的とした標準的な実装を使用してください。

この組み込みは、Webhook を使用したりオフラインイベントを処理したりせずに、クライアントから返される応答を待って、サーバーで支払いを確定します。この組み込みはシンプルに見えるかもしれませんが、ビジネスの成長に合わせて拡張するのが難しく、以下のような制限があります。

移行をお考えの方へ

既存の Stripe の組み込みで Charges API からの移行をご希望の方は、移行ガイドに従ってください。

  • カードのみをサポート: ACH や現地で一般的な決済手段に個別に対応するには、追加のコードを記述する必要があります。
  • 二重請求のリスク: 顧客が支払おうとするたびに新たな PaymentIntent を同期的に作成することにより、顧客に対して誤って二重請求が行われるリスクがあります。必ずベストプラクティスに従ってください。
  • クライアントへの追加トリップ: 3D セキュアを備えたカード、または強力な顧客認証 (SCA) などの規制の対象となるカードでは、クライアント側での追加の手順が必要になります。

この実装の使用を選択した場合は、上記の制限にご注意ください。制限を設けたくない場合は、標準的な実装を使用します。

Stripe を設定する

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

アプリケーションから 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.js と Stripe Elements を使用して、クライアント側でカード情報を収集します。Elements は、カード番号、郵便番号、有効期限を収集して検証するための事前構築された UI コンポーネントのセットです。

Stripe Element には、HTTPS 接続を介して支払い情報を Stripe に安全に送信する iframe が含まれています。組み込みを機能させるには、決済ページのアドレスの先頭を http:// ではなく https:// にする必要があります。

HTTPS を使用せずに実装をテストできます。本番環境で決済を受け付ける準備が整ったら、HTTPS を有効化します。

お客様のサイトの各ページの先頭に Stripe.js スクリプトを含めます。Element は Stripe.js の機能として自動的に利用可能になります。

<script src="https://js.stripe.com/basil/stripe.js"></script>

サイトの各ページにスクリプトを含めることで、Stripe の高度な不正使用検出機能および特異な閲覧動作を検知する機能を活用できます。

支払いフォームを構築する

顧客からカード詳細を安全に収集するために、 Elements は Stripe がホストする UI コンポーネントを作成します。その後、iframe として支払いフォームに配置されます。これらのコンポーネントの挿入先を決定するには、支払いフォーム内に、一意の ID を持つ空の DOM Elements (コンテナ) を作成してください。

index.html
HTML
<form id='payment-form'> <label> Card details <!-- placeholder for Elements --> <div id="card-element"></div> </label> <button type="submit">Submit Payment</button> </form>

次に、最初のパラメータとして公開可能な API キー)を指定して、Stripe オブジェクトのインスタンスを作成します。その後、Elements オブジェクトのインスタンスを作成し、それを使用してページ内の関連するプレースホルダーに Card Element をマウントします。

script.js
サンプル全体を表示
const stripe = Stripe(
'pk_test_TYooMQauvdEDq54NiTphI7jx'
); const elements = stripe.elements(); // Set up Stripe.js and Elements to use in checkout form const style = { base: { color: "#32325d", fontFamily: '"Helvetica Neue", Helvetica, sans-serif', fontSmoothing: "antialiased", fontSize: "16px", "::placeholder": { color: "#aab7c4" } }, invalid: { color: "#fa755a", iconColor: "#fa755a" }, }; const cardElement = elements.create('card', {style}); cardElement.mount('#card-element');

card Element は、カードに関する必要な詳細情報をすべて安全に収集する 1 つの柔軟な入力フィールドを挿入することによって、フォームを簡素化し、必要なフィールドの数を最小限に抑えます。

あるいは、cardNumber、cardExpiry、cardCvc の Element を組み合わせて、複数入力の柔軟なカードフォームを作成します。

注

カードの支払い成功率を向上し、不正使用を削減するため、常に郵便番号を収集してください。

単一行の Card Element は、顧客の郵便番号を自動的に収集して Stripe に送信します。分割 Element (Card Number、Expiry、CVC) を使用して支払いフォームを構築する場合、顧客の郵便番号用に別個の入力フィールドを追加します。

PaymentMethod を作成する

最後に、クライアント側で stripe.createPaymentMethod を使用してカード詳細を収集し、ユーザーが送信ボタンをクリックしたときに PaymentMethod を作成します。

script.js
const form = document.getElementById('payment-form'); form.addEventListener('submit', async (event) => { // We don't want to let default form submission happen here, // which would refresh the page. event.preventDefault(); const result = await stripe.createPaymentMethod({ type: 'card', card: cardElement, billing_details: { // Include any additional collected billing details. name: 'Jenny Rosen', }, }) stripePaymentMethodHandler(result); });

サーバへ PaymentMethod を送信する
クライアント側

PaymentMethod が正常に作成されたら、その ID をサーバーに送信します。

script.js
const stripePaymentMethodHandler = async (result) => { if (result.error) { // Show error in payment form } else { // Otherwise send paymentMethod.id to your server (see Step 4) const res = await fetch('/pay', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ payment_method_id: result.paymentMethod.id, }), }) const paymentResponse = await res.json(); // Handle server response (see Step 4) handleServerResponse(paymentResponse); } }

PaymentIntent を作成する
サーバ側

リクエストを受信するためにサーバにエンドポイントを設定します。このエンドポイントは、後で でも、追加の認証ステップが必要なカードの処理に使用されます。

クライアント側で作成した PaymentMethod) の ID を使って新しい PaymentIntent を作成します。PaymentIntent の作成時に confirm プロパティを true に設定するか、作成後に confirm を呼び出すことにより、PaymentIntent を確定できます。カード支払いでは、オーソリとキャプチャーの分離もサポートされています。

支払いで3D セキュア認証などの追加アクションが必要な場合、PaymentIntent のステータスは requires_action に設定されます。支払いが失敗すると、ステータスは requires_payment_method に戻され、ユーザにエラーを表示する必要があります。支払いで追加認証が求められない場合は、支払いが作成され、PaymentIntent のステータスは succeeded に設定されます。

注

2019-02-11 以前の API のバージョンでは、requires_payment_method の代わりに requires_source、requires_action の代わりに requires_source_action が表示されます。

Command Line
curl
curl https://api.stripe.com/v1/payment_intents \ -u
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:
\ -d "payment_method"="{{PAYMENT_METHOD_ID}}" \ -d "amount"=1099 \ -d "currency"="usd" \ -d "confirmation_method"="manual" \ -d "confirm"="true"

後で再利用するためにカードを保存する場合は、PaymentMethod を格納するため Customer を作成して、PaymentIntent の作成時に以下の追加パラメータを渡します。

  • 顧客。Customer の ID に設定します。
  • setup_future_usage。off_session に設定し、顧客が存在しない場合のオフセッションの支払いにこの PaymentMethod を再利用する予定であることを Stripe に伝えます。このプロパティを設定すると、PaymentIntent が確定され、ユーザによる必要な操作がすべて完了した後で、顧客に PaymentMethod が保存されます。詳細については、支払い後のカードの保存に関するコード例を参照してください。

次のアクションを処理する
クライアント側

顧客による操作が必要な状況を処理するためのコードを記述します。通常、ステップ 4 のサーバーでの確定後に支払いは成功しますが、3D セキュアによる認証など、PaymentIntent で顧客による追加の対応が必要になったときに、このコードが機能します。

stripe.handleCardAction を使用して、顧客のアクションを処理するための UI を起動させます。認証が成功した場合、PaymentIntent’ のステータスは requires_confirmation になります。サーバーで PaymentIntent を再度確定して支払いを完了します。

テスト中は、認証が必要なテストカード番号 ( など) を使用して、このフローを必ず実施するようにします。認証を必要としないカード ( など) を使用すると、フローのこの部分がスキップされ、ステップ 4 で完了します。

script.js
const handleServerResponse = async (response) => { if (response.error) { // Show error from server on payment form } else if (response.requires_action) { // Use Stripe.js to handle the required card action const { error: errorAction, paymentIntent } = await stripe.handleCardAction(response.payment_intent_client_secret); if (errorAction) { // Show error from Stripe.js in payment form } else { // The card action has been handled // The PaymentIntent can be confirmed again on the server const serverResponse = await fetch('/pay', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ payment_intent_id: paymentIntent.id }) }); handleServerResponse(await serverResponse.json()); } } else { // Show success message } }

注

stripe.handleCardAction の完了には数秒かかる場合があります。この間、フォームが再送信されないように無効化し、スピナーのような待機中のインジケータを表示します。エラーが発生した場合は、エラーを顧客に知らせ、フォームを再度有効化し、待機中のインジケータを非表示にします。支払いを完了するために、顧客が認証などの追加ステップを実行する必要がある場合は、Stripe.js がそのプロセスをステップごとに顧客に提示します。

PaymentIntent を再度確定する
サーバ側

このコードは、直前のステップでの処理と同様に、支払いに追加の認証が必要な場合にのみ実行されます。どの支払いでもこの追加ステップが必要になる場合があるため、コード自体はオプションではありません。

上記で設定したものと同じエンドポイントを使用し、PaymentIntent を再度確定することにより、支払いを完了して注文のフルフィルメントを実行します。この確定は支払い試行から 1 時間以内に実行してください。実行されない場合は、支払いが失敗して取引が requires_payment_method に戻されます。

Command Line
curl
curl https://api.stripe.com/v1/payment_intents/{{PAYMENT_INTENT_ID}}/confirm \ -u
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:
\ -X "POST"

組み込みをテストする

​​この実装の準備ができていることを確認するために、サンドボックスで使用できるテストカードがいくつかあります。任意のセキュリティコードおよび将来の有効期限を指定して使用します。

番号説明
支払いが成功し、すぐに処理されます。
認証が必要です。Stripe は、顧客に認証を求めるモーダルをトリガーします。
常に支払い拒否コード insufficient_funds で失敗します。

テストカードの一覧については、テストに関するガイドを参照してください。

オプションセキュリティコードを再収集する

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