|
|
|
@ -1,28 +1,36 @@ |
|
|
|
import logging |
|
|
|
import logging |
|
|
|
|
|
|
|
|
|
|
|
import os |
|
|
|
import os |
|
|
|
|
|
|
|
|
|
|
|
import requests |
|
|
|
import requests |
|
|
|
from dateutil.relativedelta import relativedelta |
|
|
|
from django.conf import settings |
|
|
|
|
|
|
|
from django.db import transaction |
|
|
|
|
|
|
|
from django.utils import timezone |
|
|
|
from yandex_money.models import Payment |
|
|
|
from yandex_money.models import Payment |
|
|
|
|
|
|
|
|
|
|
|
from finance.models import InvoiceRebilling |
|
|
|
from finance.models import InvoiceRebilling |
|
|
|
from lms import celery_app |
|
|
|
from lms import celery_app |
|
|
|
from django.conf import settings |
|
|
|
|
|
|
|
from django.utils import timezone |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
logger_yandex = logging.getLogger('yandex_money') |
|
|
|
logger_yandex = logging.getLogger('yandex_money') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@celery_app.task |
|
|
|
@celery_app.task |
|
|
|
def periodic_billing(): |
|
|
|
def periodic_billing(): |
|
|
|
try: |
|
|
|
|
|
|
|
logger_yandex.info("start periodic billing task") |
|
|
|
logger_yandex.info("start periodic billing task") |
|
|
|
invoices = InvoiceRebilling.objects.filter(method='Y').exclude(status='F') |
|
|
|
invoices = InvoiceRebilling.objects.filter(method='Y').exclude(status='F') |
|
|
|
|
|
|
|
for invoice in invoices.filter(expected_date__lt=timezone.now()): |
|
|
|
|
|
|
|
# выбираем все необработанные из прошлого |
|
|
|
|
|
|
|
with transaction.atomic(): |
|
|
|
|
|
|
|
try: |
|
|
|
|
|
|
|
_yandex_repeat_card_payment(invoice) |
|
|
|
|
|
|
|
except Exception as exc: |
|
|
|
|
|
|
|
logger_yandex.critical('periodic billing Exception', exc_info=True, extra={ |
|
|
|
|
|
|
|
'invoice id': invoice.id, 'exc': exc |
|
|
|
|
|
|
|
}) |
|
|
|
|
|
|
|
invoice.comment = 'Ошибка при попытке повторного платежа, свяжитесь с клиентской службой' |
|
|
|
|
|
|
|
invoice.save() |
|
|
|
|
|
|
|
|
|
|
|
for invoice in invoices.filter( |
|
|
|
|
|
|
|
expected_date__gt=timezone.now(), expected_date__lt=timezone.now() + relativedelta(days=1)): |
|
|
|
|
|
|
|
# TODO выбирать все, даже прошлые неотработанные - что бы не потерять |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _yandex_repeat_card_payment(invoice): |
|
|
|
user = invoice.bill.user |
|
|
|
user = invoice.bill.user |
|
|
|
yandex_pay = Payment.objects.create( |
|
|
|
yandex_pay = Payment.objects.create( |
|
|
|
order_amount=invoice.price, |
|
|
|
order_amount=invoice.price, |
|
|
|
@ -33,18 +41,9 @@ def periodic_billing(): |
|
|
|
scid=settings.YANDEX_MONEY_REBILLING_SCID |
|
|
|
scid=settings.YANDEX_MONEY_REBILLING_SCID |
|
|
|
) |
|
|
|
) |
|
|
|
invoice.yandex_pay = yandex_pay |
|
|
|
invoice.yandex_pay = yandex_pay |
|
|
|
invoice.save() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
repeat_card_payment(invoice) |
|
|
|
|
|
|
|
except Exception as exc: |
|
|
|
|
|
|
|
logger_yandex.error('periodic billing Exception', exc_info=True, extra={ |
|
|
|
|
|
|
|
'exc': exc |
|
|
|
|
|
|
|
}) |
|
|
|
|
|
|
|
# TODO записывать в invoice.comments ошибку яндекса |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
resp = requests.post( |
|
|
|
def repeat_card_payment(invoice): |
|
|
|
url=settings.YANDEX_MONEY_MWS_URL + 'repeatCardPayment', |
|
|
|
resp = requests.post(settings.YANDEX_MONEY_MWS_URL + 'repeatCardPayment', |
|
|
|
|
|
|
|
data={ |
|
|
|
data={ |
|
|
|
'clientOrderId': invoice.id, # уникальное возрастающее целое число |
|
|
|
'clientOrderId': invoice.id, # уникальное возрастающее целое число |
|
|
|
'invoiceId': invoice.key, |
|
|
|
'invoiceId': invoice.key, |
|
|
|
@ -55,7 +54,9 @@ def repeat_card_payment(invoice): |
|
|
|
os.path.join(settings.SSL_ROOT, 'skillbox.cer'), |
|
|
|
os.path.join(settings.SSL_ROOT, 'skillbox.cer'), |
|
|
|
os.path.join(settings.SSL_ROOT, 'skillbox.key') |
|
|
|
os.path.join(settings.SSL_ROOT, 'skillbox.key') |
|
|
|
), |
|
|
|
), |
|
|
|
verify=os.path.join(settings.SSL_ROOT, 'yamoney_chain.cer')) |
|
|
|
verify=os.path.join(settings.SSL_ROOT, 'yamoney_chain.cer') |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
# TODO тут проверять нет ли ошибки яндекса (даже при 200 ответе) |
|
|
|
logger_yandex.info('periodic billing finish', exc_info=True, extra={ |
|
|
|
logger_yandex.info('periodic billing finish', exc_info=True, extra={ |
|
|
|
'response': resp.text, 'code': resp.status_code, |
|
|
|
'response': resp.text, 'code': resp.status_code, |
|
|
|
}) |
|
|
|
}) |
|
|
|
|