Django 1.9 и робокасса
Возникла недавно задача реализовать возможность проведения онлайн-платежей через робокассу. Вот уже несколько лет использую для этого приложение django-robokassa от kmike.
Приложение подключил, проект настроил, соответствующий код для обработки заказов и платежей написал. Проверяю — не работает, вместо формы тестового платежа, робокасса показывает страницу с предложением зарегистрироваться и описанием сервиса. Хм.
Начал разбираться — полез в документацию сервиса и обнаружил там ссылку на проверку платежа прямо из личного кабинета. Ссылка перехода на форму тестового платежа теперь выглядит идентично форме проведения настоящих платежей и располагается по-другому адресу: https://auth.robokassa.ru/Merchant/Index.aspx
Ко всему прочему, теперь ещё и необходимо указывать дополнительный параметр IsTest=1
при отправке тестового запроса на проведение платежа, иначе платёж считается боевым.
Вариантов решения проблемы я нашёл три:
- создать issue на github автора приложения
- сделать форк приложения, исправить проблемы и сделать pull-request
- сделать форк приложения с новым именем, например, django-robokassa-asyncee и вести самостоятельную разработку (нужно проверить лицензию)
Для начала я решил выбрать первый вариант, фиксы там буквально в две строки, поэтому, если kmike заинтересован в судьбе проекта, то нужные изменения он внесёт. А в текущем проекте я просто отнаследовался от RobokassaForm
и переопределил несколько методов, но это временное решение.
class CustomRobokassaForm(RobokassaForm): @property def target(self): if conf.TEST_MODE: return u'https://auth.robokassa.ru/Merchant/Index.aspx' return conf.FORM_TARGET def get_redirect_url(self): """ Получить URL с GET-параметрами, соответствующими значениям полей в форме. Редирект на адрес, возвращаемый этим методом, эквивалентен ручной отправке формы методом GET. """ def _initial(name, field): val = self.initial.get(name, field.initial) if not val: return val return unicode(val).encode('1251') fields = [(name, _initial(name, field)) for name, field in self.fields.items() if _initial(name, field) ] if conf.TEST_MODE: fields.append((u'IsTest'.encode('1251'), u'1'.encode('1251'))) params = urlencode(fields) return self.target+'?'+params
На данный момент репозиторий проекта выглядит заброшенным, возможно автор потерял интерес к приложению, такое бывает. Ничего страшного в этом нет, ведь в этом и суть OpenSource - в любой момент можно сделать свой вклад.
Кстати, недавно появился ещё один проект django-robokassa-merchant, основанный на оригинальном django-robokassa
. На данный момент проект находится в состоянии разработки, нет документации, везде пестрят надписи «TODO», но есть тесты, и, судя по коду, проект более перспективный, так как предполагает возможность проведения платежей из-под разных мерчантов (аккаунтов в робокассе) в рамках одного сайта, плюс используется GenericForeignKey
для связи с кастомными вариантами вашей модели заказа.
UPDATE: автор действительно больше не поддерживает приложение, в том числе и репозиторий на bitbucket. Однако, похоже, что кто-то ранее столкнулся с такой же проблемой и решил это в своём проекте и сделал pull-request как ответ на мой issue. Изменения и merge можно посмотреть здесь.
На данный момент версия приложения django-robokassa в актуальном состоянии.
UPDATE от 30 апреля: Пользователь Salavat Sharapov в комментариях уточнил, что есть форк на bitbucket с фиксами от Sergey Gornostayev. Посмотреть можно здесь. Из основных изменений можно выделить поддержку Python 3.5 и Django 1.9.
Комментарии
Comments powered by Disqus