mirror of
https://github.com/pretix/pretix.git
synced 2026-05-10 16:04:02 +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.'),
|
'payments are not immediately confirmed but might take some time.'),
|
||||||
required=False,
|
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())
|
] + list(super().settings_form_fields.items())
|
||||||
)
|
)
|
||||||
d.move_to_end('_enabled', last=False)
|
d.move_to_end('_enabled', last=False)
|
||||||
@@ -488,13 +500,21 @@ class StripeCC(StripeMethod):
|
|||||||
return False
|
return False
|
||||||
return True
|
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:
|
def payment_perform(self, request, order) -> str:
|
||||||
self._init_api()
|
self._init_api()
|
||||||
|
|
||||||
if request.session['payment_stripe_token'].startswith('src_'):
|
if request.session['payment_stripe_token'].startswith('src_'):
|
||||||
try:
|
try:
|
||||||
src = stripe.Source.retrieve(request.session['payment_stripe_token'], **self.api_kwargs)
|
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
|
request.session['payment_stripe_order_secret'] = order.secret
|
||||||
source = stripe.Source.create(
|
source = stripe.Source.create(
|
||||||
type='three_d_secure',
|
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_method_cc', True, bool)
|
||||||
|
settings_hierarkey.add_default('payment_stripe_cc_3ds_mode', 'recommended', str)
|
||||||
|
|
||||||
|
|
||||||
@receiver(register_global_settings, dispatch_uid='stripe_global_settings')
|
@receiver(register_global_settings, dispatch_uid='stripe_global_settings')
|
||||||
|
|||||||
Reference in New Issue
Block a user