💳 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>
⚙️ 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;
    }
}
🔧 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>
🛠️ 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>
✅ Register the Module
\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'Vendor_CustomPayment',
    __DIR__
);
🚀 Final Steps
- Run php bin/magento setup:upgrade
- Run php bin/magento cache:flush
- 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! 💰
