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