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

# 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})