Back to Top

Add Custom Currency to Magento 2

Updated 22 February 2024

As we all know Magento 2 does not support CryptoCurrency as a currency option yet, so here we are going to learn how we can add a new currency.

The very first step to start with is to modify your module’s registration.php file

<?php

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

require_once(__DIR__ . '/Override/CurrencyBundle.php');

In the above code, we have added require_once in order to modify the available currencies

Here is the code for the CurrencyBundle.php file, keep this fine in app/code/Vendor/Module/Override/CurrencyBundle.php

<?php

namespace Magento\Framework\Locale\Bundle;

class CurrencyBundle extends DataBundle
{
    /**
     * @var string
     */
    protected $path = 'ICUDATA-curr';

    /**
     * @var string
     */
    public function toArray($bundle)
    {
        $aux = [];
        foreach ($bundle as $k => $v) {
            $aux[$k] = is_object($v) ? $this->toArray($v) : $v;
        }
        return $aux;
    }

    /**
     * Method to get currency bundle
     *
     * @param string $locale
     * @return array
     */
    public function get($locale)
    {
        $bundle = parent::get($locale);
        $bundleAsArray = $this->toArray($bundle);
        $bundleAsArray['Currencies']['BTC'] = [
            'BTC',
            'Bitcoin',
        ];
        $bundleAsArray['CurrencyPlurals']['BTC'] = [
            'one' => 'Bitcoin',
            'other' => 'Bitcoin',
        ];
        return $bundleAsArray;
    }
}

Now we will add some plugins in order to add currency and its formatting in Magento 2
Create a di.xml inside the etc folder

Searching for an experienced
Magento 2 Company ?
Find out More
<?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\Framework\Locale\Config">
        <plugin name="crypto_locale" type="Webkul\CryptoCurrency\Plugin\LocaleConfig" sortOrder="1" />
    </type>

    <type name="Magento\Framework\App\Config">
        <plugin name="crypto_config" type="Webkul\CryptoCurrency\Plugin\ConfigPlugin" sortOrder="1" />
    </type>

    <type name="Magento\Framework\Pricing\Render\Amount">
        <plugin name="crypto_framework_pricing_render_amount" type="Webkul\CryptoCurrency\Plugin\Framework\Pricing\Render\Amount" />
    </type>

    <type name="Magento\Directory\Model\PriceCurrency">
        <plugin name="crypto_directory_model_pricecurrency" type="Webkul\CryptoCurrency\Plugin\Directory\Model\PriceCurrency" />
    </type>
    
    <type name="Magento\Framework\Locale\Format">
        <plugin name="crypto_framework_locale_format" type="Webkul\CryptoCurrency\Plugin\Framework\Locale\Format" />
    </type>
</config>

Following the above we need to create 5 plugins as follows

LocaleConfig.php

<?php

namespace Webkul\CryptoCurrency\Plugin;

class LocaleConfig
{
    /**
     * After get allowed currencies
     *
     * @param \Magento\Framework\Locale\Config $config
     * @param array $currencies
     * @return array
     */
    public function afterGetAllowedCurrencies(\Magento\Framework\Locale\Config $config, $currencies)
    {
        return array_merge($currencies, ['BTC']);
    }
}

ConfigPlugin.php

<?php

namespace Webkul\CryptoCurrency\Plugin;

class ConfigPlugin
{
    /**
     * After get currency config value
     *
     * @param \Magento\Framework\App\Config\ScopeConfigInterface $subject
     * @param string $result
     * @param string $path
     * @param string $scope
     * @param string $scopeCode
     * @return string
     */
    public function afterGetValue(\Magento\Framework\App\Config\ScopeConfigInterface $subject,
        $result,
        $path = null,
        $scope = \Magento\Framework\App\Config\ScopeConfigInterface::SCOPE_TYPE_DEFAULT,
        $scopeCode = null
    )
    {
        if ($path === 'system/currency/installed') {
            return $result . ',' . 'BTC';
        }
        return $result;
    }
}

Amount.php

<?php
namespace Webkul\CryptoCurrency\Plugin\Framework\Pricing\Render;

use Magento\Framework\Pricing\PriceCurrencyInterface;

class Amount
{
  public function beforeFormatCurrency(
    $subject,
    $amount,
    $includeContainer = true,
    $precision = PriceCurrencyInterface::DEFAULT_PRECISION
  ) {
    return [$amount, $includeContainer, 4];
  }
}

PriceCurrency.php

<?php
namespace Webkul\CryptoCurrency\Plugin\Directory\Model;

class PriceCurrency
{
  public function beforeConvertAndRound(
    $subject,
    $amount,
    $scope = null,
    $currency = null,
    $precision = \Magento\Directory\Model\PriceCurrency::DEFAULT_PRECISION
  ) {
    return [$amount, $scope, $currency, 4];
  }

  public function beforeFormat(
    $subject,
    $amount,
    $includeContainer = true,
    $precision = \Magento\Directory\Model\PriceCurrency::DEFAULT_PRECISION,
    $scope = null,
    $currency = null
  ) {
    return [$amount, $includeContainer, 4, $scope, $currency];
  }
}

Format.php

<?php
namespace Webkul\CryptoCurrency\Plugin\Framework\Locale;

class Format
{
  public function afterGetPriceFormat($subject, $result) {
    $result['precision'] = 4;
    $result['requiredPrecision'] = 4;

    return $result;
  }
}

Using the above we are able to add a new currency in Magento 2

screenshot-nft2.vachak.com-2023.10.16-10_31_12

In the above example, we have added the currency in order to create a NFT Marketplace system.

. . .

Leave a Comment

Your email address will not be published. Required fields are marked*


Be the first to comment.

Back to Top

Message Sent!

If you have more details or questions, you can reply to the received confirmation email.

Back to Home