Mollie iDeal API的包装器
项目描述
简介
collective.mollie 提供了 Mollie iDeal API 的包装器。此包装器 可以 在不进行任何进一步Plone集成的情况下使用。但是,此包还提供了
iDeal
完整的iDeal支付流程包含以下步骤
请求银行列表
由于银行列表可能会更改,您在支付之前始终需要检索它
>>> 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包装器。
适配器
但是,您也可以使用包中定义的适配器之一:MollieIdealPayment 和 MollieIdealMultiplePayments。通过使用这些中的一个,可以在适配的对象上持久存储有关支付的信息。
您可以为实现 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_id 或 transaction_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提供的视图:ReportPaymentStatusView和ReportMultiplePaymentsStatusView类。这些视图检查请求中的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."""
其中obj是Foo的实例,而event是MollieIdealPaymentEvent。
更多信息
有关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的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 6c2eb71f934205b829516e6f30615bac4158916b39c7261172bdf4ebc9c9bdee |
|
MD5 | 731e96826fb087387c7cb0a8014b855d |
|
BLAKE2b-256 | cc9b5bbb4fae748249963bc3728bdfd16695ec2d3f6d1a1384c099866804f1fd |