Magento 2 Custom Payment Gateway

💳 Magento 2 Custom Payment Gateway – Create Your Own Payment Module

Magento 2 allows you to build your own custom payment gateways to integrate with local providers, in-house systems, or special checkout flows. Let’s walk through creating a basic custom payment module.

🧱 Folder Structure for Custom Payment Module

Create the module at app/code/Vendor/CustomPayment:

Vendor/
└── CustomPayment/
    ├── etc/
    │   ├── module.xml
    │   ├── config.xml
    │   └── di.xml
    ├── Model/
    │   └── PaymentMethod.php
    ├── view/frontend/web/template/payment/
    │   └── custompayment.html
    ├── view/frontend/layout/
    │   └── checkout_index_index.xml
    ├── registration.php
    └── composer.json

📦 Module Declaration – module.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <module name="Vendor_CustomPayment" setup_version="1.0.0"/>
</config>

Try It Now

⚙️ Payment Model – PaymentMethod.php

This is the brain of your gateway, handling method settings and availability.

namespace Vendor\CustomPayment\Model;

use Magento\Payment\Model\Method\AbstractMethod;

class PaymentMethod extends AbstractMethod
{
    protected $_code = 'custompayment';

    protected $_isOffline = true; // no API call

    public function isAvailable(\Magento\Quote\Api\Data\CartInterface $quote = null)
    {
        return true;
    }
}

Try It Now

🔧 Configuration – config.xml

This will make your method appear in the admin settings.

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/config.xsd">
    <default>
        <payment>
            <custompayment>
                <active>1</active>
                <model>Vendor\CustomPayment\Model\PaymentMethod</model>
                <title>Custom Payment</title>
                <order_status>pending</order_status>
                <allowspecific>0</allowspecific>
                <sort_order>100</sort_order>
            </custompayment>
        </payment>
    </default>
</config>

Try It Now

🛠️ Dependency Injection – di.xml

Map your payment method in Magento’s dependency injection system:

<type name="Magento\Payment\Model\Method\Factory">
    <arguments>
        <argument name="methods" xsi:type="array">
            <item name="custompayment" xsi:type="string">Vendor\CustomPayment\Model\PaymentMethod</item>
        </argument>
    </arguments>
</type>

Try It Now

✅ Register the Module

\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'Vendor_CustomPayment',
    __DIR__
);

Try It Now

🚀 Final Steps

  1. Run php bin/magento setup:upgrade
  2. Run php bin/magento cache:flush
  3. Enable the payment method in Stores → Configuration → Sales → Payment Methods

📌 Summary

  • You now have a working custom payment method
  • This can be extended to include API calls, custom validation, and more
  • Magento’s modular structure makes payment integration scalable

With this custom gateway, you’re in full control of your checkout process! 💰