9
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Stripeで実装した決済システムが3Dセキュア2 (EMV3DS) に対応しているかを確認する方法

Last updated at Posted at 2022-10-17

通販サイトなどのオンライン決済では、常に不正なカード利用による注文への対処が必要です。

不正利用への対応策の一つとして用いられるのが、3Dセキュアです。

この記事では、Stripeを組み込んだアプリやシステムで、3Dセキュア2による認証に対応できているかを確認する方法を紹介します。

3Dセキュアによる認証を実施するメリット

3Dセキュアによる認証を実施することで、クレジットカードの所有者本人による決済かどうかの確認を追加で行うことができます。

phone1-de50512572d9508bb9fd022fe61ac793.png
https://stripe.com/jp/guides/3d-secure-2

また、3Dセキュアを通して認証された支払いについては、不正請求の申し立てがあった場合の責任が、カード発行会社側に移ります。ただし、「注文した商品が届いていない」ケースや「注文した商品と異なる」ケースなど、不正利用以外で申し立てがあった場合は対象外となりますのでご注意ください。(参考: 異議申し立てのカテゴリ

そのため、顧客が不正利用を理由としたチャージバックの申請をしても、カード発行会社が売上金を補償します。この仕組みを「ライアビリティシフト」とよびます。

3Dセキュア1と3Dセキュア2

3Dセキュアでの認証には、二つのバージョンがあります。

3Dセキュア1では、常に決済時にカード発行会社が提供する認証画面にリダイレクトさせる必要があります。認証が成功した場合は、元のサイトにリダイレクトされて、決済フローが再開されます。

このフローの問題点は、認証ページへのリダイレクトが発生するために、いわゆる「カゴ落ち」が発生しやすくなることです。認証時に、カード所有者が設定したID・パスワードを要求することが多く、これもまたカゴ落ちの要因になりました。

リダイレクトによる決済フローの中断を減らすため、3Dセキュア2では摩擦のない認証(Frictionless authentication)をサポートしています。
これは決済(トランザクション)ごとに配送先住所や顧客のデバイスIDなどのデータを送信し、カード会社側のシステムが「リスクの高い決済」と判断した場合にのみ追加認証を行う方法です。

3Dセキュア2の認証フローに切り替えることで、顧客が認証のための追加情報入力を省略できるケースを増やすことができます。

スクリーンショット 2022-10-11 9.50.46.png
https://stripe.com/jp/guides/3d-secure-2

また、3Dセキュア2では、追加情報を入力する画面をリダイレクトではなくアプリ・ブラウザ内で表示します。これによって、セッションの中断やアプリからブラウザへの移動などを回避でき、実装やユーザーの動線をシンプルにできます。

phone2-679c89fc729fc2af5302b134554f5dfd.png
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 APICharge APIToken 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)のcreateTokencreateSourceconfirmCardPaymentCardElement)またはconfirmPayment(PaymentElement)に変更する
  • 4: createSourceの戻り値から3Dセキュアのリダイレクトの実施判定や処理をしているコードを削除する(Stripe.js側の認証フローを利用する場合)
  • 5: createTokencreateSourceの実施後に、サーバー側で実行していたcharges.createなどの実装を削除する

より詳細な変更方法や言語別のAPIについては、以下のStripe Documentをご確認ください。

Stripeで3Dセキュア1と2の決済をテストする方法

運用しているアプリ・システムで3Dセキュア2が利用できるか否かをテストしてみましょう。

テストする上で最もシンプルな方法は、「3Dセキュア2での認証が必須のテストカード番号」を利用することです。

Stripeでは、カード番号4000000000003220をテスト環境で利用すると、必ず3Dセキュア2での認証を要求します。

スクリーンショット 2022-09-14 15.17.10.png

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を利用している場合でも表示されます。

スクリーンショット 2022-09-14 15.22.54.png

認証のテスト画面で、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を設定することで、不必要な追加認証を減らすことができます。

ダッシュボードで3Dセキュアによる認証があったかを確認する

ダッシュボードからは、実際に3Dセキュア2での認証が実行されているかを確認することもできます。

[支払い > すべての支払い]から[支払い方法]を選択しましょう。
ここで[3Dセキュア2]を選択すると、3Dセキュア2を利用した支払いを確認できます。

スクリーンショット 2022-09-14 15.26.33.png

その他の参考リソース

9
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?