我正在为Magento实现一个新的支付模块,我想了解这个逻辑背后的核心概念。我知道我必须从Mage_Payment_Model_Method_Abstract或它的任何子类扩展,但我的问题是在我的模型中何时以及如何使用捕获和授权方法。例如,如果我将整个过程分为如下步骤:
1.用户来到购物车和选择让我们说一些支付方式,这是网关。
1.系统拦截请求,收集所有提交的数据并将用户发送到网关URL。
1.用户将他的订单(或取消)在网关站点发送有关它的信息到我的商店。
1.我的商店用收到的数据对订单做了一些更多的修改,并以完成或取消的状态保存订单。
在这些步骤中,我必须在哪些地方使用授权和捕获方法?如果有人能向我解释授权和捕获的含义,我将不胜感激。
1条答案
按热度按时间yyyllmsg1#
以下是我一直以来对这些概念的理解,以及在Magento中实现支付模块所需要知道的内容。下面是对你的具体问题"在哪里发生"的答案,尽管它并不像你希望的那么简单。
互联网之前,实体信用卡交易是一个两阶段的过程。
在销售时,当商家拿着消费者的信用卡进行购买时,他们会将其滑动通过销售点设备,该销售点设备会呼叫信用卡的中心办公室并询问"此卡是否被授权用于该网络,以及该特定消费者的可用信用额度是否足够大以允许该购买".
如果购买被接受(与拒绝相对),则认为该收费是"授权的"。消费者将取走他们的产品,并且销售点系统/收银机将注意到该交易是授权的。然后,在一天结束时,或一周结束时,在某个其它预定的定期时间表,或当所有者决定停止饮酒时,商家将检查他们所有的授权收据,并向中心局发送另一请求以从 * 授权 * 交易中 * 获取 * 资金。获取资金就是将钱放入商家的账户。
这仍然是大多数网关使用的模型,也是Magento Inc.选择为他们的支付模块实现的域模型。
事情应该是这样运行的,当消费者在Magento这样的系统中完成最后的结账步骤时,Magento会向网关的API发出授权请求。如果交易成功,系统就会接受订单,并存储授权请求中的唯一ID。接下来,当消费者的商品发货时,商店所有者使用Magento管理员创建发票。创建此发票会发出捕获请求(使用从授权请求返回的商店ID)。这是Magento中发出这些方法调用的地方。
However, things get tricky because every payment gateway interprets these concepts a little differently, and every merchant interprets their "don't capture until we've shipped" responsibilities differently. In addition to the scenario described above, payment modules have a system configuration value known as a Payment Action. This can be set to Authorize Only, which will implement the flow described above. It can also be set to Authorize and Capture, which will both authorize and capture a payment when the order is placed. It gets evenmoreconfusing because although the method is called Authorize and Capture, current versions of Magento will only issue the capture request when set in this mode (at least for Authorize.net), and Authorize.net will, internally, leave capture requests in an authorized but not captured state for most of the day. How Magento handles orders and payments and invoices is one area of the codebase that changes a lot from version to version.
所以,Magento支付模块系统背后的思想是保护你不受集群F的影响--集群F是编程支付网关逻辑。在
authorize
方法中,你实现了对支付网关的authorize API的调用(或者执行任何你想在这一点上发生的检查和逻辑)。这个方法传递了一个支付对象和一个金额。如果你让你请求/执行你的逻辑并确定它。的无效,则抛出异常这会告诉Magento授权失败,它会相应地采取行动(显示错误消息等)。否则,您将在Payment对象上设置数据成员,并发出
数据成员是您稍后获取付款时需要的内容。这将我们带到付款模块的
capture
方法。此方法还将发送付款对象和金额。在此方法中,您发出获取请求。付款对象将具有cc_trans_id
数据成员这将允许你对你的网关发出一个捕获,这是你负责保存在
authorize
中的数据成员之一,同样,如果你的代码确定捕获失败,你抛出一个异常,否则,你抛出return $this
。The authorize.net payment module has good examples of how this is done.
例如,考虑
capture
方法的这一部分此处,获取方法检查付款是否具有
cc_trans_id
。根据结果,它将anet_trans_type
设置为以下任一项:然后,API请求对象使用此值发送API调用
1.捕获预授权交易
1.即时捕获