forked from CGM_Public/pretix_original
Compare commits
2 Commits
pdf-layout
...
ppv2_apm_w
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3113fdb53a | ||
|
|
f2f1d548df |
@@ -31,6 +31,7 @@ from django import forms
|
|||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
from django.core.cache import cache
|
from django.core.cache import cache
|
||||||
|
from django.db import transaction
|
||||||
from django.http import HttpRequest
|
from django.http import HttpRequest
|
||||||
from django.template.loader import get_template
|
from django.template.loader import get_template
|
||||||
from django.templatetags.static import static
|
from django.templatetags.static import static
|
||||||
@@ -55,6 +56,7 @@ from pretix.base.models import Event, Order, OrderPayment, OrderRefund, Quota
|
|||||||
from pretix.base.payment import BasePaymentProvider, PaymentException
|
from pretix.base.payment import BasePaymentProvider, PaymentException
|
||||||
from pretix.base.services.mail import SendMailException
|
from pretix.base.services.mail import SendMailException
|
||||||
from pretix.base.settings import SettingsSandbox
|
from pretix.base.settings import SettingsSandbox
|
||||||
|
from pretix.helpers import OF_SELF
|
||||||
from pretix.helpers.urls import build_absolute_uri as build_global_uri
|
from pretix.helpers.urls import build_absolute_uri as build_global_uri
|
||||||
from pretix.multidomain.urlreverse import build_absolute_uri, eventreverse
|
from pretix.multidomain.urlreverse import build_absolute_uri, eventreverse
|
||||||
from pretix.plugins.paypal2.client.core.environment import (
|
from pretix.plugins.paypal2.client.core.environment import (
|
||||||
@@ -586,6 +588,9 @@ class PaypalMethod(BasePaymentProvider):
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
response = self.client.execute(paymentreq)
|
response = self.client.execute(paymentreq)
|
||||||
|
|
||||||
|
if payment:
|
||||||
|
ReferencedPayPalObject.objects.get_or_create(order=payment.order, payment=payment, reference=response.result.id)
|
||||||
except IOError as e:
|
except IOError as e:
|
||||||
if "RESOURCE_NOT_FOUND" in str(e):
|
if "RESOURCE_NOT_FOUND" in str(e):
|
||||||
messages.error(request, _('Your payment has failed due to a known issue within PayPal. Please try '
|
messages.error(request, _('Your payment has failed due to a known issue within PayPal. Please try '
|
||||||
@@ -618,7 +623,13 @@ class PaypalMethod(BasePaymentProvider):
|
|||||||
}
|
}
|
||||||
return template.render(ctx)
|
return template.render(ctx)
|
||||||
|
|
||||||
|
@transaction.atomic
|
||||||
def execute_payment(self, request: HttpRequest, payment: OrderPayment):
|
def execute_payment(self, request: HttpRequest, payment: OrderPayment):
|
||||||
|
payment = OrderPayment.objects.select_for_update(of=OF_SELF).get(pk=payment.pk)
|
||||||
|
if payment.state == OrderPayment.PAYMENT_STATE_CONFIRMED:
|
||||||
|
logger.warning('payment is already confirmed; possible return-view/webhook race-condition')
|
||||||
|
return
|
||||||
|
|
||||||
try:
|
try:
|
||||||
if request.session.get('payment_paypal_oid', '') == '':
|
if request.session.get('payment_paypal_oid', '') == '':
|
||||||
raise PaymentException(_('We were unable to process your payment. See below for details on how to '
|
raise PaymentException(_('We were unable to process your payment. See below for details on how to '
|
||||||
|
|||||||
@@ -482,29 +482,35 @@ def webhook(request, *args, **kwargs):
|
|||||||
amount=payment.amount - known_sum
|
amount=payment.amount - known_sum
|
||||||
)
|
)
|
||||||
elif payment.state in (OrderPayment.PAYMENT_STATE_PENDING, OrderPayment.PAYMENT_STATE_CREATED,
|
elif payment.state in (OrderPayment.PAYMENT_STATE_PENDING, OrderPayment.PAYMENT_STATE_CREATED,
|
||||||
OrderPayment.PAYMENT_STATE_CANCELED, OrderPayment.PAYMENT_STATE_FAILED) \
|
OrderPayment.PAYMENT_STATE_CANCELED, OrderPayment.PAYMENT_STATE_FAILED):
|
||||||
and sale['status'] == 'COMPLETED':
|
if sale['status'] == 'COMPLETED':
|
||||||
any_captures = False
|
any_captures = False
|
||||||
all_captures_completed = True
|
all_captures_completed = True
|
||||||
for purchaseunit in sale['purchase_units']:
|
for purchaseunit in sale['purchase_units']:
|
||||||
for capture in purchaseunit['payments']['captures']:
|
for capture in purchaseunit['payments']['captures']:
|
||||||
try:
|
try:
|
||||||
ReferencedPayPalObject.objects.get_or_create(order=payment.order, payment=payment,
|
ReferencedPayPalObject.objects.get_or_create(order=payment.order, payment=payment,
|
||||||
reference=capture['id'])
|
reference=capture['id'])
|
||||||
except ReferencedPayPalObject.MultipleObjectsReturned:
|
except ReferencedPayPalObject.MultipleObjectsReturned:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
if capture['status'] not in ('COMPLETED', 'REFUNDED', 'PARTIALLY_REFUNDED'):
|
if capture['status'] not in ('COMPLETED', 'REFUNDED', 'PARTIALLY_REFUNDED'):
|
||||||
all_captures_completed = False
|
all_captures_completed = False
|
||||||
else:
|
else:
|
||||||
any_captures = True
|
any_captures = True
|
||||||
if any_captures and all_captures_completed:
|
if any_captures and all_captures_completed:
|
||||||
|
try:
|
||||||
|
payment.info = json.dumps(sale.dict())
|
||||||
|
payment.save(update_fields=['info'])
|
||||||
|
payment.confirm()
|
||||||
|
except Quota.QuotaExceededException:
|
||||||
|
pass
|
||||||
|
elif sale['status'] == 'APPROVED':
|
||||||
|
request.session['payment_paypal_oid'] = payment.info_data['id']
|
||||||
try:
|
try:
|
||||||
payment.info = json.dumps(sale.dict())
|
payment.payment_provider.execute_payment(request, payment)
|
||||||
payment.save(update_fields=['info'])
|
except PaymentException as e:
|
||||||
payment.confirm()
|
logger.exception('PayPal2 - Could not capture/execute_payment from Webhook: {}'.format(str(e)))
|
||||||
except Quota.QuotaExceededException:
|
|
||||||
pass
|
|
||||||
|
|
||||||
return HttpResponse(status=200)
|
return HttpResponse(status=200)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user