From 1a2d3b7164f1099f9a9662759848cb312ccf57e8 Mon Sep 17 00:00:00 2001 From: Dmitriy Shesterkin Date: Sat, 15 Jul 2017 22:16:50 +0300 Subject: [PATCH] add robokassa paymant --- src/customer/admin.py | 20 ++++++++- src/customer/models.py | 46 +++++++++++++++++--- src/customer/views/license.py | 9 +--- src/dokumentor/settings/common.py | 14 ------ src/dokumentor/settings/local.py | 10 +++++ src/dokumentor/settings/production.py | 11 +++++ src/dokumentor/settings/stage.py | 10 +++++ src/robokassa/views.py | 5 +-- static/css/style.css | 9 ++++ templates/customer/profile/license_list.html | 37 ---------------- templates/customer/profile/paid_list.html | 31 ------------- templates/customer/profile/yandex.html | 29 ------------ templates/robokassa/error.html | 15 ++++--- templates/robokassa/fail.html | 12 +++-- templates/robokassa/form.html | 8 +++- templates/robokassa/success.html | 13 ++++-- 16 files changed, 138 insertions(+), 141 deletions(-) delete mode 100644 templates/customer/profile/license_list.html delete mode 100644 templates/customer/profile/paid_list.html delete mode 100644 templates/customer/profile/yandex.html diff --git a/src/customer/admin.py b/src/customer/admin.py index d717df1..f00caf0 100644 --- a/src/customer/admin.py +++ b/src/customer/admin.py @@ -104,7 +104,25 @@ class ClientAdmin(admin.ModelAdmin): @admin.register(models.Payment) class PaymentAdmin(admin.ModelAdmin): - pass + list_display = ( + 'admin_pk', + 'admin_user', + 'order_amount', + 'order_number', + 'status' + ) + + def admin_pk(self, obj): + return obj.pk + + admin_pk.short_description = 'Ключ' + admin_pk.admin_order_field = 'pk' + + def admin_user(self, obj): + return obj.user.email + + admin_user.short_description = 'Email' + admin_user.admin_order_field = 'user__email' admin.site.register(models.UserProfile, UserProfileAdmin) diff --git a/src/customer/models.py b/src/customer/models.py index 9c7e057..7558a69 100644 --- a/src/customer/models.py +++ b/src/customer/models.py @@ -6,6 +6,7 @@ import logging from datetime import datetime, timedelta from PIL import Image +from django.dispatch import receiver from pytils import numeral from dateutil.relativedelta import relativedelta @@ -19,7 +20,7 @@ from django.conf import settings from customer import consts, managers, utils from myauth.models import DokUser from commons.utils import only_numerics -from robokassa.signals import result_received +from robokassa.signals import result_received, success_page_visited log = logging.getLogger(__name__) @@ -751,12 +752,47 @@ class Payment(models.Model): verbose_name_plural = 'Платежи' def __str__(self): - return f'{self.user}-{self.order_number}' + return f'{self.user}-{self.order_number}-{self.get_status_display()}' -def payment_received(sender, **kwargs): - print(kwargs) +@receiver(result_received) +def order_completed(sender, **kwargs): + try: + payment = Payment.objects.get( + pk=kwargs['InvId'], + order_amount=kwargs['OutSum'] + ) + payment.status = Payment.SUCCESS + payment.save() + + lic = License.objects.get(pk=payment.order_number) + lic.status = consts.STATUS_PAID + lic.paid_date = datetime.now().date() + lic.save() + except Payment.DoesNotExist: + log.info(f"payment with id={kwargs['InvId']} not found") + except License.DoesNotExist: + log.info(f"payment with id={kwargs['InvId']} not found") -result_received.connect(payment_received) +@receiver(success_page_visited) +def success_page_visited_completed(sender, **kwargs): + if settings.DEBUG: + try: + payment = Payment.objects.get( + pk=kwargs['InvId'], + order_amount=kwargs['OutSum'] + ) + payment.status = Payment.SUCCESS + payment.save() + + lic = License.objects.get(pk=payment.order_number) + lic.status = consts.STATUS_PAID + lic.paid_date = datetime.now().date() + lic.save() + + except Payment.DoesNotExist: + log.info(f"payment with id={kwargs['InvId']} not found") + except License.DoesNotExist: + log.info(f"payment with id={kwargs['InvId']} not found") diff --git a/src/customer/views/license.py b/src/customer/views/license.py index 2e9889a..2f950e0 100644 --- a/src/customer/views/license.py +++ b/src/customer/views/license.py @@ -46,8 +46,7 @@ def order_license(request): payment = Payment.objects.create( order_amount=form.cleaned_data['term'].price, order_number=new_license.id, - user=request.user - ) + user=request.user) return redirect(reverse('payment_robokassa', kwargs={'payment_id': payment.id})) return redirect(reverse('customer-orders')) @@ -179,12 +178,6 @@ def orders_list(request): def pay_with_robokassa(request, payment_id): payment = get_object_or_404(Payment, pk=payment_id) - # https://auth.robokassa.ru/Merchant/Index.aspx?isTest=1&MerchantLogin=Dokumentor&InvId=231849535&OutSum=100.00&SignatureValue=5c330dbb455ab540fb5fb4ee6b476f3a&Culture=ru - # http://127.0.0.1:8000/robokassa/success/?inv_id=3&InvId=3&out_summ=200.00&OutSum=200.00&crc=2c5050aaff3788c19cbd50ac6974f650&SignatureValue=2c5050aaff3788c19cbd50ac6974f650&Culture=ru&IsTest=1 - # http://127.0.0.1:8000/robokassa/success/?inv_id=5&InvId=5&out_summ=3000.00&OutSum=3000.00&crc=3e9ae74938ad9397053bf184732e8bfa&SignatureValue=3e9ae74938ad9397053bf184732e8bfa&Culture=ru&IsTest=1 - # 29CE5970A619428DE1E800A49E68E13B - # 3e9ae74938ad9397053bf184732e8bfa - form = RobokassaForm(initial={ 'OutSum': payment.order_amount, 'InvId': payment.id, diff --git a/src/dokumentor/settings/common.py b/src/dokumentor/settings/common.py index 4cb5b20..20080d9 100644 --- a/src/dokumentor/settings/common.py +++ b/src/dokumentor/settings/common.py @@ -320,20 +320,6 @@ OWNER = { 'SIGN_GB': os.path.join(ROOT_DIR, 'extra', 'gb_sign.png') } -# ROBOKASSA_PASSWORD1 = 'O9ohc2uT8T9s1fKwXbuq' -# ROBOKASSA_PASSWORD2 = 'D552KBeAJhhVOfKEqT62' - - -# Robokassa -ROBOKASSA_LOGIN = 'Dokumentor' -# Test -ROBOKASSA_PASSWORD1 = 'ZtcV4jzgJ5qI2Cx7Rc4a' -ROBOKASSA_PASSWORD2 = 'iuJI7adaUGGE96QKz17a' - -ROBOKASSA_USE_POST = False -ROBOKASSA_STRICT_CHECK = True -ROBOKASSA_TEST_MODE = True - LOGGING = { 'version': 1, 'disable_existing_loggers': True, diff --git a/src/dokumentor/settings/local.py b/src/dokumentor/settings/local.py index 20bd0c6..78d865a 100644 --- a/src/dokumentor/settings/local.py +++ b/src/dokumentor/settings/local.py @@ -27,3 +27,13 @@ DATABASES = { EMAIL_BACKEND = 'eml_email_backend.EmailBackend' EMAIL_FILE_PATH = os.path.join(ROOT_DIR, 'tmp_emails') + +# Robokassa +ROBOKASSA_LOGIN = 'Dokumentor' +# Test +ROBOKASSA_PASSWORD1 = 'ZtcV4jzgJ5qI2Cx7Rc4a' +ROBOKASSA_PASSWORD2 = 'iuJI7adaUGGE96QKz17a' + +ROBOKASSA_USE_POST = True +ROBOKASSA_STRICT_CHECK = False +ROBOKASSA_TEST_MODE = True diff --git a/src/dokumentor/settings/production.py b/src/dokumentor/settings/production.py index 12e2210..0c69f8d 100644 --- a/src/dokumentor/settings/production.py +++ b/src/dokumentor/settings/production.py @@ -35,3 +35,14 @@ EMAIL_HOST_PASSWORD = e.get('DJANGO_EMAIL_PASSWORD') EMAIL_USE_TLS = e.get('DJANGO_EMAIL_USE_TLS') EMAIL_USE_SSL = e.get('DJANGO_EMAIL_USE_SSL') EMAIL_SUBJECT_PREFIX = 'dokumentor ' + + +# Robokassa +ROBOKASSA_LOGIN = 'Dokumentor' + +ROBOKASSA_PASSWORD1 = 'O9ohc2uT8T9s1fKwXbuq' +ROBOKASSA_PASSWORD2 = 'D552KBeAJhhVOfKEqT62' + +ROBOKASSA_USE_POST = True +ROBOKASSA_STRICT_CHECK = True +ROBOKASSA_TEST_MODE = False diff --git a/src/dokumentor/settings/stage.py b/src/dokumentor/settings/stage.py index a8c75f0..8b8e6d0 100644 --- a/src/dokumentor/settings/stage.py +++ b/src/dokumentor/settings/stage.py @@ -59,3 +59,13 @@ CALLBACK_SETTINGS = { 'MANAGERS_EMAILS': ('mitri4@bk.ru', 'alexander.time@gmail.com', 'dmitriy.shesterkin@gmail.com'), 'NEW_REQ_AVAIL_EMAIL_SUBJ': u'Вопрос техподдержке', } + +# Robokassa +ROBOKASSA_LOGIN = 'Dokumentor' +# Test +ROBOKASSA_PASSWORD1 = 'ZtcV4jzgJ5qI2Cx7Rc4a' +ROBOKASSA_PASSWORD2 = 'iuJI7adaUGGE96QKz17a' + +ROBOKASSA_USE_POST = True +ROBOKASSA_STRICT_CHECK = True +ROBOKASSA_TEST_MODE = True diff --git a/src/robokassa/views.py b/src/robokassa/views.py index 1868755..b07dcf8 100644 --- a/src/robokassa/views.py +++ b/src/robokassa/views.py @@ -19,12 +19,11 @@ def receive_result(request, **credentials): """ data = request.POST if USE_POST else request.GET form = ResultURLForm(data, **credentials) - print(form.is_valid()) + if form.is_valid(): inv_id = form.cleaned_data['InvId'] out_sum = form.cleaned_data['OutSum'] - print('----------------------------------------------------') - print(form.cleaned_data['InvId'], form.cleaned_data['OutSum']) + # сохраняем данные об успешном уведомлении в базе, чтобы # можно было выполнить дополнительную проверку на странице успешного # заказа diff --git a/static/css/style.css b/static/css/style.css index 80e4a59..abb2865 100644 --- a/static/css/style.css +++ b/static/css/style.css @@ -1134,3 +1134,12 @@ input[type=number] { border-left: 13px solid #DEDEDE; margin-left: -15px; } + +.payform { + text-align: center; +} + +.payform__btn { + font-weight: normal; + cursor: pointer; +} diff --git a/templates/customer/profile/license_list.html b/templates/customer/profile/license_list.html deleted file mode 100644 index 590bc29..0000000 --- a/templates/customer/profile/license_list.html +++ /dev/null @@ -1,37 +0,0 @@ -{% extends "base.html" %} -{% load pytils_numeral static %} -{% block title %}Мои счета{% endblock %} - -{% block content %} -

Мои заказы

-
Купить лицензию
-
Оплаченные лицензии
- - - - - - - - - - - -{% for license in licenses %} - - - - - - - - - - -{% endfor %} -
НомерДата счётаСрок лицензииСуммаВид платежаСтатусДействияОтменить заявку
{% if license.pay_sum > 0 %}{{ license.id }}{% else %}--{% endif %}{{ license.order_date }}{{ license.get_term }}{% if license.pay_sum > 0 %}{{ license.pay_sum|get_plural:"рубль,рубля,рублей" }}{% else %}Бесплатно{% endif %}{{ license.get_payform_display }}{{ license.get_status_display }}{{ license.get_action_link|safe }}{% if license.status == 0 %}Удалить{% endif %}
-{% endblock %} - -{% block js %} - -{% endblock %} diff --git a/templates/customer/profile/paid_list.html b/templates/customer/profile/paid_list.html deleted file mode 100644 index 4f463a0..0000000 --- a/templates/customer/profile/paid_list.html +++ /dev/null @@ -1,31 +0,0 @@ -{% extends "base.html" %} -{% load pytils_numeral %} -{% block title %}История расчётов{% endblock %} - -{% block content %} -

История оплат

-
Купить лицензию
-
Все счета
- - - - - - - - - - -{% for license in licenses %} - - - - - - - - - -{% endfor %} -
Дата оплатыПо счётуСуммаСрок лицензииПериод действия лицензииСтатус лицензииЗакрывающие документы
{{ license.paid_date|default:'-' }}{% if license.pay_sum %}{{ license.id }}{% else %}-{% endif %}{% if license.pay_sum %}{{ license.pay_sum }}{% else %}-{% endif %}{{ license.get_term }}{% if license.date_from %}{{ license.date_from }} - {{ license.date_to }}{% else %}-{% endif %}{{ license.get_status_display }}

{{ license.get_paid_status|default:'' }}

Разные документы
-{% endblock %} diff --git a/templates/customer/profile/yandex.html b/templates/customer/profile/yandex.html deleted file mode 100644 index ae8c1df..0000000 --- a/templates/customer/profile/yandex.html +++ /dev/null @@ -1,29 +0,0 @@ -{% extends "base.html" %} -{% load pytils_numeral %} -{% block title %}Подтвердить платёж{% endblock %} - -{% block content %} -

Купить лицензию

- - {% if form.non_field_errors %} -

{{ form.non_field_errors }}

- {% endif %} - -
-
- -
- {{ form.as_ul }} -

Сумма: - {{ form.sum.value }}

-
- -
-
-
-
-{% endblock %} - -{% block js %} -{% endblock %} - diff --git a/templates/robokassa/error.html b/templates/robokassa/error.html index ec2ea12..74f2cf7 100644 --- a/templates/robokassa/error.html +++ b/templates/robokassa/error.html @@ -1,6 +1,11 @@ -{% extends 'base.html' %} -{% block content %} -Ошибка при оплате - {{ form.as_p }} +{% extends "base.html" %} + +{% block title %}Ошибка при оплате{% endblock %} -{% endblock content %} +{% block right-column %}{% endblock %} +{% block content %} +
+

Опс!

+

Ошибка при оплате!

+
+{% endblock %} diff --git a/templates/robokassa/fail.html b/templates/robokassa/fail.html index 404a15b..ae49479 100644 --- a/templates/robokassa/fail.html +++ b/templates/robokassa/fail.html @@ -1,4 +1,10 @@ -{% extends 'base.html' %} +{% extends "base.html" %} + +{% block title %}Неудачная оплата{% endblock %} + {% block content %} -Неудачная оплата -{% endblock content %} +
+

Опс!

+

Неудачная оплата!

+
+{% endblock %} diff --git a/templates/robokassa/form.html b/templates/robokassa/form.html index a7a9025..710ee94 100644 --- a/templates/robokassa/form.html +++ b/templates/robokassa/form.html @@ -1,7 +1,11 @@ {% extends 'base.html' %} + +{% block title %}Оплата лицензии{% endblock %} + {% block content %} -
+

Оплатить лицензию

+

{{ form.as_p }}

-

+

{% endblock %} diff --git a/templates/robokassa/success.html b/templates/robokassa/success.html index d7d1c23..7b7c5eb 100644 --- a/templates/robokassa/success.html +++ b/templates/robokassa/success.html @@ -1,4 +1,11 @@ -{% extends 'base.html' %} +{% extends "base.html" %} + +{% block title %}Завершение заказа{% endblock %} + +{% block right-column %}{% endblock %} {% block content %} -Оплата успешна -{% endblock content %} +
+

Спасибо!

+

Ваш заказ принят!

+
+{% endblock %}