Fix #805 -- Handling of 3D secure payments

This commit is contained in:
Raphael Michel
2018-03-26 23:22:30 +02:00
parent 9ae0d9b0a1
commit 07750c1f8c
2 changed files with 22 additions and 1 deletions

View File

@@ -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',

View File

@@ -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')