You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
3.9 KiB
98 lines
3.9 KiB
# coding: utf-8
|
|
|
|
from django.http import HttpResponse
|
|
from django.template.response import TemplateResponse
|
|
from django.views.decorators.csrf import csrf_exempt
|
|
|
|
from robokassa.conf import USE_POST
|
|
from robokassa.forms import (
|
|
ResultURLForm, SuccessRedirectForm, FailRedirectForm)
|
|
from robokassa.models import SuccessNotification
|
|
from robokassa.signals import (
|
|
result_received, success_page_visited, fail_page_visited)
|
|
|
|
|
|
@csrf_exempt
|
|
def receive_result(request, **credentials):
|
|
"""
|
|
Обработчик для ResultURL
|
|
"""
|
|
data = request.POST if USE_POST else request.GET
|
|
form = ResultURLForm(data, **credentials)
|
|
|
|
if form.is_valid():
|
|
inv_id = form.cleaned_data['InvId']
|
|
out_sum = form.cleaned_data['OutSum']
|
|
|
|
# сохраняем данные об успешном уведомлении в базе, чтобы
|
|
# можно было выполнить дополнительную проверку на странице успешного
|
|
# заказа
|
|
notification = SuccessNotification.objects.create(
|
|
InvId=inv_id, OutSum=out_sum
|
|
)
|
|
|
|
# дополнительные действия с заказом (например, смену его статуса) можно
|
|
# осуществить в обработчике сигнала robokassa.signals.result_received
|
|
result_received.send(
|
|
sender=notification, InvId=inv_id, OutSum=out_sum,
|
|
extra=form.extra_params())
|
|
|
|
return HttpResponse('OK%s' % inv_id)
|
|
return HttpResponse('error: bad signature')
|
|
|
|
|
|
@csrf_exempt
|
|
def success(request, template_name='robokassa/success.html',
|
|
extra_context=None,
|
|
error_template_name='robokassa/error.html', **credentials):
|
|
"""
|
|
Обработчик для SuccessURL.
|
|
"""
|
|
|
|
data = request.POST if USE_POST else request.GET
|
|
form = SuccessRedirectForm(data, **credentials)
|
|
if form.is_valid():
|
|
inv_id = form.cleaned_data['InvId']
|
|
out_sum = form.cleaned_data['OutSum']
|
|
|
|
# в случае, когда не используется строгая проверка, действия с заказом
|
|
# можно осуществлять в обработчике сигнала
|
|
# robokassa.signals.success_page_visited
|
|
success_page_visited.send(
|
|
sender=form, InvId=inv_id, OutSum=out_sum,
|
|
extra=form.extra_params())
|
|
|
|
context = {'InvId': inv_id, 'OutSum': out_sum, 'form': form}
|
|
context.update(form.extra_params())
|
|
context.update(extra_context or {})
|
|
return TemplateResponse(request, template_name, context)
|
|
|
|
return TemplateResponse(request, error_template_name, {'form': form})
|
|
|
|
|
|
@csrf_exempt
|
|
def fail(request, template_name='robokassa/fail.html', extra_context=None,
|
|
error_template_name='robokassa/error.html', **credentials):
|
|
"""
|
|
Обработчик для FailURL.
|
|
"""
|
|
|
|
data = request.POST if USE_POST else request.GET
|
|
form = FailRedirectForm(data, **credentials)
|
|
if form.is_valid():
|
|
inv_id = form.cleaned_data['InvId']
|
|
out_sum = form.cleaned_data['OutSum']
|
|
|
|
# дополнительные действия с заказом (например, смену его статуса для
|
|
# разблокировки товара на складе) можно осуществить в обработчике
|
|
# сигнала robokassa.signals.fail_page_visited
|
|
fail_page_visited.send(
|
|
sender=form, InvId=inv_id, OutSum=out_sum,
|
|
extra=form.extra_params())
|
|
|
|
context = {'InvId': inv_id, 'OutSum': out_sum, 'form': form}
|
|
context.update(form.extra_params())
|
|
context.update(extra_context or {})
|
|
return TemplateResponse(request, template_name, context)
|
|
|
|
return TemplateResponse(request, error_template_name, {'form': form})
|
|
|