Skip to content

Commit f8e2cac

Browse files
committed
Базовая версия с формой для приема платежей
1 parent 2059a22 commit f8e2cac

11 files changed

+229
-0
lines changed

CHANGES.txt

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
История изменений
2+
=================
3+
4+
0.1.0 (2010-02-13)
5+
------------------
6+
Первая версия

LICENSE.txt

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
Copyright (c) 2010 Mikhail Korobov
2+
3+
Permission is hereby granted, free of charge, to any person obtaining a copy
4+
of this software and associated documentation files (the "Software"), to deal
5+
in the Software without restriction, including without limitation the rights
6+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7+
copies of the Software, and to permit persons to whom the Software is
8+
furnished to do so, subject to the following conditions:
9+
10+
The above copyright notice and this permission notice shall be included in
11+
all copies or substantial portions of the Software.
12+
13+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19+
THE SOFTWARE.

MANIFEST.in

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
include *.txt
2+
include *.rst
3+
recursive-include docs *.txt

README.rst

+53
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
================
2+
django-robokassa
3+
================
4+
5+
django-robokassa - это приложение для интеграции платежной системы ROBOKASSA в
6+
проекты на Django.
7+
8+
До использования следует ознакомиться с официальной документацией
9+
ROBOKASSA (http://robokassa.ru/Doc/Ru/Interface.aspx). Приложение реализует
10+
протокол взаимодействия, описанный в этом документе.
11+
12+
Установка
13+
=========
14+
15+
Как обычно::
16+
17+
$ pip install django-robokassa
18+
19+
или ::
20+
21+
$ easy_install django-robokassa
22+
23+
или ::
24+
25+
$ hg clone http://bitbucket.org/kmike/django-robokassa/
26+
$ cd django-robokassa
27+
$ python setup.py install
28+
29+
30+
Потом следует добавить 'robokassa' в INSTALLED_APPS и выполнить ::
31+
32+
$ python manage.py syncdb
33+
34+
Если используется South, то вместо syncdb нужно сделать ::
35+
36+
$ python manage.py migrate
37+
38+
39+
Настройка
40+
=========
41+
42+
В settings.py нужно указать следующие настройки:
43+
44+
* ROBOKASSA_LOGIN - логин
45+
* ROBOKASSA_PASSWORD - пароль
46+
47+
Необязательный параметар: ASSIST_TEST_MODE - включен ли тестовый режим.
48+
По умолчанию False (т.е. включен боевой режим).
49+
50+
Использование
51+
=============
52+
53+
TODO: написать

robokassa/__init__.py

Whitespace-only changes.

robokassa/conf.py

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#coding: utf-8
2+
3+
from django.conf import settings
4+
5+
# обязательные параметры - реквизиты магазина
6+
LOGIN = settings.ROBOKASSA_LOGIN
7+
PASSWORD1 = settings.ROBOKASSA_PASSWORD1
8+
PASSWORD2 = getattr(settings, 'ROBOKASSA_PASSWORD2', None)
9+
10+

robokassa/forms.py

+66
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
#coding: utf-8
2+
3+
from hashlib import md5
4+
from urllib import urlencode
5+
from django import forms
6+
from robokassa.conf import LOGIN, PASSWORD1
7+
8+
class RobokassaForm(forms.Form):
9+
10+
# login магазина в обменном пункте
11+
MrchLogin = forms.CharField(max_length=20, initial = LOGIN)
12+
13+
# требуемая к получению сумма
14+
OutSum = forms.DecimalField(min_value=0, max_digits=20, decimal_places=2, required=False)
15+
16+
# номер счета в магазине (должен быть уникальным для магазина)
17+
InvId = forms.IntegerField(min_value=0, required=False)
18+
19+
# описание покупки
20+
Desc = forms.CharField(max_length=100, required=False)
21+
22+
# контрольная сумма MD5
23+
SignatureValue = forms.CharField(max_length=32)
24+
25+
# предлагаемая валюта платежа
26+
IncCurrLabel = forms.CharField(max_length = 10, required=False)
27+
28+
# e-mail пользователя
29+
Email = forms.CharField(max_length=100, required=False)
30+
31+
# язык общения с клиентом (en или ru)
32+
Culture = forms.CharField(max_length=2, required=False)
33+
34+
# Параметр с URL'ом, на который форма должны быть отправлена.
35+
# Может пригодиться для использования в шаблоне.
36+
target = u'https://merchant.roboxchange.com/Index.aspx'
37+
38+
def get_redirect_url(self):
39+
""" Получить URL с GET-параметрами, соответствующими значениям полей в
40+
форме. Редирект на адрес, возвращаемый этим методом, эквивалентен
41+
ручной отправке формы методом GET.
42+
"""
43+
def _initial(name, field):
44+
val = self.initial.get(name, field.initial)
45+
if not val:
46+
return val
47+
return unicode(val).encode('1251')
48+
49+
fields = [(name, _initial(name, field))
50+
for name, field in self.fields.items()
51+
if _initial(name, field)
52+
]
53+
params = urlencode(fields)
54+
return self.target+'?'+params
55+
56+
def __init__(self, *args, **kwargs):
57+
super(RobokassaForm, self).__init__(*args, **kwargs)
58+
for field in self.fields:
59+
self.fields[field].widget = forms.HiddenInput()
60+
self.fields['SignatureValue'].initial = self._get_signature()
61+
62+
def _get_signature(self):
63+
_val = lambda name: self.fields[name].initial
64+
params = ':'.join(filter(None, [_val('MrchLogin'), _val('OutSum'), _val('InvId'), PASSWORD1]))
65+
return md5(params).hexdigest().upper()
66+

robokassa/models.py

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
#coding: utf-8

robokassa/tests.py

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#coding: utf-8
2+
3+
from unittest import TestCase
4+
5+
from robokassa.forms import RobokassaForm
6+
7+
class RobokassaFormTest(TestCase):
8+
9+
def setUp(self):
10+
self.form = RobokassaForm(initial = {
11+
'OutSum': 100.00,
12+
'InvId': 58,
13+
'Desc' : u'Холодильник "Бирюса"',
14+
'Email' : '[email protected]'
15+
})
16+
17+
def testSignature(self):
18+
self.assertEqual(len(self.form.fields['SignatureValue'].initial), 32)
19+
self.assertEqual(self.form.fields['SignatureValue'].initial, 'FBA6DB00B521BB848CD44D0F01D7BFC8')
20+
21+
def testRedirectUrl(self):
22+
url = "https://merchant.roboxchange.com/Index.aspx?MrchLogin=test_login&OutSum=100.0&InvId=58&Desc=%D5%EE%EB%EE%E4%E8%EB%FC%ED%E8%EA+%22%C1%E8%F0%FE%F1%E0%22&SignatureValue=FBA6DB00B521BB848CD44D0F01D7BFC8&Email=vasia%40example.com"
23+
self.assertEqual(self.form.get_redirect_url(), url)

runtests.py

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#!/usr/bin/env python
2+
# -*- coding: utf-8 -*-
3+
4+
from django.conf import settings
5+
from django.core.management import call_command
6+
7+
settings.configure(
8+
INSTALLED_APPS=('robokassa',),
9+
DATABASE_ENGINE = 'sqlite3',
10+
11+
ROBOKASSA_LOGIN = 'test_login',
12+
ROBOKASSA_PASSWORD1 = 'test_password',
13+
)
14+
15+
if __name__ == "__main__":
16+
call_command('test', 'robokassa')

setup.py

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#!/usr/bin/env python
2+
#coding: utf-8
3+
from distutils.core import setup
4+
5+
import sys
6+
reload(sys).setdefaultencoding("UTF-8")
7+
8+
setup(
9+
name='django-robokassa',
10+
version='0.1.0',
11+
author='Mikhail Korobov',
12+
author_email='[email protected]',
13+
14+
packages=['robokassa', 'robokassa.migrations'],
15+
16+
url='http://bitbucket.org/kmike/django-robokassa/',
17+
download_url = 'http://bitbucket.org/kmike/django-robokassa/get/tip.zip',
18+
license = 'MIT license',
19+
description = u'Приложение для интеграции платежной системы ROBOKASSA в проекты на Django.'.encode('utf8'),
20+
long_description = open('README.rst').read().decode('utf8'),
21+
22+
classifiers=(
23+
'Development Status :: 3 - Alpha',
24+
'Environment :: Web Environment',
25+
'Framework :: Django',
26+
'Intended Audience :: Developers',
27+
'License :: OSI Approved :: MIT License',
28+
'Programming Language :: Python',
29+
'Topic :: Software Development :: Libraries :: Python Modules',
30+
'Natural Language :: Russian',
31+
),
32+
)

0 commit comments

Comments
 (0)