Package: django-rbkmoney
django-rbkmoney- это приложение для интеграции системы приема платежей
RBKMoney с проектами на основе Django.До использования следует ознакомиться с официальной документацией RBKMoney
(Подключение интернет магазинов;
файл с описанием API на сайте найти достаточно проблематично, скорее всего
придется запрашивать у поддержки, одна из версийтут)
Приложение реализует протокол взаимодействия с системой RBKMoney.УстановкаСначала необходимо установить сам пакет:$ pip install django-rbkmoneyзатем следует добавить ‘rbkmoney’ в INSTALLED_APPS и выполнить:$ python manage.py syncdbДля работы требуется django >= 1.3.x.НастройкаВsettings.pyнеобходимо указать следующие параметры:RBKMONEY_SHOP_ID - номер магазина в системе RBKMoneyRBKMONEY_SECRET_KEY - секретный ключ (указывается в личном кабинете
самостоятельно)Необязательные параметры:RBKMONEY_HASH_CHECK - проверка контрольной подписи формы заявки на перевод,
в качестве значения можно указать названия возможных алгоритмов,MD5илиSHA512(при любом другом <истинном> значении будет выбран
алгоритмMD5, при <ложном> - проверка будет отключена; отключение проверки
крайне не рекомендуется).RBKMONEY_ACTION - URL страницы, на которую будет отправлена форма заявки
на перевод (по умолчанию:https://rbkmoney.ru/acceptpurchase.aspx).RBKMONEY_URI_PROTOCOL - протокол, используемый при генерации абсолютных
ссылок succesURL и failURL (возможные значения:http,https;
по умолчанию:http).ИспользованиеФорма заявки на переводdjango-rbkmoney содержит класс формыRequestRBKMoneyForm(наследникdjango.forms.Form), позволяющий упростить процесс генерации html кода
формы заявки на перевод, разработчики могут использовать его в качестве
родительского при наследовании, например, для добавления некоторых
дополнительных параметров.Пример кода представления:from decimal import Decimal
from django.shortcuts import render
from rbkmoney.forms import RequestRBKMoneyForm

@login_required
def payment_rbkmoney(request, order_id)
    form = RequestRBKMoneyForm(initial={
        'orderId': 200005,
        'serviceName': u'Два колеса, руль, педали и мешок свободы.',
        'recipientAmount': Decimal('20000.00'),
        'recipientCurrency': u'RUR',
        'user_email': u'client@some.mail',
        'userFields': ['some', 'values', 'list',],
        # 'successUrl': 'http://site.name/payment/success/',
        # 'failUrl': 'http://site.name/payment/fail/',
    })

    return render(request, 'payment.html', {'form': form})Обязательными параметрами в initial являютсяrecipientAmountиrecipientCurrency. Детальную справку по параметрам можно посмотреть
в документации по API RBKMoney. Пользовательские поля вinitialможно передать с помощью параметраuserFields, значением должен быть
список или кортеж строк, поля формы будут сгенерированы автоматически,
начиная с индекса 0.Соответствующий шаблон:{% extends 'base.html' %}

{% block content %}
    <form action="{{ form.action }}" method="post">
        {{ form }}
        <input type="submit" value="Оплатить">
    <form>
{% endblock %}Форма выведется в виде набора скрытых input-тегов.У формы есть атрибутaction, содержащий URL страницы, на которую будет
отправлена форма (см. параметрRBKMONEY_ACTION).Обратите внимание,{% csrf_token %}в форме не нужен (и более того,
добавлять его к форме небезопасно), т.к. форма ведет на внешний
сайт - сайт RBKMoney.django-rbkmoney не включает в себя модели “Заказ” (Order),
т.к. эта модель будет отличаться от сайта к сайту. Обработку смены статусов
заказов следует осуществлять в обработчиках сигналов.Получение результатов платежейdjango-rbkmoney реализует механизм приема сообщений о статусах переводов со
стороны RBKMoney, сообщения должны отправляться на страницу представленияrbkmoney_result(url:/адрес-приложения-rbkmoney/result/), абсолютный
адрес которого необходимо указывать в личном кабинете пользователя системы.В целях безопасности лучше всегда использовать проверку контрольной подписи и
отключать отправку секретного ключа.Общий принцип работы примерно следующий:После оплаты RBKMoney отправляет запрос на адрес, соответствующий
представлениюrbkmoney_result.Внутриrbkmoney_resultпроисходит проверка содержащейся в
запросе контрольной подписи с помощью секретного ключа и выбранного
алгоритма (если она не отключена в параметрах).Если запрос корректный, тоrbkmoney_resultшлет сигналrbkmoney.signals.result_received, предусмотренный для
совершения дополнительных манипуляций на сайте.
Для этого необходимо добавить соответствующий обработчик сигнала.Если все в порядке, тоrbkmoney_resultвозвращает RBKMoney
строкуOKсо статусом запроса200. Этот ответ необходим для того,
чтобы система получила подтверждение того, что все необходимые действия
произведены.Если RBKMoney получает положительный ответ, то пользователь перенаправляется
наsuccessUrl(по умолчанию это адрес представленияrbkmoney_success).
На этой страничке обычно выводится сообщение об успешном прохождении
платежа/оплаты. Если ответ отрицательный, то пользователь перенаправляется
наfailURL(по умолчанию это адрес представленияrbkmoney_fail),
где ему будет отображено сообщение о произошедшей ошибке.В целомrbkmoney_resultдолжно получить сообщение дважды, со значениямиpaymentStatusравными:3- операция принята на обработку и5- операция исполнена, соответственно.При этом в обработчике сигнала следует учитывать, что перевод прошел успешно
лишь при полученииpaymentStatusравного5.СигналыОбработку смены статусов заказов следует осуществлять в обработчике сигналаrobokassa.signals.result_received. Данный сигнал отсылается лишь
при получении корректного уведомления от RBKMoney. Получение этого сигнала
означает что оплата либо создана, либо прошла успешно (в зависимости от
значенияpaymentStatus).В качествеsenderпередается экземпляр моделиRBKMoneyPaymentсо всеми данными оплаты, так же в качестве дополнительного параметра
передается значениеuser_fields, отправленное еще в запросе
на перевод (список кортежей (имя, значение)).Пример:from rbkmoney.signals import result_received
from orders.models import Order

def on_payment_received(sender, **kwargs):
    if sender.paymentStatus != 5: return
    order = Order.objects.get(id=sender.orderId)
    order.change_status('paid')
    order.save()

result_received.connect(on_payment_received)urls.pyДля настройки адресов представленийrbkmoney_result,rbkmoney_successиrbkmoney_failможно подключить модульrbkmoney.urls:urlpatterns = patterns('',
    # ...
    url(r'^rbkmoney/', include('rbkmoney.urls')),
    # ...
)Адрес представленияrbkmoney_result, указываемый в личном кабинете,
в этом случае будет иметь вид:http://yoursite.ru/rbkmoney/result/.Шаблоныrbkmoney/success.html- показывается в случае успешной оплаты.robokassa/fail.html- показывается в случае неуспешной оплаты.РазработкаРазработка ведется на bitbucket:https://bitbucket.org/sakkada/django-rbkmoney/Пожелания, идеи, баг-репорты и тд. пишите в трекер:https://bitbucket.org/sakkada/django-rbkmoney/issuesЛицензия - MIT.ТестированиеДля запуска тестов установите выполните команду:$ python manage.py test rbkmoneyПример интеграцииВ архиве пакета, а так же в репозитарии находится директорияsample,
в которой находится кодdjangoпроекта с примером интеграцииdjango-rbkmoney.История изменений
=================0.1.0 (2013-05-09)Первая версия