From 6c61b81e13fff92946017376b18914f3bded8839 Mon Sep 17 00:00:00 2001 From: Evgeniy Shabanov Date: Wed, 21 Mar 2018 13:13:50 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D0=B2=D1=82=D0=BE=D1=80=D0=BD?= =?UTF-8?q?=D1=8B=D0=B5=20=D0=BF=D0=BB=D0=B0=D1=82=D0=B5=D0=B6=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- finance/tasks.py | 54 ++++++++++++++++++++++++++++++++++++++---------- finance/views.py | 5 ++--- lms/settings.py | 3 +++ 3 files changed, 48 insertions(+), 14 deletions(-) diff --git a/finance/tasks.py b/finance/tasks.py index 8b04a8a..a28b3ae 100644 --- a/finance/tasks.py +++ b/finance/tasks.py @@ -1,38 +1,51 @@ import json from datetime import datetime, timedelta +import logging + +import os +import requests from django_celery_beat.models import CrontabSchedule, PeriodicTask from yandex_money.models import Payment from finance.models import Invoice from lms import celery_app +from django.conf import settings + + +logger_yandex = logging.getLogger('yandex_money') -def setup_periodic_billing(invoice_id): +def setup_periodic_billing(order_number): # TODO: настроить периодичность и срок окончания + # 12:00 первого числа каждого месяца schedule, _ = CrontabSchedule.objects.get_or_create( - minute='*', - hour='*', + minute='0', + hour='12', day_of_week='*', - day_of_month='*', + day_of_month='1', month_of_year='*' ) PeriodicTask.objects.create( crontab=schedule, - name='Periodic billing #{}'.format(invoice_id), + name='Periodic billing (order_number={})'.format(order_number), task='finance.tasks.periodic_billing', - args=json.dumps([invoice_id]), - expires=datetime.utcnow() + timedelta(minutes=5) + kwargs=json.dumps({ + 'order_number': order_number + }), + expires=datetime.utcnow() + timedelta(days=180) # в течение полугода ) @celery_app.task -def periodic_billing(invoice_id): +def periodic_billing(order_number): try: - sample = Invoice.objects.get(id=invoice_id) + sample = Invoice.objects.get(yandex_pay__order_number=order_number) except Invoice.DoesNotExist: - raise ValueError('Платеж с id={} не найден'.format(invoice_id)) + raise ValueError('Номер заказа {} не найден'.format(order_number)) + bill = sample.bill + invoice = Invoice.objects.create( status='P', price=sample.price, @@ -40,6 +53,7 @@ def periodic_billing(invoice_id): rebilling=True, bill=bill ) + if invoice.method == 'Y': user = bill.user yandex_pay = Payment.objects.create( @@ -51,4 +65,22 @@ def periodic_billing(invoice_id): ) invoice.yandex_pay = yandex_pay invoice.save() - # TODO: запрос repeatCardPayment + + repeat_card_payment(invoice) + + +def repeat_card_payment(invoice): + resp = requests.post(settings.YANDEX_MONEY_MWS_URL + 'repeatCardPayment', + data={ + 'clientOrderId': invoice.id, # уникальное возрастающее целое число + 'invoiceId': invoice.yandex_pay.invoice_id, + 'amount': invoice.price, + 'orderNumber': invoice.yandex_pay.order_number + }, + cert=( + os.path.join(settings.SSL_ROOT, 'skillbox.cer'), + os.path.join(settings.SSL_ROOT, 'skillbox.key') + ), + verify=os.path.join(settings.SSL_ROOT, 'yamoney_chain.cer')) + + logger_yandex.info(resp.text) diff --git a/finance/views.py b/finance/views.py index 7cb7489..0445e70 100644 --- a/finance/views.py +++ b/finance/views.py @@ -282,9 +282,8 @@ class YandexAvisoView(APIView): logger_yandex.info(xml_res) - invoice = pay.invoice - if invoice.rebilling_on: - setup_periodic_billing(invoice.id) + if pay.invoice.rebilling_on: + setup_periodic_billing(pay.order_number) return HttpResponse(xml_res, content_type='application/xml') diff --git a/lms/settings.py b/lms/settings.py index b4ae38d..56153dd 100644 --- a/lms/settings.py +++ b/lms/settings.py @@ -57,6 +57,7 @@ YANDEX_MONEY_SHOP_ID = '157133' YANDEX_MONEY_SHOP_PASSWORD = 'nu5Xefise' YANDEX_MONEY_FAIL_URL = '%s/api/v1/finance/yandex/fail/' % DOMAIN YANDEX_MONEY_SUCCESS_URL = '%s/' % DOMAIN +YANDEX_MONEY_MWS_URL = 'https://penelope.yamoney.ru/webservice/mws/api/' # информировать о случаях, когда модуль вернул Яндекс.Кассе ошибку YANDEX_MONEY_MAIL_ADMINS_ON_PAYMENT_ERROR = True # Application definition @@ -190,6 +191,8 @@ STATIC_ROOT = os.path.join(BASE_DIR, 'static') STATIC_URL = '/static/' +SSL_ROOT = os.path.join(BASE_DIR, 'ssl') + RAVEN_CONFIG = { 'dsn': 'http://1a09557dbd144e52af4b14bea569c114:fbb5dfaa39e64f02a1b4cc7ac665d7d7@sentry.skillbox.ru/7' }