Dmitriy Shesterkin 9 years ago
parent 4f4dfcb557
commit 6f9fd77ae0
  1. 20
      src/customer/models.py
  2. 29
      src/customer/utils.py
  3. 86
      src/customer/views/license.py
  4. 9
      templates/robokassa/error.html
  5. 8
      templates/robokassa/fail.html

@ -19,7 +19,7 @@ from django.utils.deconstruct import deconstructible
from django.conf import settings from django.conf import settings
from customer import consts, managers, utils from customer import consts, managers, utils
from customer.utils import create_bonus_license from customer.utils import create_bonus_license, get_robokassa_url
from myauth.models import DokUser from myauth.models import DokUser
from commons.utils import only_numerics from commons.utils import only_numerics
from robokassa.signals import result_received, success_page_visited from robokassa.signals import result_received, success_page_visited
@ -584,6 +584,12 @@ class License(models.Model):
if payments: if payments:
return payments.first().id return payments.first().id
def get_payment(self):
if self.payform == 1:
payments = Payment.objects.filter(order_number=self.id)
if payments:
return payments.first()
# TODO: test # TODO: test
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
@ -615,14 +621,13 @@ class License(models.Model):
kwargs={'order_num': self.id} kwargs={'order_num': self.id}
) )
return f'<a href="{url}">Оплата безналичным платежом</a>' return f'<a href="{url}">Оплата безналичным платежом</a>'
# redirect to pay terminal with data
elif self.payform == 1: elif self.payform == 1:
if self.get_payment_id(): if self.get_payment():
url = reverse('payment_robokassa', url = get_robokassa_url(self.get_payment())
kwargs={'payment_id': self.get_payment_id()})
else: else:
url = '#' url = '#'
return f'<a href="{url}">Оплата банковской картой</a>' return f'<a href="{url}">Оплата картой, электронными деньгами, наличными</a>'
elif self.status in [1, 2]: elif self.status in [1, 2]:
url = reverse( url = reverse(
@ -639,7 +644,8 @@ class License(models.Model):
return f'<a href="#" class="not-active">Оплата безналичным платежом</a>' return f'<a href="#" class="not-active">Оплата безналичным платежом</a>'
elif self.payform == 1: elif self.payform == 1:
return f'<a href="#" class="not-active">Оплата банковской картой</a>' return f'<a href="#" class="not-active">Оплата картой, ' \
f'электронными деньгами, наличными</a>'
else: else:
return '' return ''

@ -1,4 +1,6 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import hashlib
from datetime import timedelta from datetime import timedelta
from dateutil.relativedelta import relativedelta from dateutil.relativedelta import relativedelta
@ -179,3 +181,30 @@ def create_bonus_license(lic):
cache.set(f'confirm_bonus_days_{lic.company.get_first_user().username}', -1, 3600) cache.set(f'confirm_bonus_days_{lic.company.get_first_user().username}', -1, 3600)
return bonus_license return bonus_license
return False return False
def get_robokassa_url(payment):
login = settings.ROBOKASSA_LOGIN
inv_id = payment.pk
out_summ = format(payment.order_amount, '.2f')
desc = 'Оплата лицензии Dokumentor.ru'
site = 'https://merchant.roboxchange.com/Index.aspx'
if settings.ROBOKASSA_TEST_MODE:
site = 'https://auth.robokassa.ru/Merchant/Index.aspx'
signature = hashlib.md5(
f'{login}:{out_summ}:{inv_id}:{settings.ROBOKASSA_PASSWORD1}'.encode("ascii")
).hexdigest().upper()
params = f'?MerchantLogin={login}' \
f'&SignatureValue={signature}' \
f'&InvId={inv_id}' \
f'&OutSum={out_summ}' \
f'&InvDesc={desc}' \
f'&Email={payment.user.email}' \
f'&Culture=ru'
if settings.ROBOKASSA_TEST_MODE:
params += f'&isTest=1'
url = f'{site}{params}'
return url

@ -1,25 +1,19 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import json import json
import hashlib
import itertools import itertools
from django.db.models import Count from django.db.models import Count
from django.shortcuts import render, redirect, get_object_or_404 from django.shortcuts import render, redirect, get_object_or_404
from django.http import ( from django.http import (HttpResponse, HttpResponseBadRequest)
# HttpResponseForbidden,
HttpResponse, HttpResponseBadRequest)
from django.conf import settings
# from django.views.decorators.csrf import csrf_exempt
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
# from django.template.response import TemplateResponse
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.views.decorators.csrf import csrf_protect from django.views.decorators.csrf import csrf_protect
from robokassa.forms import RobokassaForm from robokassa.forms import RobokassaForm
from customer.models import License, LicensePrice, Payment from customer.models import License, LicensePrice, Payment
from customer.forms import LicenseForm from customer.forms import LicenseForm
from customer.utils import raise_if_no_profile from customer.utils import raise_if_no_profile, get_robokassa_url
@login_required @login_required
@ -51,32 +45,7 @@ def order_license(request):
user=request.user, user=request.user,
type=1 type=1
) )
return redirect(get_robokassa_url(payment))
login = settings.ROBOKASSA_LOGIN
inv_id = payment.pk
out_summ = format(payment.order_amount, '.2f')
desc = 'Оплата лицензии Dokumentor.ru'
site = 'https://merchant.roboxchange.com/Index.aspx'
if settings.ROBOKASSA_TEST_MODE:
site = 'https://auth.robokassa.ru/Merchant/Index.aspx'
signature = hashlib.md5(
f'{login}:{out_summ}:{inv_id}:{settings.ROBOKASSA_PASSWORD1}'.encode("ascii")
).hexdigest().upper()
params = f'?MerchantLogin={login}' \
f'&SignatureValue={signature}' \
f'&InvId={inv_id}' \
f'&OutSum={out_summ}' \
f'&InvDesc={desc}' \
f'&Email={payment.user.email}' \
f'&Culture=ru'
if settings.ROBOKASSA_TEST_MODE:
params += f'&isTest=1'
url = f'{site}{params}'
return redirect(url)
if form.cleaned_data['payform'] == '0': if form.cleaned_data['payform'] == '0':
Payment.objects.create( Payment.objects.create(
@ -141,53 +110,6 @@ def delete_license(request, pk):
return HttpResponse(data, content_type='application/json') return HttpResponse(data, content_type='application/json')
# @csrf_exempt
# def payment_result(request):
# if request.method == 'POST':
# try:
# nInvId = request.POST.get('InvId')
#
# nOutSum = request.POST.get('OutSum')
# sSignatureValue = request.POST.get('SignatureValue')
# SignatureValue = hashlib.md5('%s:%s:%s' % (nOutSum, nInvId,
# settings.ROBOKASSA_PASSWORD2)).hexdigest()
# if sSignatureValue.upper() == SignatureValue.upper():
# license = License.objects.get(pk=nInvId)
# license.status = 1
# license.save()
# return HttpResponse('OK%s' % nInvId)
# else:
# return HttpResponse('bad sign')
# except License.DoesNotExist:
# return HttpResponseForbidden()
# else:
# return HttpResponseForbidden()
# @csrf_exempt
# def payment_success(request):
# nInvId = request.GET.get('orderNumber')
# # order = License.objects.get(pk=nInvId)
# context = {'success': True, 'order_num': nInvId}
# return TemplateResponse(request, 'customer/profile/end_order.html', context)
#
#
# @csrf_exempt
# def payment_fail(request):
# try:
# # nInvId = request.GET.get('')
#
# message = u"Возникла проблема. Ваш Заказ не оплачен. " \
# u"Попробуйте оформить заявку снова, или позвоните по номеру."
#
# return TemplateResponse(
# request,
# 'customer/profile/end_order.html',
# {'message': message, 'success': False})
# except:
# return HttpResponseForbidden()
@login_required @login_required
def orders_list(request): def orders_list(request):
"""List license and account for license in one page""" """List license and account for license in one page"""

@ -2,10 +2,13 @@
{% block title %}Ошибка при оплате{% endblock %} {% block title %}Ошибка при оплате{% endblock %}
{% block right-column %}{% endblock %}
{% block content %} {% block content %}
<div id="content"> <div id="content">
<h2>Опс!</h2> <h2>Возникли проблемы с оплатой</h2>
<p>Ошибка при оплате!</p> <p>Что-то пошло не так и оплатить лицензию не получилось :(</p>
<p>Пожалуйста, попробуйте снова</p>
<p>Ссылку на оплату, историю всех расчётов и купленных лицензий всегда можно найти на странице
<a href="{% url 'customer-orders' %}">Лицензии и расчёты.</a></p>
{{ form.as_p }}
</div> </div>
{% endblock %} {% endblock %}

@ -4,7 +4,11 @@
{% block content %} {% block content %}
<div id="content"> <div id="content">
<h2>Опс!</h2> <h2>Возникли проблемы с оплатой</h2>
<p>Неудачная оплата!</p> <p>Что-то пошло не так и оплатить лицензию не получилось :(</p>
<p>Пожалуйста, попробуйте снова</p>
<p>Ссылку на оплату, историю всех расчётов и купленных лицензий всегда можно найти на странице
<a href="{% url 'customer-orders' %}">Лицензии и расчёты.</a></p>
{{ form.as_p }}
</div> </div>
{% endblock %} {% endblock %}

Loading…
Cancel
Save