Webkul
Services
Technologies Bagisto QloApps
iOS Android SAP BigCommerce Wix
Trusted by
Samsung Intel Toyota Walmart Disney Nokia Nestlé Decathlon
See all customers
Back to Top
DEV

Add Custom Currency to Magento 2

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

<?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