mirror of
https://github.com/pretix/pretix.git
synced 2026-08-19 12:16:26 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7aaf20d3cf | ||
|
|
fa615e1798 | ||
|
|
cb9ec93695 | ||
|
|
0c3a8d30b5 | ||
|
|
2500730db6 | ||
|
|
89f1ce8976 | ||
|
|
4fc64a063b | ||
|
|
9878d7bfaa | ||
|
|
5f50d08707 | ||
|
|
e9dee4007e | ||
|
|
0b3015511f | ||
|
|
e62a55667a | ||
|
|
5135ae524e | ||
|
|
647c89627a |
@@ -23,7 +23,7 @@ import json
|
||||
import logging
|
||||
import urllib.parse
|
||||
from collections import OrderedDict
|
||||
from datetime import datetime, timedelta
|
||||
from datetime import datetime, timedelta, timezone
|
||||
from decimal import Decimal
|
||||
|
||||
from django import forms
|
||||
@@ -55,7 +55,7 @@ from pretix.base.forms import SecretKeySettingsField
|
||||
from pretix.base.forms.questions import guess_country
|
||||
from pretix.base.models import Event, Order, OrderPayment, OrderRefund, Quota
|
||||
from pretix.base.payment import BasePaymentProvider, PaymentException
|
||||
from pretix.base.settings import SettingsSandbox
|
||||
from pretix.base.settings import GlobalSettingsObject, SettingsSandbox
|
||||
from pretix.helpers import OF_SELF
|
||||
from pretix.helpers.urls import mainreverse_absolute
|
||||
from pretix.multidomain.urlreverse import eventreverse, eventreverse_absolute
|
||||
@@ -645,7 +645,7 @@ class PaypalMethod(BasePaymentProvider):
|
||||
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:
|
||||
# payment is already confirmed; possible return-view/webhook race-condition
|
||||
logger.warning('payment is already confirmed; possible return-view/webhook race-condition')
|
||||
return
|
||||
|
||||
try:
|
||||
|
||||
@@ -99,6 +99,10 @@ def register_global_settings(sender, **kwargs):
|
||||
('sandbox', 'Sandbox'),
|
||||
),
|
||||
)),
|
||||
('payment_paypal_abort_pending_payment_allowed_timeout', forms.IntegerField(
|
||||
label=_('Paypal: Debounce timeout (minutes) after which it is possible to abort a PENDING_REVIEW payment.'),
|
||||
initial=30,
|
||||
)),
|
||||
])
|
||||
|
||||
|
||||
|
||||
@@ -471,8 +471,8 @@ def webhook(request, *args, **kwargs):
|
||||
elif payment.state in (OrderPayment.PAYMENT_STATE_PENDING, OrderPayment.PAYMENT_STATE_CREATED,
|
||||
OrderPayment.PAYMENT_STATE_CANCELED, OrderPayment.PAYMENT_STATE_FAILED):
|
||||
if sale['status'] == 'COMPLETED':
|
||||
any_captures = False
|
||||
all_captures_completed = True
|
||||
any_pending_review = False
|
||||
for purchaseunit in sale['purchase_units']:
|
||||
for capture in purchaseunit['payments']['captures']:
|
||||
try:
|
||||
@@ -483,9 +483,9 @@ def webhook(request, *args, **kwargs):
|
||||
|
||||
if capture['status'] not in ('COMPLETED', 'REFUNDED', 'PARTIALLY_REFUNDED'):
|
||||
all_captures_completed = False
|
||||
else:
|
||||
any_captures = True
|
||||
if any_captures and all_captures_completed:
|
||||
if capture['status_details']['reason'] == "PENDING_REVIEW":
|
||||
any_pending_review = True
|
||||
if all_captures_completed:
|
||||
try:
|
||||
payment.info = json.dumps(sale.dict())
|
||||
payment.save(update_fields=['info'])
|
||||
@@ -493,6 +493,9 @@ def webhook(request, *args, **kwargs):
|
||||
prov.log_payment_duration(payment)
|
||||
except Quota.QuotaExceededException:
|
||||
pass
|
||||
if any_pending_review:
|
||||
payment.state = OrderPayment.PAYMENT_STATE_PENDING
|
||||
payment.save()
|
||||
elif sale['status'] == 'APPROVED':
|
||||
try:
|
||||
request.session['payment_paypal_oid'] = payment.info_data['id']
|
||||
|
||||
Reference in New Issue
Block a user