Magento 2 Payment Capture Partial Request

In most cases when you develop new Payment integration in Magento 2 you have to consider different scenarios and workflows. It allows you as a developer to implement feature rich user experience.

In the Magento 2 Payment Adapter Configuration article we have reviewed Payment Adapter class and it’s ways of configuring isolated Payment Service Provider requests via di.xml configuration file.

Overview

In this article we are going to review Partial Capture request processing flow. Payment methods such as Authorize.net, PayPal, Realex Payments, Braintree etc. allow you to configure payment action (System -> Configuration -> Sales -> Payment Methods -> Method Name -> Payment Action) to be “Authorize only”. It means that when customer place an order, an order amount to pay is authorized at customer’s bank account. Merchant has to capture the order amount manually via Payment online terminal.

Magento 2 Payment module allows to implement Capture request by payment method. Capture request is triggered when Merchant creates an Invoice for an Order via Magento Admin panel. Payment method implementation might also support sending Partial Capture request to Payment Service Provider.

Where Partial Capture request is used?

It usefull when Merchant wants to edit Product’s quantity in an Invoice which affect order total amount. In order to further send notification to Payment Service Provider about new order amount, partial capture request has to be send.

Partial Capture Support in Payment Method

In order to add partial capture support the config.xml configuration should set to can_capture_partial value to “1”.

[php]
<config>
<default>
<payment>
<method_code> <!– Method Code of your Payment method implementation –>
<can_capture_partial>1</can_capture_partial>
</method_code>
</payment>
</default>
</config>
[/php]

The can_capture_partial setting is verified Invoice page rendering in the
Magento\Sales\Block\Adminhtml\Order\Invoice\Create\Items class:

[php]
public function canEditQty()
{
if ($this->getInvoice()->getOrder()->getPayment()->canCapture()) {
return $this->getInvoice()->getOrder()->getPayment()->canCapturePartial();
}
return true;
}
[/php]

During implementation of the Partial Capture request I’ve found that both the Magento\Payment\Model\Method\Adapter class as well as the Magento\Payment\Model\MethodInterface interface have no capturePartial() method. Should capturePartial() method exists if canCapturePartial() method is used? Is the method missing from the MethodInterface implementation?

There are payment methods (Realex Payments, Cybersource, etc.) require different Capture and Partial Capture requests. As we know the Magento\Payment\Gateway framework allows to isolate each request via Magento\Payment\Gateway\Command\GatewayCommand class configuration. Each Gateway Command is configured as virtual type and added into paymentCommandPool instance:

[php]
<virtualType name="paymentCommandPool" type="Magento\Payment\Gateway\Command\CommandPool">
<arguments>
<argument name="commands" xsi:type="array">
<item name="capture" xsi:type="string">captureVirtualGatewayCommand</item>
<item name="capture_partial" xsi:type="string">capturePartialVirtualGatewayCommand</item>
</argument>
</arguments>
</virtualType>
[/php]

With the configuration provided how do we call capture and capture_partial commands based on different conditions? For instance, parent Authorization Transaction has been created or captured order amount is less than order paid.

I am going to talk about Partial Capture command execution flow in my next article.

Don’t forget to follow me @max_pronko on Twitter or Facebook Page.


Posted

in

,

by

Comments

Leave a Reply