diff --git a/src/pretix/plugins/stripe/payment.py b/src/pretix/plugins/stripe/payment.py index fe31531b22..2fdfd623c0 100644 --- a/src/pretix/plugins/stripe/payment.py +++ b/src/pretix/plugins/stripe/payment.py @@ -192,6 +192,18 @@ class StripeSettingsHolder(BasePaymentProvider): 'payments are not immediately confirmed but might take some time.'), required=False, )), + ('cc_3ds_mode', + forms.ChoiceField( + label=_('3D Secure mode'), + help_text=_('This determines when we will use the 3D Secure methods for credit card payments. ' + 'Using 3D Secure (also known as Verified by VISA or MasterCard SecureCode) reduces ' + 'the risk of fraud but makes the payment process a bit longer.'), + choices=( + ('required', pgettext('stripe 3dsecure', 'Only when required by the card')), + ('recommended', pgettext('stripe 3dsecure', 'Always when recommended by Stripe')), + ('optional', pgettext('stripe 3dsecure', 'Always when supported by the card')), + ), + )), ] + list(super().settings_form_fields.items()) ) d.move_to_end('_enabled', last=False) @@ -488,13 +500,21 @@ class StripeCC(StripeMethod): return False return True + def _use_3ds(self, card): + if self.settings.cc_3ds_mode == 'recommended': + return card.three_d_secure in ('required', 'recommended') + elif self.settings.cc_3ds_mode == 'optional': + return card.three_d_secure in ('required', 'recommended', 'optional') + else: + return card.three_d_secure == 'required' + def payment_perform(self, request, order) -> str: self._init_api() if request.session['payment_stripe_token'].startswith('src_'): try: src = stripe.Source.retrieve(request.session['payment_stripe_token'], **self.api_kwargs) - if src.type == 'card' and src.card and src.card.three_d_secure == 'required': + if src.type == 'card' and src.card and self._use_3ds(src.card): request.session['payment_stripe_order_secret'] = order.secret source = stripe.Source.create( type='three_d_secure', diff --git a/src/pretix/plugins/stripe/signals.py b/src/pretix/plugins/stripe/signals.py index 73f21a761f..fc95a6a9cc 100644 --- a/src/pretix/plugins/stripe/signals.py +++ b/src/pretix/plugins/stripe/signals.py @@ -90,6 +90,7 @@ def pretixcontrol_action_display(sender, action, request, **kwargs): settings_hierarkey.add_default('payment_stripe_method_cc', True, bool) +settings_hierarkey.add_default('payment_stripe_cc_3ds_mode', 'recommended', str) @receiver(register_global_settings, dispatch_uid='stripe_global_settings')