Restricts payment methods to specific customer groups in Magento 2.
Adding additional checks to payment methods – to decide if a certain payment method is applicable to a certain customer or not – is pretty easy and straight forward in Magento 2.
Magento provides a rather simplistic interface for custom payment method checks, and uses a composite check to process these individual checks. Adding a custom check is therefore just a matter of injecting it into Magento’s composite check via dependency injection.
This extension implements such a custom check to decide if a certain payment method is applicable to a customer based on the customer group, along with a corresponding system configuration field for payment methods.
Unfortunately, there’s currently a limitation in Magento’s code regarding this mechanism that requires us to use a small workaround, so this extension depends on another extension providing this workaround. See smaex/additional-payment-checks for more information.
Simply require the extension via Composer.
$ composer require smaex/customer-group-payments ^2.0
Finally, enable the module via Magento’s CLI.
$ magento module:enable Smaex_CustomerGroupPayments
While the extension provides you with all the tools you need to restrict payment methods to specific customer groups, it doesn’t do anything without some custom configuration on your part. That’s because adding system configuration fields is done via XML configuration in Magento.
To properly configure your payment methods, the best way going forward is probably to set up your own custom module (e.g., Acme_Payment
) under app/code
.
Declaring a dependency on Magento_Payment
and Smaex_CustomerGroupPayments
in your module.xml
is kinda mandatory, dependencies on other modules like Magento_OfflinePayments
depend on the payment methods actually used in your project.
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="Acme_Payment" setup_version="1.0.0">
<sequence>
<module name="Magento_OfflinePayments"/>
<module name="Magento_Payment"/>
<module name="Smaex_CustomerGroupPayments"/>
</sequence>
</module>
</config>
The next and already final step is then to provide your own system.xml
under etc/adminhtml
in your custom module and extend the existing configuration for each payment method used in your project.
<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">
<!--
Check / Money Order
-->
<group id="checkmo">
<field id="customer_groups" type="multiselect" translate="label comment" showInDefault="1" showInWebsite="1" showInStore="1" canRestore="1" sortOrder="52">
<include path="Smaex_CustomerGroupPayments::system/customer_groups.xml"/>
</field>
</group>
<!--
Cash On Delivery Payment
-->
<group id="cashondelivery">
<field id="customer_groups" type="multiselect" translate="label comment" showInDefault="1" showInWebsite="1" showInStore="1" canRestore="1" sortOrder="52">
<include path="Smaex_CustomerGroupPayments::system/customer_groups.xml"/>
</field>
</group>
</section>
</system>
</config>
If you’re a lazy sloth this looks like too much work (i.e., XML configuration), there’s also another extension tackling the same problem from a very different angle.
Wanna work for one of Germany’s leading Magento partners? With agile methods, small teams and big clients? We’re currently looking for experienced masochists PHP & Magento developers in Munich. Sounds interesting? Just drop me a line via [email protected]