+ _check_yandex_response_status в переодической задаче

remotes/origin/dev_fix_pereodic_payment
wad 8 years ago
parent 4652d67c37
commit 4850676b6f
  1. 31
      config_app/management/commands/for_test.py
  2. 31
      finance/tasks.py
  3. 4
      finance/views.py

@ -5,12 +5,27 @@ class Command(BaseCommand):
help = 'Команда для тестов' help = 'Команда для тестов'
def handle(self, *args, **options): def handle(self, *args, **options):
from finance.loggers import FinanceLogger from xml.dom import minidom
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, 'привет': 'медвед'}
)
xx = """<?xml version="1.0" encoding="UTF-8"?>
<repeatCardPaymentResponse status="3" error="112" processedDT="2018-04-23T19:37:04.544+03:00" techMessage="Неверное значение параметра invoiceId" clientOrderId="unknown"/>"""
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, 'привет': 'медвед'}
# )
#

@ -8,15 +8,18 @@ from django.utils import timezone
from yandex_money.models import Payment from yandex_money.models import Payment
from finance.loggers import FinanceLogger from finance.loggers import FinanceLogger
from finance.models import InvoiceRebilling from finance.models import InvoiceRebilling, Invoice
from lms import celery_app from lms import celery_app
finance_logger = FinanceLogger() finance_logger = FinanceLogger()
@celery_app.task @celery_app.task
def periodic_billing(): def periodic_billing():
finance_logger.info("start periodic billing task") 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()): for invoice in invoices.filter(expected_date__lt=timezone.now()):
# выбираем все необработанные из прошлого # выбираем все необработанные из прошлого
with transaction.atomic(): with transaction.atomic():
@ -55,6 +58,24 @@ def _yandex_repeat_card_payment(invoice):
), ),
verify=os.path.join(settings.SSL_ROOT, 'yamoney_chain.cer') verify=os.path.join(settings.SSL_ROOT, 'yamoney_chain.cer')
) )
# TODO тут проверять нет ли ошибки яндекса (даже при 200 ответе) resp_text = resp.text
finance_logger.info('YandexMoney repeatCardPayment ended', finance_logger.info('YandexMoney repeatCardPayment response',
invoice_id=invoice.id, response=resp.text, code=resp.status_code, ) 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)

@ -448,6 +448,8 @@ class YandexAvisoView(APIView):
val = i.split('=')[1] val = i.split('=')[1]
data[key] = val data[key] = val
finance_logger.info('Подтверждение платежа запрос', request=data)
order_number = data['orderNumber'] order_number = data['orderNumber']
try: try:
pay = Payment.objects.get(order_number=order_number) 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) request="Payment with invoice_id=%s not found" % order_number)
return Response(status=204) return Response(status=204)
finance_logger.info('Подтверждение платежа запрос', request=data)
pay.shop_amount = data['shopSumAmount'] pay.shop_amount = data['shopSumAmount']
pay.status = Payment.STATUS.SUCCESS pay.status = Payment.STATUS.SUCCESS
now = timezone.now() now = timezone.now()

Loading…
Cancel
Save