Hello, we are developing a payment gateway module for Magento 2.X but we have trouble figuring out why it is not working. We think maybe the /etc/di.xml file is not correct:
<?xml version="1.0"?> <!-- /** * Copyright © 2015 Girosolution All rights reserved. */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <virtualType name="Girosolution\Girocheckout\Block\Form\Girocheckoutmethod\Default" type="Magento\Girocheckout\Block\Form" shared="false"> <arguments> <argument name="data" xsi:type="array"> <item name="template" xsi:type="string">Girosolution_Girocheckout::form/paymentmethod/default.phtml</item> </argument> </arguments> </virtualType> <virtualType name="GirosolutionCommandPool" type="Magento\Payment\Gateway\Command\CommandPool"> <arguments> <argument name="commands" xsi:type="array"> <item name="giropay_sale" xsi:type="string">Girosolution\Girocheckout\Gateway\Giropay\Command\SaleCommand</item> </argument> </arguments> </virtualType> <virtualType name="GirosolutionCommandManager" type="Magento\Payment\Gateway\Command\CommandManager"> <arguments> <argument name="commandPool" xsi:type="object">GirosolutionCommandPool</argument> </arguments> </virtualType> <type name="Magento\Payment\Gateway\Command\CommandManagerPool"> <arguments> <argument name="executors" xsi:type="array"> <item name="girosolution" xsi:type="string">GirosolutionCommandManager</item> </argument> </arguments> </type> </config>
Then we have the file app\code\Girosolution\Girocheckout\Gateway\Giropay\Command\SaleCommand.php but the function execute() is never triggered when the customer try to pay with our payment method giropay. The code is:
<?php /** * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ namespace Girosolution\Girocheckout\Gateway\Giropay\Command; use Magento\Payment\Gateway\Command; use Magento\Payment\Gateway\Command\ResultInterface; use Magento\Payment\Gateway\CommandInterface; use Magento\Payment\Gateway\Data\PaymentDataObjectInterface; use Magento\Payment\Helper\Formatter; use Magento\Paypal\Model\Payflow\Transparent; class SaleCommand implements CommandInterface { use Formatter; /** * @var Transparent */ private $girocheckoutFacade; /** * SaleCommand constructor. * @param Transparent $girocheckoutFacade */ public function __construct( Transparent $girocheckoutFacade ) { $this->girocheckoutFacade = $girocheckoutFacade; } /** * Executes command basing on business object * * @param array $commandSubject * @return null|ResultInterface */ public function execute(array $commandSubject) { error_log("execute() in SaleCommand.php"); /** @var double $amount */ $amount = $commandSubject['amount']; /** @var PaymentDataObjectInterface $paymentDO */ $paymentDO = $commandSubject['payment']; $payment = $paymentDO->getPayment(); $storeId = $paymentDO->getOrder()->getStoreId(); $this->girocheckoutFacade->setStore($storeId); /** @var \Magento\Vault\Api\Data\PaymentTokenInterface $token */ $token = $payment->getExtensionAttributes()->getVaultPaymentToken(); $request = $this->girocheckoutFacade->buildBasicRequest(); $request->setAmt($this->formatPrice($amount)); $request->setTrxtype(Transparent::TRXTYPE_SALE); $request->setOrigid($token->getGatewayToken()); $this->girocheckoutFacade->addRequestOrderInfo($request, $payment->getOrder()); $response = $this->girocheckoutFacade->postRequest($request, $this->girocheckoutFacade->getConfig()); $this->girocheckoutFacade->processErrors($response); $this->girocheckoutFacade->setTransStatus($payment, $response); } }
We really need some help, thanks in advance.
You have to create "capture" or "authorize" commands in order to see "execute()" method in action.
<virtualType name="GirosolutionCommandPool" type="Magento\Payment\Gateway\Command\CommandPool"> <arguments> <argument name="commands" xsi:type="array"> <item name="capture" xsi:type="string">Girosolution\Girocheckout\Gateway\Giropay\Command\SaleCommand</item> </argument> </arguments> </virtualType>
Preferable with "CaptureCommand" class name and its implementation of "execute()" method.
Then once you have "capture" command you have to have configuration Facade for custom payment method.
<virtualType name="GiropayRemoteFacade" type="Magento\Payment\Model\Method\Adapter">
<arguments>
<argument name="code" xsi:type="string">realex</argument>
<argument name="valueHandlerPool" xsi:type="object">GiropayValueHandlerPool</argument>
<argument name="validatorPool" xsi:type="object">GiropayValidatorPool</argument>
<argument name="commandPool" xsi:type="object">GiropayommandPool</argument>
</arguments>
</virtualType>
And then include this facade name into config.xml for your custom payment.
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Store:etc/config.xsd">
<default>
<payment>
<realex>
<model>GiropayRemoteFacade</model>
</realex>
</payment>
</default>
</config>
Once you have all these set up, Magento Payment will trigger "\Magento\Payment\Model\Method\Adapter::capture()" method and trigger your command.
public function capture(InfoInterface $payment, $amount)
{
$this->executeCommand(
'capture',
['payment' => $payment, 'amount' => $amount]
);
return $this;
}
Hope this helps.