クレジットカードを使う月額課金型サービスへの3-Dセキュアはどのように導入すべきか
世の中の一般的なクレジットカード決済では顧客が起点となって決済が発生している(例: ECサイトで商品を買うような場合)。なので、決済実施のタイミングで3-Dセキュアを実施し、場合によってはチャレンジ認証(SMS通知などでカードホルダーに対して決済の承認を求めるようなフロー)が走っても差し支えがない。
それに対して、月額課金型サービスでの月額費用決済が発生した時は顧客起点ではなく、サービス事業者(クレジットカード加盟店)が起点となって決済が発生している(例: 月初支払いなら毎月月初に顧客が登録したクレジットカードに請求をする処理がサービス事業社側のシステムで走る)。
このとき、決済処理が走ったタイミングでは顧客は決済のフローの中に居ないので3-Dセキュアはどうやって走らせるんだろうと思った。
その答えはJDMAが公開している「EMV-3Dセキュアの具体的な運用」に書かれていた。
加盟店起点で決済が走る場合、『加盟店起点の取引における例外』の条件が適用され、あらかじめ『初回決済時やカード番号登録時に3-Dセキュアによる認証を行う』ことによって、毎月の月額決済発生時に都度3-Dセキュアを走らせる必要がなくなる。
つまり、顧客がクレジットカードをサービスのシステムに登録しようとするタイミングで3-Dセキュアを実施しておけば、月額決済の都度3-Dセキュアを行う必要がなくなる。
(ただし、顧客から契約内容変更や商品・サービスの追加などの顧客接点が生じた場合は3-Dセキュアによる認証を行う必要がある、と記載があるので、契約内容変更をした際は3-Dセキュアによる認証が必要)
じゃぁ実際にどうやってカード番号登録時に3-Dセキュアによる認証を行うかなのだけれど、Stripeの場合は「カードの保存時または最初の使用時のいずれかで、すべてのカードに対して少なくとも 1 回は 3DS 認証を適用します。3DS 必須義務化以前に Stripe 上に保存されたカードは、3DS を通じて認証されたものとして扱われます」という挙動をすると下記URLのドキュメントに記載されている。なので、日本で開設したStripeアカウントであれば特別なコード変更をすることなくカード番号登録時に3-Dセキュアが走ることになる。
もし、どのような場合でも3Dセキュアを走らせたい場合は、SetupIntentを使ってカード情報を保存するときにpayment_method_options.card.request_three_d_secure
にany
を設定することで3-Dセキュアを走らせることができる。
payment_method_options.card.request_three_d_secure
にany
を設定した場合、基本的には3-Dセキュアのフリクションレスフローでの認証が走るようなので、顧客が追加のワンタイムパスワード入力などを求められることなくカード情報を保存できそう。
(ただし、フリクションレスフローになるかどうかはクレジットカード発行発行会社側のリスク判断次第なので、リスクが高いとみなされればSMS認証等のチャレンジ認証が発生する場合もある)
payment_method_options.card.request_three_d_secure
のデフォルト値automatic
の場合は、上述のStripeのドキュメントの通り「カードの保存時または最初の使用時のいずれかで、すべてのカードに対して少なくとも 1 回は 3DS 認証を適用します。3DS 必須義務化以前に Stripe 上に保存されたカードは、3DS を通じて認証されたものとして扱われます」という挙動になる。
GMO-PGが公開しているドキュメント「3Dセキュア2.0/登録カードへ毎月請求しています。毎月の請求にも3Dセキュア認証は必要ですか?」にも、JDMAが公開している「EMV-3Dセキュアの具体的な運用」に従った内容を書いている。
購入者様が操作する「決済時」または「カード登録時」には、3Dセキュア2.0認証が必要です。
加盟店様が毎月、登録カードへの請求処理を実施する場合、
2回目以降の請求時に3Dセキュア2.0認証は不要です。加盟店様が定期的に請求を行う場合、購入者様ご本人の操作ができないため、
請求時に3Dセキュア認証を実施することはできません。