用于集成payfast.co.za支付系统的可插拔django应用程序。

django-payfast的Python项目详细描述


用于集成payfast.co.za支付系统的可插拔django应用程序。

https://img.shields.io/pypi/v/django-payfast.svghttps://img.shields.io/badge/source-GitHub-lightgrey.svghttps://img.shields.io/github/issues/pjdelport/django-payfast.svghttps://travis-ci.org/pjdelport/django-payfast.svg?branch=masterhttps://codecov.io/github/pjdelport/django-payfast/coverage.svg?branch=master

Install

$ pip install django-payfast

然后将“PayFast”添加到已安装的应用程序并执行

$ python manage.py migrate

Settings

在settings.py中指定您的凭据:

  • PAYFAST_MERCHANT_ID
  • PAYFAST_MERCHANT_KEY
  • PAYFAST_URL_BASE:站点的面向公共的基url (用于限定传递给PayFast的通知URL)

PAYFAST_URL_BASE可以是字符串,也可以是返回字符串的可调用字符串。 例如,如果使用django的站点框架来配置域:

def PAYFAST_BASE_URL():
    from django.contrib.sites.models import Site
    site = Site.objects.get_current()
    return 'http://{}'.format(site.domain)

如果您的web服务器位于反向代理之后,您还应该指定 PAYFAST_IP_HEADER选项。这是一个带客户端IP地址的request.META密钥 (默认为“远程地址”)。

有一个payfast服务器ip地址的选项(PAYFAST_IP_ADDRESSES)。 它是包含当前PayFast服务器的IP主机/网络地址的列表。 如果更改,则在settings.py中重写此选项。

您还必须在payfast.co.za上设置您的payfast帐户。登录到 管理面板,转到“我的帐户->;集成”,启用即时事务 通知(ITN)并提供通知URL。

当将用户传递到PayFastForm时,默认情况下表单将查找 用户的名字姓氏字段。如果使用自定义用户 具有不同字段名的模型,您可以自定义字段的外观 通过设置这些可调用项:

PAYFAST_GET_USER_FIRST_NAME = lambda user: user.my_first_name()
PAYFAST_GET_USER_LAST_NAME = lambda user: user.my_last_name()

或者,将这些设置为none以禁用初始化PayFast 用户的name_firstname_last字段。

Usage

Payment form

payfast.forms.payfast form可用于构造HTML表单。它是 一个HTML输出的帮助表单,它不应该执行任何验证。

传递所有字段以形成“initial”参数。表单还有一个可选的 “user”参数:订单购买的用户实例。如果 指定了“user”、“name_first”、“name_last”和“email_address”字段 如果未传递“initial”,则将自动填充。

示例:

# 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 payfast.forms import PayFastForm

@login_required
def pay_with_payfast(request, order_id):

    # Order model have to be defined by user, it is not a part
    # of django-payfast
    order = get_object_or_404(Order, pk = order_id)

    form = PayFastForm(initial={
        # required params:
        'amount': order.total,
        'item_name': 'the name of the item being charged for',

        # optional params:
        # 'return_url' : 'http://my-site.com/orders/payfast/return/',
        # 'cancel_url' : 'http://my-site.com/orders/payfast/cancel/'
        # ... etc.
    }, user=order.user)

    return direct_to_template(request, 'pay_with_payfast.html', {'form': form})

请参阅PayFast文档(http://www.payfast.co.za/c/std/website-payments-variables) 更多选择。“商户ID”、“商户密钥”、“通知URL”和 “signature”参数将自动处理。

模板:

{% extends 'base.html' %}

{% block content %}
    <form action="{{ form.target }}" method="POST">
        <p>{{ form.as_p }}</p>
        <p><input type="submit" value="Buy Now"></p>
    </form>
{% endblock %}

{{form.as}输出将是若干个<input type='hidden'>标记。

PayFastForm有一个带有PayFast服务器URL的“target”属性。

请注意,由您来实现订单处理逻辑。 订单处理应该在payfast.signals.data信号处理程序中执行。

^{tt1}$ signal

当payfast将数据发布到notify urlpayfast.signals.notify信号时 已发送。此信号不会针对可疑数据发送(当请求是 来自不受信任的IP,表单验证失败或付款重复)。

信号订阅者将获得一个带有PayFastOrderinstance的“order”参数。

示例:

import payfast.signals

def notify_handler(sender, **kwargs):
    payfast_order = kwargs['order']

    if payfast_order.payment_status == 'COMPLETE':

        # The order is paid (merchant_id check and check for duplicate
        # payments is already handled by django-payfast)

        amount = payfast_order.amount
        # your business logic
        # ...
    else: # the order is not paid
        # your business logic
        # ...

payfast.signals.notify.connect(notify_handler)

urls.py

要启动并运行notify url,请在url.py:

urlpatterns = patterns('',
    #...
    url(r'^payfast/', include('payfast.urls')),
    #...
)

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
我可以用C++代码使用java代码吗?   java使用JSR303在派生类中提供更具体的约束   java在这个查找唯一路径数算法中我做错了什么?   java如何为2个不同的服务提供商使用2个不同的SSL证书?   java在Gridview上绘制文本   java使用连接for循环构建字符串名   java StringBuilder拆分无法处理某些文件   java事件关注EditText   Java Web Start“找不到URL的缓存资源”   java程序从命令行运行的速度比在Eclipse中慢   java为什么HttpServletRequest会截断#字符上的url输入?   java自定义折叠工具栏平滑标题大小调整   使用Mockito对安卓 java中调用另一个静态函数的函数进行单元测试   http在java客户机中使用cachecontrol头   java如何使用。是否使用Delimiter从输入文件中排除标点符号和数字?   使用上下文作为参数/参数的java   java更有效地从Jar中提取文件   java为多个JButton提供相同的actionListener