LIL-274. Add PW callback view

remotes/origin/hasaccess
Ivlev Denis 8 years ago
parent 32c97d6887
commit e49f1370ee
  1. 119
      apps/payment/views.py
  2. 3
      project/urls.py

@ -7,8 +7,9 @@ from django.urls import reverse_lazy
from paymentwall import Pingback, Product, Widget from paymentwall import Pingback, Product, Widget
from apps.course.models import Course from apps.course.models import Course
from .models import CoursePayment from apps.school.models import SchoolSchedule
# from .models import Purchase
from .models import AuthorBalance, CoursePayment, SchoolPayment
class CourseBuyView(TemplateView): class CourseBuyView(TemplateView):
@ -22,7 +23,7 @@ class CourseBuyView(TemplateView):
course=course, course=course,
) )
product = Product( product = Product(
f'course_{course.id}', f'course_{course_payment.id}',
course.price, course.price,
'RUB', 'RUB',
f'Курс "{course.title}"', f'Курс "{course.title}"',
@ -42,68 +43,50 @@ class CourseBuyView(TemplateView):
return self.render_to_response(context={'widget': widget.get_html_code()}) return self.render_to_response(context={'widget': widget.get_html_code()})
# @method_decorator(csrf_exempt, name='dispatch') @method_decorator(csrf_exempt, name='dispatch')
# class PaymentwallCallbackView(View): class PaymentwallCallbackView(View):
# CHARGEBACK = '1' def get_request_ip(self):
# CREDIT_CARD_FRAUD = '2' x_forwarded_for = self.request.META.get('HTTP_X_FORWARDED_FOR')
# ORDER_FRAUD = '3' if x_forwarded_for:
# BAD_DATA = '4' ip = x_forwarded_for.split(',')[0]
# FAKE_PROXY_USER = '5' else:
# REJECTED_BY_ADVERTISER = '6' ip = self.request.META.get('REMOTE_ADDR')
# DUPLICATED_CONVERSIONS = '7' return ip
# GOODWILL_CREDIT_TAKEN_BACK = '8'
# CANCELLED_ORDER = '9' def get(self, request, *args, **kwargs):
# PARTIALLY_REVERSED = '10' payment_raw_data = request.GET.copy()
pingback = Pingback(payment_raw_data, self.get_request_ip())
# def get_request_ip(self):
# x_forwarded_for = self.request.META.get('HTTP_X_FORWARDED_FOR') if pingback.validate():
# if x_forwarded_for: product_type_name, payment_id = pingback.get_product().get_id().split('_')
# ip = x_forwarded_for.split(',')[0]
# else: if product_type_name == 'course':
# ip = self.request.META.get('REMOTE_ADDR') product_payment_class = CoursePayment
# return ip elif product_type_name == 'school':
product_payment_class = SchoolPayment
# def get(self, request, *args, **kwargs): else:
# pingback = Pingback(request.GET.copy(), self.get_request_ip()) return HttpResponse(status=403)
# if pingback.validate(): try:
# cart_id = pingback.get_product().get_id() payment = product_payment_class.objects.get(pk=payment_id)
except product_payment_class.DoesNotExist:
# # try: return HttpResponse(status=403)
# # cart = CartModel.objects.get(pk=cart_id)
# # except CartModel.DoesNotExist: payment.status = pingback.get_type()
# # log.error('Paymentwall pingback: Cant find cart, Paymentwall sent this data: {}'.format(request.GET.copy())) payment.data = payment_raw_data
# # return HttpResponse(status=403) payment.save()
# try: author_balance = getattr(payment, 'author_balance', None)
# purchase = Purchase.objects.get(transaction_id=pingback.get_reference_id()) if author_balance:
# except Purchase.DoesNotExist: if pingback.is_deliverable():
# # purchase = cart.create_purchase(transaction_id=pingback.get_reference_id()) payment.author_balance.status = AuthorBalance.ACCEPTED
# pass elif pingback.is_under_review():
payment.author_balance.status = AuthorBalance.PENDING
# if pingback.is_deliverable(): else:
# purchase.status = Purchase.COMPLETE payment.author_balance.status = AuthorBalance.DECLINED
# elif pingback.is_cancelable(): payment.author_balance.save()
# reason = pingback.get_parameter('reason') return HttpResponse('OK', status=403)
else:
# if reason == self.CHARGEBACK or reason == self.CREDIT_CARD_FRAUD or reason == self.ORDER_FRAUD or reason == self.PARTIALLY_REVERSED: return
# 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

@ -29,7 +29,7 @@ from apps.user.views import (
UserView, UserEditView, NotificationEditView, UserView, UserEditView, NotificationEditView,
PaymentHistoryView, resend_email_verify, PaymentHistoryView, resend_email_verify,
) )
from apps.payment.views import CourseBuyView from apps.payment.views import CourseBuyView, PaymentwallCallbackView
urlpatterns = [ urlpatterns = [
path('admin/', admin.site.urls), path('admin/', admin.site.urls),
@ -46,6 +46,7 @@ urlpatterns = [
path('course/<int:course_id>/comment', coursecomment, name='coursecomment'), path('course/<int:course_id>/comment', coursecomment, name='coursecomment'),
path('lesson/<int:pk>/', LessonView.as_view(), name='lesson'), path('lesson/<int:pk>/', LessonView.as_view(), name='lesson'),
path('lesson/<int:lesson_id>/comment', lessoncomment, name='lessoncomment'), path('lesson/<int:lesson_id>/comment', lessoncomment, name='lessoncomment'),
path('payments/ping', PaymentwallCallbackView.as_view(), name='payment-ping'),
path('payments/success', TemplateView.as_view(template_name='payment/payment_success.html'), name='payment-success'), path('payments/success', TemplateView.as_view(template_name='payment/payment_success.html'), name='payment-success'),
path('payments/error', TemplateView.as_view(template_name='payment/payment_error.html'), name='payment-error'), path('payments/error', TemplateView.as_view(template_name='payment/payment_error.html'), name='payment-error'),
path('search/', SearchView.as_view(), name='search'), path('search/', SearchView.as_view(), name='search'),

Loading…
Cancel
Save