用于将ROBOKASSA支付系统集成到Django项目的应用程序。
项目描述
django-robokassa - 用于将ROBOKASSA支付系统集成到Django项目的应用程序。
在开始使用之前,请熟悉ROBOKASSA的官方文档(http://docs.robokassa.ru/)。应用程序实现了该文档中描述的交互协议。
安装
$ pip install django-robokassa
然后,将‘robokassa’添加到INSTALLED_APPS并执行
$ python manage.py syncdb
或者,如果使用South,
$ python manage.py migrate
需要django >= 1.3.1。如果项目在django 1.2.x或django 1.1.x上,请使用django-robokassa版本0.9.3。
配置
在settings.py中需要指定以下设置
ROBOKASSA_LOGIN - 登录名
ROBOKASSA_PASSWORD1 - 密码 #1
可选参数
ROBOKASSA_PASSWORD2 - 密码 #2。如果仅使用django-robokassa显示支付表单,则可以不指定此参数。如果使用django-robokassa接收支付,则此参数是必需的。
ROBOKASSA_USE_POST - 是否在接收ROBOKASSA结果时使用POST方法。默认为True。假定Result URL、Success URL和Fail URL选择了相同的方法。
ROBOKASSA_STRICT_CHECK - 是否使用严格检查(在ResultURL要求预先通知)。默认为True。
ROBOKASSA_TEST_MODE - 是否启用测试模式。默认为False(即启用战斗模式)。
ROBOKASSA_EXTRA_PARAMS - 要与请求一起传递的额外参数名称列表。无需在它们之前添加“Shp”。
ROBOKASSA_TEST_FORM_TARGET - 测试模式下的ROBOKASSA URL。此设置适用于没有可访问的互联网域(例如在localhost上进行开发)的情况,需要使用自己的服务器而不是ROBOKASSA服务器。
使用
支付接收表单
为了简化构建发送用户到Robokassa的HTML表单,在django-robokassa中有一个RobokassaForm表单。它用于在模板中输出信息、计算校验和以及形成GET请求参数,以简化表单构建。
示例
# views.py from django.shortcuts import get_object_or_404, render from django.contrib.auth.decorators import login_required from robokassa.forms import RobokassaForm @login_required def pay_with_robokassa(request, order_id): order = get_object_or_404(Order, pk=order_id) form = RobokassaForm(initial={ 'OutSum': order.total, 'InvId': order.id, 'Desc': order.name, 'Email': request.user.email, # 'IncCurrLabel': '', # 'Culture': 'ru' }) return render(request, 'pay_with_robokassa.html', {'form': form})
在 initial 中,所有参数都是可选的。有关参数的详细信息,请参阅 Robokassa 的文档。可以传递在 ROBOKASSA_EXTRA_PARAMS 中描述的“用户参数”的值(不需要再次附加 'shp')。
相应的模板
{% extends 'base.html' %} {% block content %} <form action="{{ form.target }}" method="POST"> <p>{{ form.as_p }}</p> <p><input type="submit" value="Купить"></p> </form> {% endblock %}
表单将以一系列隐藏的 input 标签的形式输出。
表单有一个属性 target,包含应发送表单的 URL。在测试模式下,这将是一个测试 URL,在战斗模式下则是一个战斗 URL。
请注意,在表单中不需要 {% csrf_token %}(并且更不用说,将其添加到表单中是不安全的),因为表单会跳转到外部网站 - Robokassa 的网站。
除了发送表单外,还可以生成 GET 请求。表单有一个方法 get_redirect_url,它返回带有所有参数的所需地址。重定向到该地址等同于使用 GET 方法发送表单。
django-robokassa 不包含“购买”模型(例如示例中的 Order),因为该模型将在不同的网站上有所不同。应通过信号处理程序处理购买状态的变化。
获取支付结果
Robokassa 有几种确定支付结果的方法。
在过渡到 Success 和 Fail 页面时,可以保证支付已经成功或未成功。
在成功或失败的支付中,Robokassa 会将 POST 或 GET 请求发送到 Result URL。
可以通过 XML 服务请求支付状态。
目前,django-robokassa 支持方法 1 和 2 以及它们的组合(在使用 ROBOKASSA_STRICT_CHECK = True 选项时,进行额外检查,以确认在过渡到 Success URL 时已通过 Result URL 收到通知)。
出于安全考虑,最好始终使用严格检查(通过 Result URL 进行确认)。其机制
在付款后,robokassa.ru 会向 ResultURL 发送“后台”请求。
在关联到 ResultURL 的 view 中,通过 ROBOKASSA_PASSWORD2(这是第二个密码,不会通过网络传递,并且只有发送者和接收者知道)检查请求中的 md5 签名。ROBOKASSA_PASSWORD2 用于确认请求确实来自 robokassa.ru。
如果请求正确,则 view 会发送 robokassa.signals.result_received 信号。为了在网站内部进行操作(例如,根据收到的请求计费或更改订单状态),需要添加相应的信号处理器。
如果一切正常,则关联到 Result URL 的 view 会向 robokassa.ru 返回类似 OK<operation_id> 的响应,其中 <operation_id> 是当前操作的唯一 ID。此响应对于 robokassa.ru 确认已执行所有必要操作是必需的。
如果 robokassa.ru 收到此响应,则用户将被重定向到 Success URL。在页面上通常最好显示有关付款成功或支付成功的消息。如果与 Result URL 关联的 view 的响应不符合预期,则用户将被重定向到 Fail URL;在那里最好显示有关发生错误的消息。
信号
应通过信号处理程序处理购买状态的变化。
robokassa.signals.result_received - 在收到 Robokassa 的通知时发送。接收到此信号表示支付已成功。作为 sender,传递具有 InvId 和 OutSum 属性的 SuccessNotification 模型的实例。
robokassa.signals.success_page_visited - 在用户过渡到成功的付款页面时发送。如果未使用严格检查(ROBOKASSA_STRICT_CHECK=False),则应使用此信号而不是 result_received。
robokassa.signals.fail_page_visited - 在用户过渡到付款错误页面时发送。接收到此信号表示未进行支付。在处理程序中应执行解锁库存中的商品等操作。
所有信号都接收参数 InvId(订单号)、OutSum(支付金额)和 extra(描述在 ROBOKASSA_EXTRA_PARAMS 中的额外参数的字典)。
示例
from robokassa.signals import result_received from my_app.models import Order def payment_received(sender, **kwargs): order = Order.objects.get(id=kwargs['InvId']) order.status = 'paid' order.paid_sum = kwargs['OutSum'] order.extra_param = kwargs['extra']['my_param'] order.save() result_received.connect(payment_received)
urls.py
要设置 Result URL、Success URL 和 Fail URL,可以连接 robokassa.urls 模块
urlpatterns = patterns('', #... url(r'^robokassa/', include('robokassa.urls')), #... )
在这种情况下,需要在 robokassa 控制面板中指定的地址将具有以下形式
结果URL: http://yoursite.ru/robokassa/result/
成功URL: http://yoursite.ru/robokassa/success/
失败URL: http://yoursite.ru/robokassa/fail/
模板
robokassa/success.html - 在支付成功时显示。上下文中存在类型为 SuccessRedirectForm 的 form 变量,以及订单的 InvId 和 OutSum 参数,还有在 ROBOKASSA_EXTRA_PARAMS 中描述的所有附加参数。
robokassa/fail.html - 在支付失败时显示。上下文中存在类型为 FailRedirectForm 的 form 变量,订单的 InvId 和 OutSum 参数,以及 ROBOKASSA_EXTRA_PARAMS 中描述的所有附加参数。
robokassa/error.html - 在请求“成功”或“失败”页面时发生错误时显示(例如,当校验和错误时)。上下文中存在类型为 FailRedirectForm 或 SuccessRedirectForm 的 form 变量。
开发
开发在github上进行: https://github.com/kmike/django-robokassa
请将您的建议、想法、错误报告等写入跟踪器: https://github.com/kmike/django-robokassa/issues
许可证 - MIT。
测试
要启动测试,请安装 tox,克隆仓库并执行以下命令。
$ tox
从仓库根目录。
变更历史
1.3 (2016-03-07)
修复了测试模式下的工作(感谢肖米欣·伊凡);
通过 ROBOKASSA_TEST_FORM_TARGET 设置允许指定自己的测试服务器(感谢 https://github.com/superqwer)。
bitbucket 上的仓库不再受支持;
setup.py 现在使用 setuptools。
1.2 (2013-12-24)
添加了对 django 1.6 的支持 - 感谢亚历山大·西蒙金;
不再支持 Python 2.5。
1.1 (2013-04-12)
在 FailURL 页面上不再检查签名(因为 Robokassa 已停止传输它) - 感谢 @amureki;
改进了文档 - 感谢 @bo858585。
1.0 (2012-03-24)
现在需要 django >= 1.3 才能运行;
添加了对 django 1.4 的支持;
所有视图现在都返回 TemplateResponse;
迁移已升级到 south 的现代版本;
通过 tox 启动测试;
在 README 中进行了小的改进。
0.9.3 (2010-08-05)
错误的签名消息不会引发异常。
0.9.2 (2010-06-23)
添加了对 django 1.2 的支持。
0.9.1 (2010-05-10)
修复了处理额外(用户定义)参数的工作。
0.9.0 (2010-04-15)
第一个版本
项目详情
下载文件
为您的平台下载文件。如果您不确定要选择哪个,请了解更多关于 安装包 的信息。