Payment Element を使用すると、買い手は各自の支払いの詳細を入力できます。買い手が既存の顧客の場合、Payment Element でカスタマーセッションを設定して、顧客の既存の決済手段を設定できます。
Payment Element は、次の保存済み決済手段タイプのみを表示できます。
card
us_bank_account
link
sepa_debit
ideal
sofort
bancontact
PaymentIntent と CustomerSession を作成します。必ず、既存の顧客 ID を渡して、payment_method_redisplay
機能を有効にしてください。
Stripe.api_key = 'sk_test_BQokikJOvBiI2HlWgH4olfQ2'
post '/create-intent-and-customer-session' do
intent = Stripe::PaymentIntent.create({
amount: 1099,
currency: 'usd',
automatic_payment_methods: {enabled: true},
customer: ,
})
customer_session = Stripe::CustomerSession.create({
customer: ,
components: {
payment_element: {
enabled: true,
features: {
payment_method_redisplay: 'enabled',
},
},
},
})
{
client_secret: intent.client_secret,
customer_session_client_secret: customer_session.client_secret
}.to_json
end
Stripe.js を設定
HTML ファイルの head
に Stripe .js スクリプトを追加し、チェックアウトページに含めます。PCI への準拠を維持するために、常に js.stripe.com から Stripe.js を直接読み込んでください。スクリプトをバンドルに含めたり、そのコピーを自身でホストしたりしないでください。
購入ページで次の JavaScript を使用して、Stripe のインスタンスを作成します。
const stripe = Stripe('pk_test_TYooMQauvdEDq54NiTphI7jx'
);
Payment Element を支払いページに追加
Payment Element を決済ページに配置する場所が必要です。決済フォームで、一意の ID を持つ空の DOM ノード (コンテナー) を作成します。
<form id="payment-form">
<div id="payment-element">
</div>
<button id="submit">Submit</button>
<div id="error-message">
</div>
</form>
前のステップで 2 つの clients_secret
を取得して、Element を初期化します。次に、Payment Element を作成してマウントします。
const response = await fetch('/create-intent-and-customer-session', { method: "POST" });
const { client_secret, customer_session_client_secret } = await response.json();
const elements = stripe.elements({
clientSecret: client_secret,
customerSessionClientSecret: customer_session_client_secret,
});
const paymentElementOptions = { layout: 'accordion'};
const paymentElement = elements.create('payment', paymentElementOptions);
paymentElement.mount('#payment-element');
Payment Element からの詳細を指定して stripe.confirmPayment を使用し、支払いを完了します。ユーザーが支払いを完了した後に Stripe がユーザーをリダイレクトする場所を指定するには、この関数に return_url を指定します。ユーザーはまず、銀行のオーソリページなどの中間サイトにリダイレクトされ、その後 return_url
にリダイレクトされます。カード支払いでは、支払いが正常に完了するとすぐに return_url
にリダイレクトします。
カード決済で支払いの完了後にリダイレクトを行わない場合は、redirect に if_required
を設定できます。これで、リダイレクトベースの決済手段で購入する顧客のみがリダイレクトされます。
const form = document.getElementById('payment-form');
form.addEventListener('submit', async (event) => {
event.preventDefault();
const {error} = await stripe.confirmPayment({
elements,
confirmParams: {
return_url: 'https://example.com/order/123/complete',
},
});
if (error) {
const messageContainer = document.querySelector('#error-message');
messageContainer.textContent = error.message;
} else {
}
});
return_url
が、Web サイト上の支払いステータスを表示するページと対応していることを確認します。Stripe が顧客を return_url
にリダイレクトするときは、以下の URL クエリーパラメーターが指定されます。
パラメーター | 説明 |
---|
payment_intent | PaymentIntent の一意の識別子。 |
payment_intent_client_secret | PaymentIntent オブジェクトの client secret。 |
注意
顧客のブラウザーセッションを追跡するツールを利用している場合、リファラー除外リストに stripe.com
ドメインの追加が必要になる場合があります。リダイレクトを行うと、一部のツールでは新しいセッションが作成され、セッション全体の追跡ができなくなります。
クエリパラメーターのいずれか 1 つを使用して PaymentIntent を取得します。PaymentIntent のステータスを調べて、顧客に表示する内容を決定します。また、return_url
を指定するときにカスタムのクエリパラメーターを追加することもできます。このパラメーターはリダイレクトプロセスの間維持されます。
const stripe = Stripe('pk_test_TYooMQauvdEDq54NiTphI7jx'
);
const clientSecret = new URLSearchParams(window.location.search).get(
'payment_intent_client_secret'
);
stripe.retrievePaymentIntent(clientSecret).then(({paymentIntent}) => {
const message = document.querySelector('#message')
switch (paymentIntent.status) {
case 'succeeded':
message.innerText = 'Success! Payment received.';
break;
case 'processing':
message.innerText = "Payment processing. We'll update you when payment is received.";
break;
case 'requires_payment_method':
message.innerText = 'Payment failed. Please try another payment method.';
break;
default:
message.innerText = 'Something went wrong.';
break;
}
});
支払いが完了すると、Stripe は payment_intent.succeeded イベントを送信します。ダッシュボードの Webhook ツールを使用するか Webhook のガイドに従ってこれらのイベントを受信し、顧客への注文確認メールの送信、データベースでの売上の記録、配送ワークフローの開始などのアクションを実行します。
クライアントからのコールバックを待つのではなく、これらのイベントをリッスンします。クライアントでは、コールバックが実行される前に顧客がブラウザーのウィンドウを閉じたり、アプリを終了する場合、また悪意を持つクライアントがレスポンスを不正操作する場合もあります。非同期型のイベントをリッスンするよう組み込みを設定すると、単一の組み込みで複数の異なるタイプの支払い方法を受け付けることができます。
Payment Element を使用して支払いを回収する場合は、payment_intent.succeeded
イベントのほかにこれらのイベントを処理することをお勧めします。
イベント | 説明 | アクション |
---|
payment_intent.succeeded | 顧客が正常に支払いを完了したときに送信されます。 | 顧客に注文の確定を送信し、顧客の注文のフルフィルメントを実行します。 |
payment_intent.processing | 顧客が正常に支払いを開始したが、支払いがまだ完了していない場合に送信されます。このイベントは、多くの場合、顧客が口座引き落としを開始するときに送信されます。その後、payment_intent.succeeded イベント、また、失敗の場合は payment_intent.payment_failed イベントが送信されます。 | 顧客に注文確認メールを送信し、支払いが保留中であることを示します。デジタル商品では、支払いの完了を待たずに注文のフルフィルメントを行うことが必要になる場合があります。 |
payment_intent.payment_failed | 顧客が支払いを試みたが、支払いに失敗する場合に送信されます。 | 支払いが processing から payment_failed に変わった場合は、顧客に再度支払いを試すように促します。 |