mirror of
https://github.com/pretix/pretix.git
synced 2026-05-06 15:24:02 +00:00
54 lines
1.6 KiB
Python
54 lines
1.6 KiB
Python
import json
|
|
import logging
|
|
from django.http import HttpResponse
|
|
from django.views.decorators.csrf import csrf_exempt
|
|
from django.views.decorators.http import require_POST
|
|
from pretix.base.models import Order, Event
|
|
from pretix.plugins.stripe.payment import Stripe
|
|
import stripe
|
|
|
|
|
|
logger = logging.getLogger('pretix.plugins.stripe')
|
|
|
|
|
|
@csrf_exempt
|
|
@require_POST
|
|
def webhook(request):
|
|
event_json = json.loads(request.body.decode('utf-8'))
|
|
event_type = event_json['type']
|
|
if event_type != 'charge.refunded':
|
|
# Not interested
|
|
return HttpResponse('Event is not a refund', status=200)
|
|
|
|
charge = event_json['data']['object']
|
|
if charge['object'] != 'charge':
|
|
return HttpResponse('Object is not a charge', status=200)
|
|
|
|
metadata = charge['metadata']
|
|
if 'event' not in metadata:
|
|
return HttpResponse('Event not given', status=200)
|
|
|
|
try:
|
|
event = Event.objects.current.get(identity=metadata['event'])
|
|
except Event.DoesNotExist:
|
|
return HttpResponse('Event not found', status=200)
|
|
|
|
try:
|
|
order = Order.objects.current.get(identity=metadata['order'])
|
|
except Order.DoesNotExist:
|
|
return HttpResponse('Order not found', status=200)
|
|
|
|
prov = Stripe(event)
|
|
prov._init_api()
|
|
|
|
try:
|
|
charge = stripe.Charge.retrieve(charge['id'])
|
|
except stripe.error.StripeError as err:
|
|
logger.error('Stripe error on webhook: %s Event data: %s' % (str(err), str(event_json)))
|
|
return HttpResponse('StripeError', status=500)
|
|
|
|
if charge['refunds']['total_count'] > 0 and order.status == Order.STATUS_PAID:
|
|
order.mark_refunded()
|
|
|
|
return HttpResponse(status=200)
|