diff --git a/config_app/management/commands/for_test.py b/config_app/management/commands/for_test.py index c0172e6..9388dfa 100644 --- a/config_app/management/commands/for_test.py +++ b/config_app/management/commands/for_test.py @@ -5,12 +5,27 @@ class Command(BaseCommand): help = 'Команда для тестов' def handle(self, *args, **options): - from finance.loggers import FinanceLogger - logger = FinanceLogger() - try: - 10 / 0 - except Exception as exc: - logger.exception('FinanceLogger test log record', extra={'asdf': 3246523}, - invoice_id=42, some_param={'a': 1, 'b': 3, 'привет': 'медвед'} - ) + from xml.dom import minidom + xx = """ + """ + dom = minidom.parseString(xx) + dom.normalize() + node1 = dom.getElementsByTagName("repeatCardPaymentResponse")[0] + print(node1) + print(node1.getAttribute('error')) + print(node1.getAttribute('processedDT')) + print(node1.getAttribute('techMessage')) + + + + # def handle(self, *args, **options): + # from finance.loggers import FinanceLogger + # logger = FinanceLogger() + # try: + # 10 / 0 + # except Exception as exc: + # logger.exception('FinanceLogger test log record', extra={'asdf': 3246523}, + # invoice_id=42, some_param={'a': 1, 'b': 3, 'привет': 'медвед'} + # ) + # diff --git a/finance/tasks.py b/finance/tasks.py index 6977e98..dbd12fb 100644 --- a/finance/tasks.py +++ b/finance/tasks.py @@ -8,15 +8,18 @@ from django.utils import timezone from yandex_money.models import Payment from finance.loggers import FinanceLogger -from finance.models import InvoiceRebilling +from finance.models import InvoiceRebilling, Invoice from lms import celery_app finance_logger = FinanceLogger() + @celery_app.task def periodic_billing(): finance_logger.info("start periodic billing task") - invoices = InvoiceRebilling.objects.filter(method='Y').exclude(status='F') + # TODO заюзать Invoice.BILL_STATUSES + invoices = InvoiceRebilling.objects.filter(method='Y', status='W') + # TODO тут был exclude('F') то есть все неоплаченные... но это не верно! for invoice in invoices.filter(expected_date__lt=timezone.now()): # выбираем все необработанные из прошлого with transaction.atomic(): @@ -55,6 +58,24 @@ def _yandex_repeat_card_payment(invoice): ), verify=os.path.join(settings.SSL_ROOT, 'yamoney_chain.cer') ) - # TODO тут проверять нет ли ошибки яндекса (даже при 200 ответе) - finance_logger.info('YandexMoney repeatCardPayment ended', - invoice_id=invoice.id, response=resp.text, code=resp.status_code, ) + resp_text = resp.text + finance_logger.info('YandexMoney repeatCardPayment response', + invoice_id=invoice.id, response=resp_text, code=resp.status_code, ) + try: + _check_yandex_response_status(invoice, resp_text) + except Exception as exc: + finance_logger.exception("Can't parse yandex response", invoice_id=invoice.id, response=resp_text) + + +def _check_yandex_response_status(invoice, resp_text): + from xml.dom import minidom + dom = minidom.parseString(resp_text) + dom.normalize() + resp_node = dom.getElementsByTagName("repeatCardPaymentResponse")[0] + status = resp_node.getAttribute('status') + if status != '0': + error = resp_node.getAttribute('error') + processed_dt = resp_node.getAttribute('processedDT') + tech_message = resp_node.getAttribute('techMessage') + invoice.status += Invoice.BILL_STATUSES[-1][0] + invoice.comment += 'Yandex Kassa: ошибка № {}, сообщение {} от {}'.format(error, tech_message, processed_dt) diff --git a/finance/views.py b/finance/views.py index d9b09b8..bfb195b 100644 --- a/finance/views.py +++ b/finance/views.py @@ -448,6 +448,8 @@ class YandexAvisoView(APIView): val = i.split('=')[1] data[key] = val + finance_logger.info('Подтверждение платежа запрос', request=data) + order_number = data['orderNumber'] try: pay = Payment.objects.get(order_number=order_number) @@ -456,8 +458,6 @@ class YandexAvisoView(APIView): request="Payment with invoice_id=%s not found" % order_number) return Response(status=204) - finance_logger.info('Подтверждение платежа запрос', request=data) - pay.shop_amount = data['shopSumAmount'] pay.status = Payment.STATUS.SUCCESS now = timezone.now()