跳转到主要内容

用于将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 有几种确定支付结果的方法。

  1. 在过渡到 Success 和 Fail 页面时,可以保证支付已经成功或未成功。

  2. 在成功或失败的支付中,Robokassa 会将 POST 或 GET 请求发送到 Result URL。

  3. 可以通过 XML 服务请求支付状态。

目前,django-robokassa 支持方法 1 和 2 以及它们的组合(在使用 ROBOKASSA_STRICT_CHECK = True 选项时,进行额外检查,以确认在过渡到 Success URL 时已通过 Result URL 收到通知)。

出于安全考虑,最好始终使用严格检查(通过 Result URL 进行确认)。其机制

  1. 在付款后,robokassa.ru 会向 ResultURL 发送“后台”请求。

  2. 在关联到 ResultURL 的 view 中,通过 ROBOKASSA_PASSWORD2(这是第二个密码,不会通过网络传递,并且只有发送者和接收者知道)检查请求中的 md5 签名。ROBOKASSA_PASSWORD2 用于确认请求确实来自 robokassa.ru。

  3. 如果请求正确,则 view 会发送 robokassa.signals.result_received 信号。为了在网站内部进行操作(例如,根据收到的请求计费或更改订单状态),需要添加相应的信号处理器。

  4. 如果一切正常,则关联到 Result URL 的 view 会向 robokassa.ru 返回类似 OK<operation_id> 的响应,其中 <operation_id> 是当前操作的唯一 ID。此响应对于 robokassa.ru 确认已执行所有必要操作是必需的。

  5. 如果 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 - 在请求“成功”或“失败”页面时发生错误时显示(例如,当校验和错误时)。上下文中存在类型为 FailRedirectFormSuccessRedirectForm 的 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)

第一个版本

项目详情


下载文件

为您的平台下载文件。如果您不确定要选择哪个,请了解更多关于 安装包 的信息。

源分布

django-robokassa-1.3.tar.gz (13.1 kB 查看散列)

上传时间

构建分布

django_robokassa-1.3-py2-none-any.whl (21.0 kB 查看散列)

上传时间 Python 2

由以下支持