mirror of
https://github.com/pretix/pretix.git
synced 2026-05-05 15:14:04 +00:00
Fix #805 -- Handling of 3D secure payments
This commit is contained in:
@@ -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',
|
||||
|
||||
@@ -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')
|
||||
|
||||
Reference in New Issue
Block a user