通販サイトなどのオンライン決済では、常に不正なカード利用による注文への対処が必要です。
不正利用への対応策の一つとして用いられるのが、3Dセキュアです。
この記事では、Stripeを組み込んだアプリやシステムで、3Dセキュア2による認証に対応できているかを確認する方法を紹介します。
3Dセキュアによる認証を実施するメリット
3Dセキュアによる認証を実施することで、クレジットカードの所有者本人による決済かどうかの確認を追加で行うことができます。
https://stripe.com/jp/guides/3d-secure-2
また、3Dセキュアを通して認証された支払いについては、不正請求の申し立てがあった場合の責任が、カード発行会社側に移ります。ただし、「注文した商品が届いていない」ケースや「注文した商品と異なる」ケースなど、不正利用以外で申し立てがあった場合は対象外となりますのでご注意ください。(参考: 異議申し立てのカテゴリ)
そのため、顧客が不正利用を理由としたチャージバックの申請をしても、カード発行会社が売上金を補償します。この仕組みを「ライアビリティシフト」とよびます。
3Dセキュア1と3Dセキュア2
3Dセキュアでの認証には、二つのバージョンがあります。
3Dセキュア1では、常に決済時にカード発行会社が提供する認証画面にリダイレクトさせる必要があります。認証が成功した場合は、元のサイトにリダイレクトされて、決済フローが再開されます。
このフローの問題点は、認証ページへのリダイレクトが発生するために、いわゆる「カゴ落ち」が発生しやすくなることです。認証時に、カード所有者が設定したID・パスワードを要求することが多く、これもまたカゴ落ちの要因になりました。
リダイレクトによる決済フローの中断を減らすため、3Dセキュア2では摩擦のない認証(Frictionless authentication)をサポートしています。
これは決済(トランザクション)ごとに配送先住所や顧客のデバイスIDなどのデータを送信し、カード会社側のシステムが「リスクの高い決済」と判断した場合にのみ追加認証を行う方法です。
3Dセキュア2の認証フローに切り替えることで、顧客が認証のための追加情報入力を省略できるケースを増やすことができます。
https://stripe.com/jp/guides/3d-secure-2
また、3Dセキュア2では、追加情報を入力する画面をリダイレクトではなくアプリ・ブラウザ内で表示します。これによって、セッションの中断やアプリからブラウザへの移動などを回避でき、実装やユーザーの動線をシンプルにできます。
https://stripe.com/jp/guides/3d-secure-2
2022/10に多くの地域・カードネットワークで3Dセキュア1が廃止
現在3Dセキュア1を利用している場合、2022/10までに3Dセキュア2へ切り替える必要があります。
これは複数のクレジットカードブランドが、2022/10までに3Dセキュア1におけるライアビリティシフトやサポートを終了することを発表しているためです。
Stripeを利用している場合の3Dセキュア1から3Dセキュア2への切り替え方法
追加対応が不要のケース
Stripeを利用している場合、Payment IntentおよびSetup Intent、そしてCheckout・Payment Links・InvoiceなどのStripeがホストする決済ページを利用中であれば、変更のために実装を変更する必要はほぼありません。
ただし「2019-02-11
より古いバージョンのAPIを利用し、手動でリダイレクト設定を実装している場合」など、一部のケースではパラメータ名などが変わっているケースがあるため、注意が必要です。
追加対応(コードの変更)が必要なケース
もしSource API
やCharge API
・Token API
など、古いAPIを利用したカードフォームを実装している場合は、Setup Intent
またはPayment Intent
、あるいはCheckoutへの切り替えが必要です。
主な変更点は、以下のとおりです。
- 1: Elements(Stripe.js)の要素を表示する前に、サーバー側でPayment IntentまたはSetup Intentを作成する
- 2: Elements(Stripe.js)の
stripe.elements
または<Elements />
の引数に、Payment IntentまたはSetup Intentのclient_secret
を設定する - 3: Elements(Stripe.js)の
createToken
やcreateSource
をconfirmCardPayment
(CardElement
)またはconfirmPayment
(PaymentElement
)に変更する - 4:
createSource
の戻り値から3Dセキュアのリダイレクトの実施判定や処理をしているコードを削除する(Stripe.js側の認証フローを利用する場合) - 5:
createToken
やcreateSource
の実施後に、サーバー側で実行していたcharges.create
などの実装を削除する
より詳細な変更方法や言語別のAPIについては、以下のStripe Documentをご確認ください。
Stripeで3Dセキュア1と2の決済をテストする方法
運用しているアプリ・システムで3Dセキュア2が利用できるか否かをテストしてみましょう。
テストする上で最もシンプルな方法は、「3Dセキュア2での認証が必須のテストカード番号」を利用することです。
Stripeでは、カード番号4000000000003220
をテスト環境で利用すると、必ず3Dセキュア2での認証を要求します。
Source APIのcreateSource
で3Dセキュア1に対応している場合、3Dセキュア1の認証画面にリダイレクトされます。しかし認証後にURLのクエリ文字列から取得できるsource
を使って決済を実施しようとすると、エラーが発生します。
% stripe charges create --currency jpy --amount 1000 --source src_xxxx
{
"error": {
"charge": "ch_3Lhov2L6R1kGwUF41gexGMBV",
"code": "authentication_required",
"decline_code": "authentication_required",
"doc_url": "https://stripe.com/docs/error-codes/authentication-required",
"message": "Your card was declined. This transaction requires authentication.",
"type": "card_error"
}
}
Payment IntentまたはSetup Intentを利用している場合は、画面上に3Dセキュア2の認証テスト画面が表示されます。これはPayment LinksやCheckoutを利用している場合でも表示されます。
認証のテスト画面で、COMPLETE
をクリックすると3Dセキュア2での認証が成功したケース・FAIL
をクリックすると失敗したケースをテストできます。
SetupIntent / Payment Intent APIで、手動で3Dセキュア認証をリクエストする
サーバー側でSetup IntentまたはPayment Intent APIを利用している場合、テスト環境または特定の条件に対して3Dセキュアによる認証を手動でリクエストできます。
それぞれのAPIにある、payment_method_options[card][request_three_d_secure]
パラメータを、any
に設定しましょう。
stripe.setupIntents.create({
customer: customer.id,
payment_method_types: ['card'],
usage: 'off_session',
+ payment_method_options: {
+ card: {
+ request_three_d_secure: 'any'
+ }
+ },
})
特定の条件でのみ手動リクエストを行いたい場合は、次のように実装します。
stripe.setupIntents.create({
customer: customer.id,
payment_method_types: ['card'],
usage: 'off_session',
payment_method_options: {
card: {
- request_three_d_secure: 'any'
+ request_three_d_secure: isManual3DS ? 'any' : 'automatic'
}
},
})
デフォルト値であるautomatic
を設定することで、不必要な追加認証を減らすことができます。
- Payment Intent API: https://stripe.com/docs/api/payment_intents/create#create_payment_intent-payment_method_options-card-request_three_d_secure
- Setup Intent API: https://stripe.com/docs/api/setup_intents/create#create_setup_intent-payment_method_options-card-request_three_d_secure
ダッシュボードで3Dセキュアによる認証があったかを確認する
ダッシュボードからは、実際に3Dセキュア2での認証が実行されているかを確認することもできます。
[支払い > すべての支払い]から[支払い方法]を選択しましょう。
ここで[3Dセキュア2]を選択すると、3Dセキュア2を利用した支払いを確認できます。
その他の参考リソース
Stripeでの3Dセキュア義務化対応について知りたい方は、こちらもどうぞ
2025年3月より始まる3Dセキュア義務化に関する記事を複数用意しております。現在対応方法をお探し中の方は、ぜひこちらの記事もご覧ください。