Como: Crear un Payment Method en Magento 2
En esta página
Recientemente me asignaron la tarea de crear un método de pago personalizado para un proyecto. Mientras investigaba descubrí que hay dos maneras de crear un método de pago en Magento 2.
- La forma antigua, similar a como se hacía en M1, extendiendo
AbstractMethod. - La forma nueva, usando el Payment Provider Gateway .
El gateway es el enfoque recomendado para cualquier cosa que hable con un procesador real. Pero para un método simple
tipo offline, la manera más ligera es configurar un Adapter de pago a través del di.xml, sin necesidad de un
modelo propio. Esa es la que mostraré aquí.
app/code/Vendor/Payment. Si necesitas saber cómo crear un nuevo módulo, te recomiendo que le eches un vistazo a Cómo crear un nuevo módulo para Magento 2.La configuración
Primero los valores por defecto de nuestro método en el config.xml.
<?xml version="1.0"?>
<!-- app/code/Vendor/Payment/etc/config.xml -->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Store:etc/config.xsd">
<default>
<payment>
<vendor_custom>
<active>1</active>
<model>VendorCustomPaymentFacade</model>
<title>My Custom Payment</title>
<order_status>pending</order_status>
<payment_action>authorize</payment_action>
</vendor_custom>
</payment>
</default>
</config>Luego los campos de admin en el system.xml, para que el comerciante pueda activarlo y renombrarlo desde Stores > Configuration > Payment Methods.
<?xml version="1.0"?>
<!-- app/code/Vendor/Payment/etc/adminhtml/system.xml -->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Config:etc/system_file.xsd">
<system>
<section id="payment">
<group id="vendor_custom" translate="label" sortOrder="10" showInDefault="1" showInWebsite="1" showInStore="1">
<label>My Custom Payment</label>
<field id="active" translate="label" type="select" sortOrder="1" showInDefault="1" showInWebsite="1">
<label>Enabled</label>
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
</field>
<field id="title" translate="label" type="text" sortOrder="2" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Title</label>
</field>
</group>
</section>
</system>
</config>El método (sin modelo propio)
En lugar de escribir un modelo, declaramos un virtualType basado en el Adapter de pago. Esto es suficiente para
un método simple.
<?xml version="1.0"?>
<!-- app/code/Vendor/Payment/etc/di.xml -->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<virtualType name="VendorCustomPaymentFacade" type="Magento\Payment\Model\Method\Adapter">
<arguments>
<argument name="code" xsi:type="const">Vendor\Payment\Model\Ui\ConfigProvider::CODE</argument>
<argument name="formBlockType">Magento\Payment\Block\Form</argument>
<argument name="infoBlockType">Magento\Payment\Block\Info</argument>
<argument name="valueHandlerPool" xsi:type="object">VendorCustomValueHandlerPool</argument>
</arguments>
</virtualType>
</config>El frontend
Por último, registramos el renderer del checkout mediante checkout_index_index.xml y un pequeño componente js que
apunta al renderer por defecto. Dejo la plantilla como una copia de Magento_Payment::payment/default.phtml a menos
que necesite algo especial.
<?xml version="1.0"?>
<!-- app/code/Vendor/Payment/view/frontend/layout/checkout_index_index.xml -->
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<referenceBlock name="checkout.root">
<arguments>
<argument name="jsLayout" xsi:type="array">
<item name="components" xsi:type="array">
<item name="checkout" xsi:type="array">
<item name="children" xsi:type="array">
<item name="steps" xsi:type="array">
<item name="children" xsi:type="array">
<item name="billing-step" xsi:type="array">
<item name="children" xsi:type="array">
<item name="payment" xsi:type="array">
<item name="children" xsi:type="array">
<item name="renders" xsi:type="array">
<item name="children" xsi:type="array">
<item name="vendor_custom" xsi:type="array">
<item name="component" xsi:type="string">Vendor_Payment/js/view/payment/vendor-custom</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</argument>
</arguments>
</referenceBlock>
</body>
</page>Después de un setup:upgrade y un flush de caché, el método aparece tanto en la configuración del admin como en el checkout.
Espero que esto ayude.
Si tienes alguna pregunta o conoces una mejor manera de lograr esto, siéntete libre de compartir en los comentarios a continuación.