Django-Oscar的PaymentExpress支付模块,

django-oscar-paymentexpress的Python项目详细描述


这个包提供与支付网关paymentexpress的集成,使用它们的PX POST API。它被设计成与电子商务框架django-oscar无缝工作,但可以在没有它的情况下使用。

安装

来自PYPI:

pip install django-oscar-paymentexpress

或来自github:

pip install git+git://github.com/tangentlabs/django-oscar-paymentexpress.git#egg=django-oscar-paymentexpress

'paymentexpress'添加到INSTALLED_APPS并运行:

./manage.py migrate paymentexpress

创建适当的数据库表。

配置

编辑settings.py以设置以下设置:

PAYMENTEXPRESS_POST_URL = 'https://sec.paymentexpress.com/pxpost.aspx'
PAYMENTEXPRESS_USERNAME = '…'
PAYMENTEXPRESS_PASSWORD = '…'
PAYMENTEXPRESS_CURRENCY = 'AUD'

集成到签出

您需要在自己的子类中使用oscar.apps.checkout.views.PaymentDetailsView。 签出视图。有关如何创建签出应用程序的本地版本,请参见oscar’s documentation

重写handle_payment方法(默认为空)并添加集成代码。一个例子 集成可能如下所示:

# myshop.checkout.views
from django.conf import settings

from oscar.apps.checkout.views import PaymentDetailsView as OscarPaymentDetailsView
from oscar.apps.payment.forms import BankcardForm
from paymentexpress.facade import Facade
from paymentexpress import PAYMENTEXPRESS

...

class PaymentDetailsView(OscarPaymentDetailsView):

    def get_context_data(self, **kwargs):
        ...
        ctx['bankcard_form'] = BankcardForm()
        ...
        return ctx

    def post(self, request, *args, **kwargs):
        """
        This method is designed to be overridden by subclasses which will
        validate the forms from the payment details page.  If the forms are valid
        then the method can call submit()
        """
        # Check bankcard form is valid
        bankcard_form = BankcardForm(request.POST)
        if not bankcard_form.is_valid():
            ctx = self.get_context_data(**kwargs)
            ctx['bankcard_form'] = bankcard_form
            return self.render_to_response(ctx)

        bankcard = bankcard_form.get_bankcard_obj()

        # Call oscar's submit method, passing through the bankcard object so it gets
        # passed to the 'handle_payment' method
        return self.submit(request.basket, payment_kwargs={'bankcard': bankcard})

    def handle_payment(self, order_number, total, **kwargs):
        # Make request to PaymentExpress - if there any problems (eg bankcard
        # not valid / request refused by bank) then an exception would be
        # raised and handled) within oscar's PaymentDetails view.
        bankcard = kwargs['bankcard']
        response_dict = Facade().purchase(order_number, total, None, bankcard)

        source_type, _ = SourceType.objects.get_or_create(name=PAYMENTEXPRESS)
        source = Source(source_type=source_type,
                        currency=settings.PAYMENTEXPRESS_CURRENCY,
                        amount_allocated=total,
                        amount_debited=total,
                        reference=response_dict['partner_reference'])

        self.add_payment_source(source)

        # Also record payment event
        self.add_payment_event(PURCHASE, total)

oscar的观点将处理可能引起的各种异常。

包装结构

有两个关键组件:

网关

paymentexpress.gateway.Gateway提供对paymentexpress api的细粒度访问,这涉及构造xml请求和解码xml响应。所有调用都返回一个paymentexpress.gateway.Response实例,该实例提供对响应属性的字典式访问。

示例调用:

# Authorise a transaction.
# The funds are not transferred from the cardholder account.
response = gateway.authorise(card_holder='John Smith',
                             card_number='4500230021616301',
                             cvc2='123',
                             amount=50.23)

# Completes (settles) a pre-approved Auth Transaction.
response = gateway.complete(amount=50.23,
                            dps_txn_ref='0000000809b61753')


# Purchase on a new card - funds are transferred immediately
response = gateway.purchase(card_holder='Frankie',
                            card_number=CARD_VISA,
                            card_expiry='1015',
                            cvc2='123',
                            merchant_ref='100001_PURCHASE_1_2008',
                            enable_add_bill_card=1,
                            amount=29.95)

# Purchase on a previously used card
response = gateway.purchase(amount=29.95,
                            billing_id='0000080023748351')


# Refund a transaction - funds are transferred immediately
response = gateway.refund(dps_txn_ref='0000000809b61753',
                          merchant_ref='abc123',
                          amount=50.23)

正面

paymentexpress.facade.Facade包装了上述网关对象并提供了粒度较小的api,同时保存了paymentexpress.models.OrderTransaction的实例以提供paymentexpress活动的审计跟踪。

设置

  • PAYMENTEXPRESS_POST_URL-px post url
  • PAYMENTEXPRESS_USERNAME-用户名
  • PAYMENTEXPRESS_PASSWORD-密码
  • PAYMENTEXPRESS_CURRENCY-用于交易的货币

贡献

要处理django-oscar-paymentexpress,请克隆repo,设置一个virtualenv并以开发模式安装:

python setup.py develop

然后安装测试依赖项:

pip install -r requirements.txt

然后可以使用以下命令运行测试套件:

./run_tests.py

魔法卡号可在PaymentExpress网站上获得: http://www.paymentexpress.com/knowledge_base/faq/developer_faq.html#Testing%20Details

Visa VARD示例:

4111111111111111

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

推荐PyPI第三方库


热门话题
java通过Spring MVC web应用程序向客户端发送文本文件   java是否可以在运行时动态实例化DAO类?   调用VB。来自Java的net函数   java在Android中通过单击打开特定文件夹   java如何使用maven pom。xml标识非标准项目结构中的testng测试用例?   java为什么FOP在大文件上崩溃?   Architecture python+flask和spring boot+java   java Kafka工具根本没有启动Ubuntu 19.10   如何使用Eclipse运行Java USB API for Windows   java如何在Eclipse中查看J2EE预览服务器/容器的日志/控制台?   网页抓取是否可以使用Java crawler crawler4j暂停和恢复抓取?   java当我第二次按下按钮时,应用程序停止工作   带有偏移量和限制的java SQLite分页问题   java如何在OSX mavericks中将端口80转发到8080   java从泛型方法调用非泛型方法   java My代码未按预期工作。十进制输出不是它应该的样子   节点。java中的js加密(jasypt)和nodejs中的解密   java乘法表不工作数组索引超出范围   java将JDBC与Firebirdsql连接起来