|
|
|
|
@ -1,32 +1,32 @@ |
|
|
|
|
import csv |
|
|
|
|
import logging |
|
|
|
|
import uuid |
|
|
|
|
|
|
|
|
|
import requests |
|
|
|
|
from django.conf import settings |
|
|
|
|
from django.contrib.auth import get_user_model |
|
|
|
|
from django.core.mail import EmailMessage |
|
|
|
|
from django.core.mail import EmailMultiAlternatives |
|
|
|
|
from django.db import IntegrityError |
|
|
|
|
from django.db.models import Q |
|
|
|
|
from django.http import HttpResponse, HttpResponseForbidden |
|
|
|
|
from django.shortcuts import redirect, render_to_response |
|
|
|
|
from django.template.loader import render_to_string |
|
|
|
|
from django.utils import timezone |
|
|
|
|
from django.utils.html import strip_tags |
|
|
|
|
from rest_framework.renderers import JSONRenderer |
|
|
|
|
from rest_framework.response import Response |
|
|
|
|
from rest_framework.views import APIView |
|
|
|
|
from yandex_money.models import Payment |
|
|
|
|
from django.conf import settings |
|
|
|
|
from django.core.mail import EmailMultiAlternatives |
|
|
|
|
from django.template.loader import render_to_string |
|
|
|
|
from django.utils.html import strip_tags |
|
|
|
|
|
|
|
|
|
from courses.models import Course |
|
|
|
|
from courses.api import CourseParamsApi |
|
|
|
|
from courses.models import Course |
|
|
|
|
from finance.loggers import FinanceLogger |
|
|
|
|
from finance.models import Bill, Invoice, InvoiceRebilling |
|
|
|
|
from finance.serializers import BillSerializer, InvoiceSerializer |
|
|
|
|
from lms.global_decorators import transaction_decorator |
|
|
|
|
from lms.tools import get_real_name |
|
|
|
|
from django.utils import timezone |
|
|
|
|
import uuid |
|
|
|
|
|
|
|
|
|
logger_yandex = logging.getLogger('yandex_money') |
|
|
|
|
finance_logger = FinanceLogger() # prefix='YandexMoney' |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_pay(request): |
|
|
|
|
@ -337,9 +337,7 @@ class YandexPay(APIView): |
|
|
|
|
|
|
|
|
|
msg.send() |
|
|
|
|
except Exception as exc: |
|
|
|
|
logger_yandex.error('YandexPay: Email not sended', exc_info=True, extra={ |
|
|
|
|
'exc': exc |
|
|
|
|
}) |
|
|
|
|
finance_logger.exception('YandexPay: Email not sended') |
|
|
|
|
|
|
|
|
|
return redirect(r.url) |
|
|
|
|
|
|
|
|
|
@ -395,41 +393,35 @@ class YandexCheckView(APIView): |
|
|
|
|
val = i.split('=')[1] |
|
|
|
|
data[key] = val |
|
|
|
|
|
|
|
|
|
logger_yandex.info('Проверка платежа запрос', exc_info=True, extra={ |
|
|
|
|
'request': data, |
|
|
|
|
}) |
|
|
|
|
finance_logger.info('Проверка платежа запрос', request=data) |
|
|
|
|
|
|
|
|
|
order_number = data['orderNumber'] |
|
|
|
|
try: |
|
|
|
|
pay = Payment.objects.get(order_number=data['orderNumber']) |
|
|
|
|
pay = Payment.objects.get(order_number=order_number) |
|
|
|
|
except Payment.DoesNotExist: |
|
|
|
|
logger_yandex.error('Ошибка проверки платежа', exc_info=True, extra={ |
|
|
|
|
'request': "Payment with id=%s not found" % data['orderNumber'], |
|
|
|
|
}) |
|
|
|
|
finance_logger.error('Ошибка проверки платежа', exc_info=True, |
|
|
|
|
request="Payment with id=%s not found" % order_number) |
|
|
|
|
return Response(status=204) |
|
|
|
|
|
|
|
|
|
if not pay.status == Payment.STATUS.PROCESSED: |
|
|
|
|
logger_yandex.error('Ошибка проверки платежа', exc_info=True, extra={ |
|
|
|
|
'request': "Payment with id=%s have status %s" % (data['orderNumber'], pay.status), |
|
|
|
|
}) |
|
|
|
|
finance_logger.error('Ошибка проверки платежа', |
|
|
|
|
order_number=order_number, |
|
|
|
|
request="Payment with id=%s have status %s" % (order_number, pay.status)) |
|
|
|
|
return Response(status=204) |
|
|
|
|
|
|
|
|
|
if not pay.shop_id == int(data['shopId']): |
|
|
|
|
logger_yandex.error('Ошибка проверки платежа', exc_info=True, extra={ |
|
|
|
|
'request': "ShopId=%s not match" % (data['shopId'],), |
|
|
|
|
}) |
|
|
|
|
finance_logger.error('Ошибка проверки платежа', |
|
|
|
|
request="ShopId=%s not match" % (data['shopId'],)) |
|
|
|
|
return Response(status=204) |
|
|
|
|
|
|
|
|
|
if not pay.scid == int(data['scid']): |
|
|
|
|
logger_yandex.error('Ошибка проверки платежа', exc_info=True, extra={ |
|
|
|
|
'request': "scid=%s not match" % (data['scid'],) |
|
|
|
|
}) |
|
|
|
|
finance_logger.error('Ошибка проверки платежа', |
|
|
|
|
request="scid=%s not match" % (data['scid'],)) |
|
|
|
|
return Response(status=204) |
|
|
|
|
|
|
|
|
|
if not pay.order_amount == float(data['orderSumAmount']): |
|
|
|
|
logger_yandex.error('Ошибка проверки платежа', exc_info=True, extra={ |
|
|
|
|
'request': "Expected amount is %s received amount is %s" |
|
|
|
|
% (pay.order_amount, data['orderSumAmount']), |
|
|
|
|
}) |
|
|
|
|
finance_logger.error('Ошибка проверки платежа', |
|
|
|
|
request="Expected amount is %s received amount is %s" % (pay.order_amount, data['orderSumAmount'])) |
|
|
|
|
return Response(status=204) |
|
|
|
|
|
|
|
|
|
now = timezone.now() |
|
|
|
|
@ -439,9 +431,7 @@ class YandexCheckView(APIView): |
|
|
|
|
xml_res = """<checkOrderResponse performedDatetime="%s" code="0" invoiceId="%s" shopId="%s"/> |
|
|
|
|
""" % (pay.performed_datetime, str(data['invoiceId']), str(pay.shop_id)) |
|
|
|
|
|
|
|
|
|
logger_yandex.info('Проверка платежа ответ', exc_info=True, extra={ |
|
|
|
|
'response': xml_res, |
|
|
|
|
}) |
|
|
|
|
finance_logger.info('Проверка платежа ответ', response=xml_res) |
|
|
|
|
|
|
|
|
|
return HttpResponse(xml_res, content_type='application/xml') |
|
|
|
|
|
|
|
|
|
@ -457,17 +447,16 @@ class YandexAvisoView(APIView): |
|
|
|
|
val = i.split('=')[1] |
|
|
|
|
data[key] = val |
|
|
|
|
|
|
|
|
|
order_number = data['orderNumber'] |
|
|
|
|
try: |
|
|
|
|
pay = Payment.objects.get(order_number=data['orderNumber']) |
|
|
|
|
pay = Payment.objects.get(order_number=order_number) |
|
|
|
|
except Payment.DoesNotExist: |
|
|
|
|
logger_yandex.error('Ошибка подтверждения платежа', exc_info=True, extra={ |
|
|
|
|
'request': "Payment with invoice_id=%s not found" % data['orderNumber'], |
|
|
|
|
}) |
|
|
|
|
finance_logger.error('Ошибка подтверждения платежа', exc_info=True, |
|
|
|
|
request="Payment with invoice_id=%s not found" % order_number) |
|
|
|
|
return Response(status=204) |
|
|
|
|
|
|
|
|
|
logger_yandex.info('Подтверждение платежа запрос', exc_info=True, extra={ |
|
|
|
|
'request': 'Get success pay with invoice_id(yandex) %s' % str(data['invoiceId']), |
|
|
|
|
}) |
|
|
|
|
finance_logger.info('Подтверждение платежа запрос', |
|
|
|
|
request='Get success pay with invoice_id(yandex) %s' % str(data['invoiceId'])) |
|
|
|
|
|
|
|
|
|
pay.shop_amount = data['shopSumAmount'] |
|
|
|
|
# invoice = pay.invoice |
|
|
|
|
@ -481,9 +470,7 @@ class YandexAvisoView(APIView): |
|
|
|
|
xml_res = """<paymentAvisoResponse performedDatetime="%s" code="0" invoiceId="%s" shopId="%s"/> |
|
|
|
|
""" % (pay.performed_datetime, str(data['invoiceId']), str(pay.shop_id)) |
|
|
|
|
|
|
|
|
|
logger_yandex.info('Подтверждение платежа ответ', exc_info=True, extra={ |
|
|
|
|
'response': xml_res, |
|
|
|
|
}) |
|
|
|
|
finance_logger.info('Подтверждение платежа ответ', response=xml_res) |
|
|
|
|
|
|
|
|
|
context = { |
|
|
|
|
'user_email': pay.invoice.bill.user.email, |
|
|
|
|
@ -518,7 +505,7 @@ class YandexFailView(APIView): |
|
|
|
|
val = i.split('=')[1] |
|
|
|
|
data[key] = val |
|
|
|
|
|
|
|
|
|
logger_yandex.error(data) |
|
|
|
|
finance_logger.error('YandexFailView', data=data) |
|
|
|
|
|
|
|
|
|
return redirect(to=settings.DOMAIN) |
|
|
|
|
|
|
|
|
|
@ -536,12 +523,10 @@ class DemoYandexCheckView(APIView): |
|
|
|
|
val = i.split('=')[1] |
|
|
|
|
data[key] = val |
|
|
|
|
|
|
|
|
|
logger_yandex.info('Проверка демо платежа запрос', exc_info=True, extra={ |
|
|
|
|
'request': data, |
|
|
|
|
}) |
|
|
|
|
finance_logger.info('Проверка демо платежа запрос', request=data) |
|
|
|
|
|
|
|
|
|
except IndexError: |
|
|
|
|
logger_yandex.error("Непредвиденная ошибка проверки тестогого платежа") |
|
|
|
|
finance_logger.exception("Непредвиденная ошибка проверки тестогого платежа") |
|
|
|
|
return Response(status=204) |
|
|
|
|
|
|
|
|
|
now = timezone.now() |
|
|
|
|
@ -552,14 +537,10 @@ class DemoYandexCheckView(APIView): |
|
|
|
|
else: |
|
|
|
|
xml_res = """<checkOrderResponse performedDatetime="%s" code="100" invoiceId="%s" shopId="%s" |
|
|
|
|
message="Неверный номер ордера"/>""" % (now.isoformat(), str(data['invoiceId']), str(data['shopId'])) |
|
|
|
|
logger_yandex.warning( |
|
|
|
|
"Ошибка проверки тестогого платежа" , exc_info=True, extra={ |
|
|
|
|
"response": xml_res |
|
|
|
|
} |
|
|
|
|
) |
|
|
|
|
finance_logger.warning("Ошибка проверки тестового платежа", response=xml_res) |
|
|
|
|
return HttpResponse(xml_res, content_type='application/xml') |
|
|
|
|
except KeyError: |
|
|
|
|
logger_yandex.error('Ошибка в данных checkYandex') |
|
|
|
|
finance_logger.exception('Ошибка в данных checkYandex') |
|
|
|
|
return Response(status=204) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -567,7 +548,7 @@ class DemoYandexAvisoView(APIView): |
|
|
|
|
|
|
|
|
|
@staticmethod |
|
|
|
|
def post(request): |
|
|
|
|
logger_yandex.info('Начало тестирования avisoYandex') |
|
|
|
|
finance_logger.info('Начало тестирования avisoYandex') |
|
|
|
|
data = dict() |
|
|
|
|
for i in request.body.decode('utf-8').split('&'): |
|
|
|
|
key = i.split('=')[0] |
|
|
|
|
@ -578,17 +559,11 @@ class DemoYandexAvisoView(APIView): |
|
|
|
|
if float(data['orderSumAmount']) < 1001: |
|
|
|
|
xml_res = """<paymentAvisoResponse performedDatetime="%s" code="0" invoiceId="%s" shopId="%s"/> |
|
|
|
|
""" % (now.isoformat(), str(data['invoiceId']), str(data['shopId'])) |
|
|
|
|
logger_yandex.info('Подтверждение демо платежа ответ', exc_info=True, extra={ |
|
|
|
|
'response': xml_res, |
|
|
|
|
}) |
|
|
|
|
finance_logger.info('Подтверждение демо платежа ответ', response=xml_res) |
|
|
|
|
|
|
|
|
|
else: |
|
|
|
|
xml_res = """<paymentAvisoResponse performedDatetime="%s" code="100" invoiceId="%s" shopId="%s" |
|
|
|
|
message="Нам не позволяет совесть принять от вас более 1000 рублей"/ |
|
|
|
|
>""" % (now.isoformat(), str(data['invoiceId']), str(data['shopId'])) |
|
|
|
|
logger_yandex.warning( |
|
|
|
|
"Ошибка подтверждения тестогого платежа", exc_info=True, extra={ |
|
|
|
|
"response": xml_res |
|
|
|
|
} |
|
|
|
|
) |
|
|
|
|
finance_logger.warning("Ошибка подтверждения тестогого платежа", response=xml_res) |
|
|
|
|
return HttpResponse(xml_res, content_type='application/xml') |