跳转到主要内容

Mollie iDeal API的包装器

项目描述

简介

collective.mollie 提供了 Mollie iDeal API 的包装器。此包装器 可以 在不进行任何进一步Plone集成的情况下使用。但是,此包还提供了

  • 适配器,用于在对象上存储支付信息。

  • 浏览器视图,可用于让Mollie报告。

  • 一个 事件,可以订阅以在支付状态更新时接收通知。

iDeal

完整的iDeal支付流程包含以下步骤

  1. 请求银行列表

  2. 请求支付

  3. 让客户进行支付

  4. 检查支付

  5. 客户返回网站

请求银行列表

由于银行列表可能会更改,您在支付之前始终需要检索它

>>> from zope.component import getUtility
>>> from collective.mollie.interfaces import IMollieIdeal
>>> ideal_wrapper = getUtility(IMollieIdeal)
>>> ideal_wrapper.get_banks()
[('0031', 'ABN AMRO'), ...]

如果设置了 TESTMODE 标志,您可以检索一个测试银行

>>> ideal_wrapper.TESTMODE = True
>>> ideal_wrapper.get_banks()
[('9999', 'TBM Bank')]
>>> ideal_wrapper.TESTMODE = False
>>> ideal_wrapper.get_banks()
[('0031', 'ABN AMRO'), ...]

调用结果是一个元组列表。每个元组由一个银行ID和名称组成。名称可以用来向客户展示,以便他们可以选择使用哪个银行。ID在下一步中需要使用。

请求支付

当您知道将要使用哪个银行进行支付时,您可以使用API请求支付

>>> ideal_wrapper.request_payment(partner_id='999999',
...     bank_id='9999', amount='123', message='The message',
...     report_url='http://example.com/report',
...     return_url='http://example.com/return',
...     profile_key='999999')
('123...123', 'http://...')

结果是 transaction_id 和一个发送客户进行支付的URL。

让客户进行支付

此包不处理此步骤。您应将客户重定向到 request_payment 返回的URL,并希望他们完成交易。

检查支付

一旦 report_url(见 请求支付)被Mollie ping,您可以检查支付的状态

>>> ideal_wrapper.check_payment(partner_id='999999',
...                             transaction_id='123...123')
{'transaction_id': '123...123',
 'amount': '123',
 'currency': 'EUR',
 'paid': True,
 'status': 'Success',
 'consumer': {
     'name': 'T. TEST',
     'account': '0123456789',
     'city': 'Testdorp'
 }
}

当状态不是“成功”时,将不会有关于消费者的数据。

客户返回网站

客户将被返回到 return_url。然而,此步骤由本包处理。您应使用前一步的结果(见 检查支付)来通知客户并展示适当的进一步操作。

可能发生的情况是 report_url 尚未调用,因此支付状态尚不清楚。Mollie建议向客户报告状态未知,但支付将在状态最终确定后自动处理。

Plone集成

如果您想在您的Plone项目中集成iDeal支付,您可以使用上面描述的 MollieIdeal 实用工具中定义的iDeal包装器。

适配器

但是,您也可以使用包中定义的适配器之一:MollieIdealPaymentMollieIdealMultiplePayments。通过使用这些中的一个,可以在适配的对象上持久存储有关支付的信息。

您可以为实现 IAttributeAnnotatable 接口的对象进行适配。例如

>>> from zope.annotation import IAttributeAnnotatable
>>> from persistent import Persistent
>>> from zope.interface import Interface
>>> class IFoo(Interface):
>>>     pass
>>> class Foo(Persistent):
...     implements(IFoo, IAttributeAnnotatable)

如果您只想在对象上存储单个支付,这在特定的购买中很常见,您可以使用 IMollieIdealPayment 接口

>>> from collective.mollie.interfaces import IMollieIdealPayment
>>> purchase = Foo()
>>> purchase_payment = IMollieIdealPayment(purchase)

现在您可以请求银行、支付URL和支付状态

>>> purchase_payment.get_banks()
[('0031', 'ABN AMRO'), ...]
>>> purchase_payment.get_payment_url(partner_id='999999',
...     bank_id='9999', amount='123', message='The message',
...     report_url='http://example.com/report',
...     return_url='http://example.com/return',
...     profile_key='999999')
'http://....'
>>> purchase_payment.get_payment_status()
'Success'

请注意,在请求支付状态时,您不需要重复 partner_idtransaction_id。这些信息在您请求支付URL时被存储,并用于 get_payment_status 调用。

如前所述,支付信息是持久存储的

>>> purchase_payment.paid
True
>>> purchase_payment.amount
'123'
>>> purchase_payment.consumer
{'name': 'T. TEST',
 'account': '0123456789',
 'city': 'Testdorp'
 }

在需要在一个对象上存储多个支付的情况下,您可以使用 IMollieIdealMultiplePayments 接口。例如,如果您想允许多个人为某个慈善机构捐款

>>> from collective.mollie.interfaces import IMollieIdealMultiplePayments
>>> charity = Foo()
>>> charity_donations = IMollieIdealMultiplePayments(charity)

与之前一样,您也可以请求可用的银行

>>> charity_payment.get_banks()
[('0031', 'ABN AMRO'), ...]

当您检索支付URL时,您也会得到一个交易ID

>>> charity_payment.get_payment_url(partner_id='999999',
...     bank_id='9999', amount='123', message='The message',
...     report_url='http://example.com/report',
...     return_url='http://example.com/return',
...     profile_key='999999')
('123...', 'http://....')

当您想访问支付的数据时,您需要此交易ID

>>> charity_payment.get_payment_status('123...')
'Success'
>>> payment = charity_payment.get_transaction('123...')
>>> payment['paid']
True
>>> payment['amount']
'123'
>>> payment['consumer']
{'name': 'T. TEST',
 'account': '0123456789',
 'city': 'Testdorp'
 }

请注意,获取支付信息的方法与单次支付情况略有不同。

浏览器视图

如第检查支付部分所述,您需要等待Mollie ping了report_url后才能检查支付状态。

您可以编写自己的视图,也可以使用由collective.mollie提供的视图:ReportPaymentStatusViewReportMultiplePaymentsStatusView类。这些视图检查请求中的transaction_id是否与对象上存储的匹配。如果是,则立即检查对象的支付状态。

要使用简单支付视图,首先注册它

<browser:page
    for="*"
    class="collective.mollie.browser.report.ReportPaymentStatusView"
    name="report_payment_status"
    permission="zope2.View"
    />

或者,您可以使用多支付报告视图

<browser:page
    for="*"
    class="collective.mollie.browser.report.ReportMultiplePaymentsStatusView"
    name="report_payment_status"
    permission="zope2.View"
    />

(您可能只需为特定接口注册视图。显然,您可以根据需要为其命名。)

然后,在请求支付URL时,使用<object>/absolute_url/@@report_payment_status作为report_url

事件

报告视图还发出一个事件:MollieIdealPaymentEvent。因此,通过在您的包中实现订阅者,您可以在对象的支付信息更新时获得通知,例如将对象的工作流程状态更改为“已支付”。

例如,您可以在您的configure.zcml中注册订阅者

<subscriber
    for="IFoo
         collective.mollie.interfaces.IMollieIdealPaymentEvent"
    handler=".events.process_payment"
    />

并在events.py

def process_payment(obj, event):
    """Process the payment information."""

其中objFoo的实例,而eventMollieIdealPaymentEvent

更多信息

有关Mollie iDeal API的详细信息,请参阅其文档

致谢

本包受到nfg.ideal的启发。

变更日志

0.3 (2012-10-31)

  • 实现了一个新的报告视图(ReportMultiplePaymentsStatusView),可用于Mollie的报告URL。[markvl]

  • 实现了一个新的适配器(MollieIdealMultiplePayments),可用于在单个对象上注册多次支付。[markvl]

  • 修复了在运行测试时出现的FutureWarnings。[markvl]

  • 通过测试XML到dict和list转换器,提高了测试覆盖率。[marklv]

  • 修复了适配器中的错误,该错误将_profile_key属性定义了两次而不是_partner_id。[markvl]

0.2 (2012-04-05)

  • MollieIdealPaymentEvent现在继承自ObjectEvent并提供了请求。[markvl]

0.1 (2012-04-04)

  • 初始发布

项目详情


下载文件

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

源分发

collective.mollie-0.3.zip (46.9 kB 查看哈希值)

上传时间:

由以下支持