def oauth_return(request, *args, **kwargs): if 'payment_stripe_oauth_event' not in request.session: messages.error(request, _('An error occurred during connecting with Stripe, please try again.')) return redirect(reverse('control:index')) event = get_object_or_404(Event, pk=request.session['payment_stripe_oauth_event']) if request.GET.get('state') != request.session['payment_stripe_oauth_token']: messages.error(request, _('An error occurred during connecting with Stripe, please try again.')) return redirect(reverse('control:event.settings.payment.provider', kwargs={ 'organizer': event.organizer.slug, 'event': event.slug, 'provider': 'stripe_settings' })) gs = GlobalSettingsObject() testdata = {} try: resp = requests.post('https://connect.stripe.com/oauth/token', data={ 'grant_type': 'authorization_code', 'client_secret': ( gs.settings.payment_stripe_connect_secret_key or gs.settings.payment_stripe_connect_test_secret_key ), 'code': request.GET.get('code') }) data = resp.json() if 'error' not in data: account = stripe.Account.retrieve( data['stripe_user_id'], api_key=gs.settings.payment_stripe_connect_secret_key or gs.settings.payment_stripe_connect_test_secret_key ) except: logger.exception('Failed to obtain OAuth token') messages.error(request, _('An error occurred during connecting with Stripe, please try again.')) else: if 'error' not in data and data['livemode']: try: testresp = requests.post('https://connect.stripe.com/oauth/token', data={ 'grant_type': 'refresh_token', 'client_secret': gs.settings.payment_stripe_connect_test_secret_key, 'refresh_token': data['refresh_token'] }) testdata = testresp.json() except: logger.exception('Failed to obtain OAuth token') messages.error(request, _('An error occurred during connecting with Stripe, please try again.')) return redirect(reverse('control:event.settings.payment.provider', kwargs={ 'organizer': event.organizer.slug, 'event': event.slug, 'provider': 'stripe_settings' })) if 'error' in data: messages.error(request, _('Stripe returned an error: {}').format(data['error_description'])) elif data['livemode'] and 'error' in testdata: messages.error(request, _('Stripe returned an error: {}').format(testdata['error_description'])) else: messages.success(request, _('Your Stripe account is now connected to pretix. You can change the settings in ' 'detail below.')) event.settings.payment_stripe_publishable_key = data['stripe_publishable_key'] # event.settings.payment_stripe_connect_access_token = data['access_token'] we don't need it, right? event.settings.payment_stripe_connect_refresh_token = data['refresh_token'] event.settings.payment_stripe_connect_user_id = data['stripe_user_id'] event.settings.payment_stripe_merchant_country = account.get('country') if account.get('business_name') or account.get('display_name') or account.get('email'): event.settings.payment_stripe_connect_user_name = ( account.get('business_name') or account.get('display_name') or account.get('email') ) if data['livemode']: event.settings.payment_stripe_publishable_test_key = testdata['stripe_publishable_key'] else: event.settings.payment_stripe_publishable_test_key = event.settings.payment_stripe_publishable_key if request.session.get('payment_stripe_oauth_enable', False): event.settings.payment_stripe__enabled = True del request.session['payment_stripe_oauth_enable'] stripe_verify_domain.apply_async(args=(event.pk, get_domain_for_event(event))) return redirect(reverse('control:event.settings.payment.provider', kwargs={ 'organizer': event.organizer.slug, 'event': event.slug, 'provider': 'stripe_settings' }))