diff --git a/src/pretix/plugins/paypal/payment.py b/src/pretix/plugins/paypal/payment.py index 21ffa475fa..80b5240ac3 100644 --- a/src/pretix/plugins/paypal/payment.py +++ b/src/pretix/plugins/paypal/payment.py @@ -102,6 +102,7 @@ class Paypal(BasePaymentProvider): } ] }) + request.session['payment_paypal_order'] = None return self._create_payment(request, payment) def _create_payment(self, request, payment): @@ -238,3 +239,40 @@ class Paypal(BasePaymentProvider): order = mark_order_refunded(order) order.payment_info = json.dumps(sale.to_dict()) order.save() + + def order_can_retry(self, order): + return True + + def retry_prepare(self, request, order): + self.init_api() + payment = paypalrestsdk.Payment({ + 'intent': 'sale', + 'payer': { + "payment_method": "paypal", + }, + "redirect_urls": { + "return_url": build_absolute_uri(request.event, 'plugins:paypal:return'), + "cancel_url": build_absolute_uri(request.event, 'plugins:paypal:abort'), + }, + "transactions": [ + { + "item_list": { + "items": [ + { + "name": 'Order %s' % order.code, + "quantity": 1, + "price": str(order.total), + "currency": order.event.currency + } + ] + }, + "amount": { + "currency": request.event.currency, + "total": str(order.total) + }, + "description": __('Event tickets for %s') % request.event.name + } + ] + }) + request.session['payment_paypal_order'] = order.pk + return self._create_payment(request, payment) diff --git a/src/pretix/plugins/paypal/templates/pretixplugins/paypal/pending.html b/src/pretix/plugins/paypal/templates/pretixplugins/paypal/pending.html index a7ee12b963..7ea6214ea9 100644 --- a/src/pretix/plugins/paypal/templates/pretixplugins/paypal/pending.html +++ b/src/pretix/plugins/paypal/templates/pretixplugins/paypal/pending.html @@ -4,9 +4,6 @@

{% blocktrans trimmed %} Our attempt to execute your Payment via PayPal has failed. Please try again or contact us. {% endblocktrans %}

-

- {% trans "Try again" %} -

{% else %}

{% blocktrans trimmed %} We're waiting for an answer from PayPal regarding your payment. Please contact us, if this diff --git a/src/pretix/plugins/paypal/urls.py b/src/pretix/plugins/paypal/urls.py index 43e0b31ded..0354318ca1 100644 --- a/src/pretix/plugins/paypal/urls.py +++ b/src/pretix/plugins/paypal/urls.py @@ -1,11 +1,10 @@ from django.conf.urls import include, url -from .views import abort, retry, success +from .views import abort, success urlpatterns = [ url(r'^(?:(?P[^/]+)/)?(?P[^/]+)/paypal/', include([ url(r'^abort/$', abort, name='abort'), url(r'^return/$', success, name='return'), - url(r'^retry/(?P[^/]+)/', retry, name='retry') ])), ] diff --git a/src/pretix/plugins/paypal/views.py b/src/pretix/plugins/paypal/views.py index 7de2f357f0..121d29a37c 100644 --- a/src/pretix/plugins/paypal/views.py +++ b/src/pretix/plugins/paypal/views.py @@ -1,29 +1,33 @@ import logging -import paypalrestsdk from django.contrib import messages -from django.contrib.auth.decorators import login_required from django.shortcuts import redirect -from django.utils.translation import ugettext as __, ugettext_lazy as _ +from django.utils.translation import ugettext_lazy as _ from pretix.base.models import Event, Order -from pretix.helpers.urls import build_absolute_uri from pretix.multidomain.urlreverse import eventreverse from pretix.plugins.paypal.payment import Paypal logger = logging.getLogger('pretix.plugins.paypal') -@login_required -def success(request): +def success(request, organizer=None, event=None): pid = request.GET.get('paymentId') token = request.GET.get('token') payer = request.GET.get('PayerID') - if pid == request.session['payment_paypal_id']: + if pid == request.session.get('payment_paypal_id', None): request.session['payment_paypal_token'] = token request.session['payment_paypal_payer'] = payer try: event = Event.objects.get(id=request.session['payment_paypal_event']) + if request.session.get('payment_paypal_order'): + prov = Paypal(event) + order = Order.objects.get(pk=request.session.get('payment_paypal_order')) + resp = prov.payment_perform(request, order) + return redirect(resp or eventreverse(event, 'presale:event.order', kwargs={ + 'order': order.code, + 'secret': order.secret + }) + '?paid=yes') return redirect(eventreverse(event, 'presale:event.checkout', kwargs={'step': 'confirm'})) except Event.DoesNotExist: pass # TODO: Handle this @@ -31,74 +35,10 @@ def success(request): pass # TODO: Handle this -@login_required -def abort(request): +def abort(request, organizer=None, event=None): messages.error(request, _('It looks like you cancelled the PayPal payment')) try: event = Event.objects.get(id=request.session['payment_paypal_event']) return redirect(eventreverse(event, 'presale:event.checkout', kwargs={'step': 'payment'})) except Event.DoesNotExist: pass # TODO: Handle this - - -@login_required -def retry(request, order): - try: - order = Order.objects.get( - user=request.user, - code=order, - ) - except Order.DoesNotExist: - return # TODO: Handle this - - provider = Paypal(order.event) - provider.init_api() - - if 'token' in request.GET: - if 'PayerID' in request.GET: - payment = paypalrestsdk.Payment.find(request.session.get('payment_paypal_id')) - provider._execute_payment(payment, request, order) - else: - messages.error(request, _('It looks like you cancelled the PayPal payment')) - else: - payment = paypalrestsdk.Payment({ - 'intent': 'sale', - 'payer': { - "payment_method": "paypal", - }, - "redirect_urls": { - "return_url": build_absolute_uri('plugins:paypal:retry', kwargs={ - 'order': order.code - }), - "cancel_url": build_absolute_uri('plugins:paypal:retry', kwargs={ - 'order': order.code - }), - }, - "transactions": [ - { - "item_list": { - "items": [ - { - "name": 'Order %s' % order.code, - "quantity": 1, - "price": str(order.total), - "currency": order.event.currency - } - ] - }, - "amount": { - "currency": order.event.currency, - "total": str(order.total) - }, - "description": __('Event tickets for %s') % order.event.name - } - ] - }) - resp = provider._create_payment(request, payment) - if resp: - return redirect(resp) - - return redirect(eventreverse(order.event, 'presale:event.order', kwargs={ - 'order': order.code, - 'secret': order.secret - }) + '?paid=yes')