1. Mikhail Korobov
  2. django-mailru-money

Overview

django-mailru-money

django-mailru-money - это приложение для подключения django-сайта к платежной системе деньги@mail.ru.

Лицензия - MIT. Поддерживается python 2.6, 2.7 и 3.2; django 1.3 и 1.4.

Установка

$ pip install django-mailru-money

В settings.py пропишите данные своего магазина:

MAILRU_MONEY_SHOP_ID = 'my_shop_id'
MAILRU_MONEY_SECRET_KEY = 'my_secret_key'

Подключите обработчик приема платежей в urls.py:

urlpatterns = patterns('',
    # ...
    url(r'^mailru-money/', include('mailru_money.urls')),
    # ...
)

ResultURL (который нужно сообщить в money.mail.ru) в этом случае будет http://your-site.com/mailru-money/result/.

Затем добавьте 'mailru_money' в INSTALLED_APPS и выполните syncdb (migrate, если используется South).

В INSTALLED_APPS также должны быть 'django.contrib.auth' и 'django.contrib.contenttypes'.

Использование

На странице оплаты используйте mailru_money.forms.MailruOrderForm для вывода формы оплаты и формирования заказа:

# views.py
from django.shortcuts import get_object_or_404, render
from mailru_money.forms import MailruOrderForm
from myapp.models import Item

@login_required
def pay(request, item_id)

    # товар, который будем оплачивать
    item = get_object_or_404(Item, id=item_id)

    # создаем заказ
    form = MailruOrderForm(
        amount = item.price,
        description = item.description,
        user = request.user
        pay_for = item,
    )

    return render(request, 'myapp/pay.html', {'form': form})

В шаблоне требуется сформировать форму оплаты:

{# myapp/pay.html #}
{# ... #}

<form method='post' action='{{ form.ACTION }}'>
    {{ form }}
    <input type='submit' value='Оплатить через Деньги@mail.ru'>
</form>

{# ... #}

Обратите внимание, что {% csrf_token %} использовать не нужно. Форма будет выведена как набор скрытых полей.

Обработку платежей можно осуществлять в сигнале mailru_money.signals.order_status_changed:

from mailru_money.models import MailruOrder
from mailru_money.signals import order_status_changed

from myapp.models import Item

def mailru_payment_received(sender, order, old_status, **kwargs):
    item = order.pay_for
    if order.state == MailruOrder.PAID:
        item.deliver_to(order.user)
    elif order.state == MailruOrder.REJECTED:
        item.unblock()

order_status_changed.connect(mailru_payment_received)

Сигнал шлется только когда у заказа изменился статус. Оплаченный заказ при этом стать неоплаченным не может.

django-mailru-money поддерживает и другую схему работы (можно не использовать встроенные средства для контроля заказов). См. исходный код, если описанная выше схема не устраивает.

Разработка

Разработка идет на bitbucket.org и github.com:

Баг-трекер - на битбакете: https://bitbucket.org/kmike/django-mailru-money/issues/new

Для запуска тестов склонируйте репозиторий, установите tox и запустите

$ tox

из корня репозитория.