用于将支付系统ASSIST集成到Django项目的应用程序。
项目描述
django-assist-ru - 是一个用于将支付系统ASSIST集成到Django项目的应用程序。
在使用前,请阅读ASSIST的官方文档(《http://assist.ru/files/manual_new.pdf》)。该应用程序实现了文档中描述的交互协议。
安装
像往常一样
$ pip install django-assist-ru
或者
$ easy_install django-assist-ru
或者
$ hg clone http://bitbucket.org/kmike/django-assist-ru/ $ cd django-assist-ru $ python setup.py install
然后需要在INSTALLED_APPS中添加‘assist’,并执行
$ python manage.py syncdb
如果使用South,则用syncdb代替
$ python manage.py migrate
配置
在settings.py中需要指定以下设置
ASSIST_SHOP_IDP - 商店标识符(数字)
ASSIST_LOGIN - 登录名
ASSIST_PASSWORD - 密码
可选参数
ASSIST_TEST_MODE - 是否启用测试模式。默认为False(即启用战斗模式)。
ASSIST_SERVER - Assist“战斗”服务器地址。默认为 - https://secure.assist.ru
使用
要接收付款的表单应显示在编码为1251的页面上。对于使用utf-8编码的人,在django-assist-ru中有一个cp1251装饰器,它可以转换页面为1251,修正http标题,并更改meta标签
from assist.decorators import cp1251 @cp1251 @login_required def go_to_assist(request) ...
付款表单
为了简化将用户发送到ASSIST的html表单的构建,在django-assist-ru中有两个表单:AssistMode1Form和AssistMode2Form(用于ASSIST的两种工作模式)。这些表单不需要验证数据,而是简化模板中的信息输出。
示例
# views.py from django.shortcuts import get_object_or_404 from django.views.generic.simple import direct_to_template from django.contrib.auth.decorators import login_required from assist.decorators import cp1251 from assist.forms import AssistMode2Form @cp1251 @login_required def go_to_assist(request, order_id) order = get_object_or_404(Order, pk = order_id) form = AssistMode2Form(initial={ 'Order_IDP': order.id, 'Subtotal_P': order.total, 'Comment': order.name, 'LastName': request.user.last_name, 'FirstName': request.user.first_name, 'Email': request.user.email, 'Phone': request.user.get_profile().phone, }) return direct_to_template(request, 'go_to_assist.html', {'form': form})
有关initial字段中允许的完整列表,可以参考ASSIST文档或查看源代码,字段名称是相同的。
django-assist-ru 不包含“购买”模型,因为这个模型在每个网站之间可能会有所不同。开发者的任务是形成并传递 Order_IDP(订单号)和 Subtotal_P(订单总额)参数到表单中。其他字段是可选的。
相应的模板
{% extends 'base.html' %} {% block content %} <form action="{{ form.target }}" method="POST"> <p>{{ form.as_p }}</p> <p><input type="submit" name='SUBMIT' value="Купить"></p> </form> {% endblock %}
表单将以一组隐藏的 input 标签的形式输出。
AssistMode1Form 和 AssistMode2Form 形式的 target 属性包含一个 URL,该 URL 用于提交表单。在测试模式下,这是一个测试 URL,在战斗模式下,这是一个战斗 URL。
获取支付结果
from assist.models import AssistAuthResult AssistAuthResult.objects.update_auth_report()
此方法通过向 ASSIST 服务器请求数据来获取授权结果,并根据这些结果在数据库中创建/更新记录(每个 BillNumber 对应一个 AssistAuthResult 记录)。
根据 ASSIST 规则,这个操作不应频繁执行,每 10 分钟不应超过 1 次。
当用户从支付页面返回时,不应执行此操作,最好按计划执行。
获取订单的当前支付状态
最后交易的最后一个结果不一定是 Assist 中的支付状态,仅计算订单的最后交易可能导致某些支付丢失。
具有“处理中”状态的交易在用户每次进入 Assist 支付页面时都会创建。因此,可以创建多个“处理中”支付会话并支付较早的支付。最终,具有“处理中”状态的结果(无论是按日期还是按编号)将替代“已支付”状态。然后,“处理中”状态将因超时而变为“未成功”,这将导致有一个未支付的订单,尽管实际上订单已被支付。
为了避免这种情况,采用了以下方法
如果有任何具有积极结果的交易(例如,“已授权”),则忽略具有相应负面结果的交易(对于“已授权”,“未授权”)。
“处理中”状态完全不计算。对于由用户触发的操作,此状态仅意味着用户已进入 ASSIST 页面。对于由程序触发的操作,“处理中”状态既不保证唯一性也不保证执行顺序。而不是检查操作是否已开始,可以重新启动操作,这对于取款操作是安全的:在最坏的情况下,只是从 ASSIST 获得错误。
在 django-assist-ru 中有一个模型管理器方法实现了此方法
from assist.models import AssistAuthResult order_id = 145 bill = AssistAuthResult.objects.actual_for_order(order_id)
双阶段工作模式
在双阶段机制中,信用卡授权过程和金融交易过程是分开的。
要激活双阶段模式,应在创建表单时传递参数 Delay=1
@cp1251 @login_required def go_to_assist(request, order_id) order = get_object_or_404(Order, pk = order_id) form = AssistMode1Form(initial={ 'Order_IDP': order.id, 'Subtotal_P': order.total, 'Delay': 1 }) return direct_to_template(request, 'go_to_assist.html', {'form': form})
资金将不会被扣除,而是被锁定。资金的扣除将单独启动(在锁定后的 14 天内)通过 charge 方法。
bill = AssistAuthResult.objects.get(id=123) bill.charge()
可以通过 refund 方法在不等待 14 天的情况下解除资金锁定。
bill = AssistAuthResult.objects.get(id=123) bill.refund()
退货订单的资金是通过同一命令执行的。