|
| 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 | + |
0 commit comments