You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
2.7 KiB
76 lines
2.7 KiB
from django.utils.decorators import method_decorator
|
|
from django.views.generic import View
|
|
from django.views.decorators.csrf import csrf_exempt
|
|
from django.http import HttpResponse
|
|
|
|
from paymentwall.pingback import Pingback
|
|
|
|
from .models import Purchase
|
|
|
|
|
|
@method_decorator(csrf_exempt, name='dispatch')
|
|
class PaymentwallCallbackView(View):
|
|
|
|
CHARGEBACK = '1'
|
|
CREDIT_CARD_FRAUD = '2'
|
|
ORDER_FRAUD = '3'
|
|
BAD_DATA = '4'
|
|
FAKE_PROXY_USER = '5'
|
|
REJECTED_BY_ADVERTISER = '6'
|
|
DUPLICATED_CONVERSIONS = '7'
|
|
GOODWILL_CREDIT_TAKEN_BACK = '8'
|
|
CANCELLED_ORDER = '9'
|
|
PARTIALLY_REVERSED = '10'
|
|
|
|
def get_request_ip(self):
|
|
x_forwarded_for = self.request.META.get('HTTP_X_FORWARDED_FOR')
|
|
if x_forwarded_for:
|
|
ip = x_forwarded_for.split(',')[0]
|
|
else:
|
|
ip = self.request.META.get('REMOTE_ADDR')
|
|
return ip
|
|
|
|
def get(self, request, *args, **kwargs):
|
|
pingback = Pingback(request.GET.copy(), self.get_request_ip())
|
|
|
|
if pingback.validate():
|
|
cart_id = pingback.get_product().get_id()
|
|
|
|
# try:
|
|
# cart = CartModel.objects.get(pk=cart_id)
|
|
# except CartModel.DoesNotExist:
|
|
# log.error('Paymentwall pingback: Cant find cart, Paymentwall sent this data: {}'.format(request.GET.copy()))
|
|
# return HttpResponse(status=403)
|
|
|
|
try:
|
|
purchase = Purchase.objects.get(transaction_id=pingback.get_reference_id())
|
|
except Purchase.DoesNotExist:
|
|
# purchase = cart.create_purchase(transaction_id=pingback.get_reference_id())
|
|
pass
|
|
|
|
if pingback.is_deliverable():
|
|
purchase.status = Purchase.COMPLETE
|
|
|
|
elif pingback.is_cancelable():
|
|
reason = pingback.get_parameter('reason')
|
|
|
|
if reason == self.CHARGEBACK or reason == self.CREDIT_CARD_FRAUD or reason == self.ORDER_FRAUD or reason == self.PARTIALLY_REVERSED:
|
|
purchase.status = Purchase.CHARGEBACK
|
|
elif reason == self.CANCELLED_ORDER:
|
|
purchase.status = Purchase.REFUNDED
|
|
else:
|
|
purchase.status = Purchase.ERROR
|
|
|
|
elif pingback.is_under_review():
|
|
purchase.status = Purchase.PENDING
|
|
|
|
else:
|
|
# log.error('Paymentwall pingback: Unknown pingback type, Paymentwall sent this data: {}'.format(request.GET.copy()))
|
|
pass
|
|
|
|
# purchase.save()
|
|
return HttpResponse('OK', status=200)
|
|
else:
|
|
# log.error('Paymentwall pingback: Cant validate pingback, error: {} Paymentwall sent this data: {}'.format(pingback.get_error_summary(), request.GET.copy()))
|
|
pass
|
|
|
|
|