When using a default payment method on the Magento checkout, such as Braintree, you may notice the use of different credit card type icons. Going about changing credit card icons on the Magento 2 checkout can be done by following the steps within this post.

Magento by default adds a grayscale filter to the credit card icons to make them appear black and white.
.checkout-payment-method .credit-card-types img {
-webkit-filter: grayscale(100%);
-webkit-transition: all .6s ease;
}
This can be removed using LESS/CSS should you not want this effect.
The template responsible for rendering the payment icons is the cc-form.html Knockout template found within the vendor/magento/module-payment/view/frontend/web/template/payment. Note that the template path may differ if you are using a different/third party payment method that uses the same Magento payment icons.
Within this template, locate the <img> element, and you’ll notice that the src attribute contains $parent.getIcons(item.value).url,.
<!--ko if: $parent.getIcons(item.value) -->
<img data-bind="attr: {
'src': $parent.getIcons(item.value).url,
'alt': item.type,
'width': $parent.getIcons(item.value).width,
'height': $parent.getIcons(item.value).height
}">
<!--/ko-->
The getIcons() function is used within the vendor/magento/module-payment/view/frontend/web/js/view/payment/cc-form.js file.
/**
* Get payment icons
* @param {String} type
* @returns {Boolean}
*/
getIcons: function (type) {
return window.checkoutConfig.payment.ccform.icons.hasOwnProperty(type) ?
window.checkoutConfig.payment.ccform.icons[type]
: false;
},
window.checkoutConfig is defined within the vendor/magento/module-checkout/view/frontend/templates/onepage.phtml template file.
window.checkoutConfig = <?= /* @escapeNotVerified */ $block->getSerializedCheckoutConfig() ?>;
The corresponding block to the onepage.phtml file, vendor/magento/module-checkout/Block/Onepage.php contains the getSerializedCheckoutConfig() and subsequent getCheckoutConfig() methods.
<?php
namespace Magento\Checkout\Block;
class Onepage extends \Magento\Framework\View\Element\Template
{
....
/**
* Retrieve checkout configuration
*
* @return array
* @codeCoverageIgnore
*/
public function getCheckoutConfig()
{
return $this->configProvider->getConfig();
}
....
/**
* @return bool|string
* @since 100.2.0
*/
public function getSerializedCheckoutConfig()
{
return json_encode($this->getCheckoutConfig(), JSON_HEX_TAG);
}
}
Magento’s CompositeConfigProvider class contains the getConfig() method, which iterates over the configProviders and merges and returns their configuration.
<?php
namespace Magento\Checkout\Model;
/**
* Composite checkout configuration provider.
*
* @see \Magento\Checkout\Model\ConfigProviderInterface
* @api
*/
class CompositeConfigProvider implements ConfigProviderInterface
{
/**
* @var ConfigProviderInterface[]
*/
private $configProviders;
/**
* @param ConfigProviderInterface[] $configProviders
* @codeCoverageIgnore
*/
public function __construct(
array $configProviders
) {
$this->configProviders = $configProviders;
}
/**
* {@inheritdoc}
*/
public function getConfig()
{
$config = [];
foreach ($this->configProviders as $configProvider) {
$config = array_merge_recursive($config, $configProvider->getConfig());
}
return $config;
}
}
One of the configProviders includes the Magento\Payment\Model\CcConfigProvider class. This class contains the getIcons() method.
<?php
namespace Magento\Payment\Model;
use Magento\Checkout\Model\ConfigProviderInterface;
use Magento\Framework\View\Asset\Source;
/**
* Class CcConfigProvider
*
* @api
* @since 100.0.2
*/
class CcConfigProvider implements ConfigProviderInterface
{
/**
* @var array
*/
private $icons = [];
/**
* @var CcConfig
*/
protected $ccConfig;
/**
* @var \Magento\Framework\View\Asset\Source
*/
protected $assetSource;
/**
* @param CcConfig $ccConfig
* @param Source $assetSource
*/
public function __construct(
CcConfig $ccConfig,
Source $assetSource
) {
$this->ccConfig = $ccConfig;
$this->assetSource = $assetSource;
}
/**
* {@inheritdoc}
*/
public function getConfig()
{
return [
'payment' => [
'ccform' => [
'icons' => $this->getIcons()
]
]
];
}
/**
* Get icons for available payment methods
*
* @return array
*/
public function getIcons()
{
if (!empty($this->icons)) {
return $this->icons;
}
$types = $this->ccConfig->getCcAvailableTypes();
foreach (array_keys($types) as $code) {
if (!array_key_exists($code, $this->icons)) {
$asset = $this->ccConfig->createAsset('Magento_Payment::images/cc/' . strtolower($code) . '.png');
$placeholder = $this->assetSource->findSource($asset);
if ($placeholder) {
list($width, $height) = getimagesize($asset->getSourceFile());
$this->icons[$code] = [
'url' => $asset->getUrl(),
'width' => $width,
'height' => $height
];
}
}
}
return $this->icons;
}
}
Here, Magento uses the credit card type code to create an image asset using the createAsset() method.
A plugin can be used to override the images using a afterGetIcons() method.
Assuming that you have registered a custom module with a registration.php and module.xml file, add a di.xml declaring the plugin class.
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\Payment\Model\CcConfigProvider">
<plugin name="[module]_ccicons_plugin" type="[Vendor]\[Module]\Plugin\CcConfigProviderPlugin" sortOrder="1" />
</type>
</config>
Now add the plugin class, which includes the afterGetIcons() method.
In the below example, the VI credit card type’s image is modified.
<?php
namespace [Vendor]\[Module]\Plugin;
class CcConfigProviderPlugin
{
/**
* @var \Magento\Framework\View\Asset\Repository
*/
private $assetRepo;
/**
* CcConfigProviderPlugin constructor.
*
* @param \Magento\Framework\View\Asset\Repository $assetRepo
*/
public function __construct(
\Magento\Framework\View\Asset\Repository $assetRepo
)
{
$this->assetRepo = $assetRepo;
}
/**
* @param \Magento\Payment\Model\CcConfigProvider $subject
* @param $result
* @return mixed
*/
public function afterGetIcons(\Magento\Payment\Model\CcConfigProvider $subject, $result)
{
if (isset($result['VI'])) {
$result['VI']['url'] = $this->assetRepo->getUrl('[Vendor]_[Module]::images/46x30.png');
$result['VI']['width'] = 46;
$result['VI']['height'] = 30;
}
return $result;
}
}
The placeholder image is added within the custom module’s view/frontend/web/images directory.
Upon refreshing the checkout page, the placeholder image is used instead of the default Visa icon.

Note: This article is based on Magento Open Source version 2.2.