diff --git a/.travis.yml b/.travis.yml
index e7508e3..24f877f 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,12 +1,15 @@
 language: php
 
 php:
-  - 5.6
   - 7.0
   - 7.1
   - 7.2
   - 7.3
   - 7.4
+  - 8.0
+  - 8.1
+  - 8.2
+  - 8.3
 
 before_script:
   - composer install -n --dev --prefer-source
diff --git a/README.md b/README.md
index 70d3e8b..67e0956 100644
--- a/README.md
+++ b/README.md
@@ -2,16 +2,15 @@
 
 **WebMoney driver for the Omnipay PHP payment processing library**
 
-[![Build Status](https://travis-ci.org/dercoder/omnipay-webmoney.svg?branch=master)](https://travis-ci.org/dercoder/omnipay-webmoney)
+[![Build Status](https://app.travis-ci.com/dercoder/omnipay-webmoney.svg?branch=master)](https://app.travis-ci.com/github/dercoder/omnipay-webmoney)
 [![Coverage Status](https://coveralls.io/repos/dercoder/omnipay-webmoney/badge.svg?branch=master&service=github)](https://coveralls.io/github/dercoder/omnipay-webmoney?branch=master)
 
-[![Latest Stable Version](https://poser.pugx.org/dercoder/omnipay-webmoney/v/stable.png)](https://packagist.org/packages/dercoder/omnipay-webmoney)
-[![Total Downloads](https://poser.pugx.org/dercoder/omnipay-webmoney/downloads.png)](https://packagist.org/packages/dercoder/omnipay-webmoney)
-[![Latest Unstable Version](https://poser.pugx.org/dercoder/omnipay-webmoney/v/unstable.png)](https://packagist.org/packages/dercoder/omnipay-webmoney)
-[![License](https://poser.pugx.org/dercoder/omnipay-webmoney/license.png)](https://packagist.org/packages/dercoder/omnipay-webmoney)
+[![Latest Stable Version](https://img.shields.io/packagist/v/dercoder/omnipay-webmoney)](https://packagist.org/packages/dercoder/omnipay-webmoney)
+[![Total Downloads](https://img.shields.io/packagist/dt/dercoder/omnipay-webmoney)](https://packagist.org/packages/dercoder/omnipay-webmoney)
+[![License](https://img.shields.io/packagist/l/dercoder/omnipay-webmoney)](https://packagist.org/packages/dercoder/omnipay-webmoney)
 
 [Omnipay](https://github.com/omnipay/omnipay) is a framework agnostic, multi-gateway payment
-processing library for PHP 5.6+. This package implements [WebMoney](https://www.webmoney.az) support for Omnipay.
+processing library for PHP 7.0+. This package implements [WebMoney](https://www.webmoney.az) support for Omnipay.
 
 ## Installation
 
@@ -21,7 +20,7 @@ to your `composer.json` file:
 ```json
 {
     "require": {
-        "dercoder/omnipay-webmoney": "~3.0"
+        "dercoder/omnipay-webmoney": "^5.0"
     }
 }
 ```
diff --git a/composer.json b/composer.json
index 29e1b9c..eb17311 100644
--- a/composer.json
+++ b/composer.json
@@ -18,13 +18,13 @@
     }
   },
   "require": {
-    "php": "^5.6|^7",
+    "php": "^7.0|^8.0",
     "ext-simplexml": "*",
     "ext-dom": "*",
-    "omnipay/common": "^3.0"
+    "omnipay/common": "^3.2"
   },
   "require-dev": {
-    "omnipay/tests": "^3.0",
+    "omnipay/tests": "^4.1",
     "satooshi/php-coveralls": "1.0.0",
     "guzzlehttp/guzzle": "^6.5.5",
     "squizlabs/php_codesniffer": "3.*"
@@ -35,7 +35,7 @@
   },
   "extra": {
     "branch-alias": {
-      "dev-master": "3.0.x-dev"
+      "dev-master": "4.0.x-dev"
     }
   }
 }
diff --git a/phpunit.xml.dist b/phpunit.xml.dist
index 9797d8e..5692c91 100644
--- a/phpunit.xml.dist
+++ b/phpunit.xml.dist
@@ -9,6 +9,9 @@
          processIsolation="false"
          stopOnFailure="false"
          syntaxCheck="false">
+    <php>
+        <ini name="error_reporting" value="E_ALL &amp; ~E_DEPRECATED"/>
+    </php>
     <testsuites>
         <testsuite name="WebMoney Test Suite">
             <directory>./tests/</directory>
@@ -22,7 +25,4 @@
             <directory>./src</directory>
         </whitelist>
     </filter>
-    <logging>
-        <log type="coverage-clover" target="./clover.xml" />
-    </logging>
-</phpunit>
\ No newline at end of file
+</phpunit>
diff --git a/src/Message/AbstractRequest.php b/src/Message/AbstractRequest.php
index 9513b28..af2e6b2 100644
--- a/src/Message/AbstractRequest.php
+++ b/src/Message/AbstractRequest.php
@@ -154,13 +154,13 @@ public function setCancelMethod($value)
     /**
      * Redirect method conversion table.
      */
-    private static $methodsTable = array(
+    private static $methodsTable = [
         '1'    => '1',
         '2'    => '2',
         'GET'  => '0',
         'POST' => '1',
         'LINK' => '2',
-    );
+    ];
 
     /**
      * Converts redirect method to WebMoney code: 0, 1 or 2.
@@ -171,7 +171,7 @@ public function setCancelMethod($value)
      */
     public function formatMethod($method)
     {
-        $method = strtoupper((string) $method);
+        $method = strtoupper((string)$method);
         return isset(self::$methodsTable[$method]) ? self::$methodsTable[$method] : '0';
     }
 
@@ -251,8 +251,22 @@ public function getCurrencyByPurse($purse)
                 return 'BYR';
             case 'X':
                 return 'BTC';
+            case 'T':
+                return 'USDT';
             default:
                 return null;
         }
     }
+
+    public function getCurrencies()
+    {
+        if ($this->currencies === null) {
+            $this->currencies = new \Money\Currencies\AggregateCurrencies([
+                new \Money\Currencies\CryptoCurrencies(),
+                new \Money\Currencies\ISOCurrencies(),
+            ]);
+        }
+
+        return $this->currencies;
+    }
 }
diff --git a/src/Message/CompletePurchaseRequest.php b/src/Message/CompletePurchaseRequest.php
index 6abea0c..8bb81f6 100644
--- a/src/Message/CompletePurchaseRequest.php
+++ b/src/Message/CompletePurchaseRequest.php
@@ -23,35 +23,35 @@ public function getData()
             'secretKey'
         );
 
-        return array(
-            'LMI_PAYEE_PURSE' => $this->httpRequest->request->get('LMI_PAYEE_PURSE'),
-            'LMI_PAYMENT_AMOUNT' => $this->httpRequest->request->get('LMI_PAYMENT_AMOUNT'),
-            'LMI_PAYMENT_NO' => $this->httpRequest->request->get('LMI_PAYMENT_NO'),
-            'LMI_MODE' => $this->httpRequest->request->get('LMI_MODE'),
-            'LMI_SYS_INVS_NO' => $this->httpRequest->request->get('LMI_SYS_INVS_NO'),
-            'LMI_SYS_TRANS_NO' => $this->httpRequest->request->get('LMI_SYS_TRANS_NO'),
-            'LMI_PAYER_PURSE' => $this->httpRequest->request->get('LMI_PAYER_PURSE'),
-            'LMI_PAYER_WM' => $this->httpRequest->request->get('LMI_PAYER_WM'),
-            'LMI_CAPITALLER_WMID' => $this->httpRequest->request->get('LMI_CAPITALLER_WMID'),
-            'LMI_PAYMER_NUMBER' => $this->httpRequest->request->get('LMI_PAYMER_NUMBER'),
-            'LMI_PAYMER_EMAIL' => $this->httpRequest->request->get('LMI_PAYMER_EMAIL'),
-            'LMI_EURONOTE_NUMBER' => $this->httpRequest->request->get('LMI_EURONOTE_NUMBER'),
-            'LMI_EURONOTE_EMAIL' => $this->httpRequest->request->get('LMI_EURONOTE_EMAIL'),
-            'LMI_WMCHECK_NUMBER' => $this->httpRequest->request->get('LMI_WMCHECK_NUMBER'),
+        return [
+            'LMI_PAYEE_PURSE'         => $this->httpRequest->request->get('LMI_PAYEE_PURSE'),
+            'LMI_PAYMENT_AMOUNT'      => $this->httpRequest->request->get('LMI_PAYMENT_AMOUNT'),
+            'LMI_PAYMENT_NO'          => $this->httpRequest->request->get('LMI_PAYMENT_NO'),
+            'LMI_MODE'                => $this->httpRequest->request->get('LMI_MODE'),
+            'LMI_SYS_INVS_NO'         => $this->httpRequest->request->get('LMI_SYS_INVS_NO'),
+            'LMI_SYS_TRANS_NO'        => $this->httpRequest->request->get('LMI_SYS_TRANS_NO'),
+            'LMI_PAYER_PURSE'         => $this->httpRequest->request->get('LMI_PAYER_PURSE'),
+            'LMI_PAYER_WM'            => $this->httpRequest->request->get('LMI_PAYER_WM'),
+            'LMI_CAPITALLER_WMID'     => $this->httpRequest->request->get('LMI_CAPITALLER_WMID'),
+            'LMI_PAYMER_NUMBER'       => $this->httpRequest->request->get('LMI_PAYMER_NUMBER'),
+            'LMI_PAYMER_EMAIL'        => $this->httpRequest->request->get('LMI_PAYMER_EMAIL'),
+            'LMI_EURONOTE_NUMBER'     => $this->httpRequest->request->get('LMI_EURONOTE_NUMBER'),
+            'LMI_EURONOTE_EMAIL'      => $this->httpRequest->request->get('LMI_EURONOTE_EMAIL'),
+            'LMI_WMCHECK_NUMBER'      => $this->httpRequest->request->get('LMI_WMCHECK_NUMBER'),
             'LMI_TELEPAT_PHONENUMBER' => $this->httpRequest->request->get('LMI_TELEPAT_PHONENUMBER'),
-            'LMI_TELEPAT_ORDERID' => $this->httpRequest->request->get('LMI_TELEPAT_ORDERID'),
-            'LMI_PAYMENT_CREDITDAYS' => $this->httpRequest->request->get('LMI_PAYMENT_CREDITDAYS'),
-            'LMI_HASH' => $this->httpRequest->request->get('LMI_HASH'),
-            'LMI_SYS_TRANS_DATE' => $this->httpRequest->request->get('LMI_SYS_TRANS_DATE'),
-            'LMI_SECRET_KEY' => $this->httpRequest->request->get('LMI_SECRET_KEY'),
-            'LMI_SDP_TYPE' => $this->httpRequest->request->get('LMI_SDP_TYPE'),
-            'LMI_PAYMENT_DESC' => $this->httpRequest->request->get('LMI_PAYMENT_DESC'),
-            'LMI_PAYER_COUNTRYID' => $this->httpRequest->request->get('LMI_PAYER_COUNTRYID'),
-            'LMI_PAYER_PCOUNTRYID' => $this->httpRequest->request->get('LMI_PAYER_PCOUNTRYID'),
-            'LMI_PAYER_IP' => $this->httpRequest->request->get('LMI_PAYER_IP'),
-            'LMI_LANG' => $this->httpRequest->request->get('LMI_LANG'),
-            'LMI_DBLCHK' => $this->httpRequest->request->get('LMI_DBLCHK'),
-        );
+            'LMI_TELEPAT_ORDERID'     => $this->httpRequest->request->get('LMI_TELEPAT_ORDERID'),
+            'LMI_PAYMENT_CREDITDAYS'  => $this->httpRequest->request->get('LMI_PAYMENT_CREDITDAYS'),
+            'LMI_HASH'                => $this->httpRequest->request->get('LMI_HASH'),
+            'LMI_SYS_TRANS_DATE'      => $this->httpRequest->request->get('LMI_SYS_TRANS_DATE'),
+            'LMI_SECRET_KEY'          => $this->httpRequest->request->get('LMI_SECRET_KEY'),
+            'LMI_SDP_TYPE'            => $this->httpRequest->request->get('LMI_SDP_TYPE'),
+            'LMI_PAYMENT_DESC'        => $this->httpRequest->request->get('LMI_PAYMENT_DESC'),
+            'LMI_PAYER_COUNTRYID'     => $this->httpRequest->request->get('LMI_PAYER_COUNTRYID'),
+            'LMI_PAYER_PCOUNTRYID'    => $this->httpRequest->request->get('LMI_PAYER_PCOUNTRYID'),
+            'LMI_PAYER_IP'            => $this->httpRequest->request->get('LMI_PAYER_IP'),
+            'LMI_LANG'                => $this->httpRequest->request->get('LMI_LANG'),
+            'LMI_DBLCHK'              => $this->httpRequest->request->get('LMI_DBLCHK'),
+        ];
     }
 
     /**
diff --git a/src/Message/CompletePurchaseResponse.php b/src/Message/CompletePurchaseResponse.php
index fae0dbf..8e787b4 100644
--- a/src/Message/CompletePurchaseResponse.php
+++ b/src/Message/CompletePurchaseResponse.php
@@ -62,7 +62,7 @@ public function getCurrency()
 
     public function getTestMode()
     {
-        return (bool) $this->getMode();
+        return (bool)$this->getMode();
     }
 
     public function getMode()
@@ -114,18 +114,20 @@ private function calculateHash()
             throw new InvalidResponseException('Invalid signature type');
         }
 
-        return strtoupper(hash(
-            $hashType,
-            $this->data['LMI_PAYEE_PURSE'].
-            $this->data['LMI_PAYMENT_AMOUNT'].
-            $this->data['LMI_PAYMENT_NO'].
-            $this->data['LMI_MODE'].
-            $this->data['LMI_SYS_INVS_NO'].
-            $this->data['LMI_SYS_TRANS_NO'].
-            $this->data['LMI_SYS_TRANS_DATE'].
-            $this->request->getSecretkey().
-            $this->data['LMI_PAYER_PURSE'].
-            $this->data['LMI_PAYER_WM']
-        ));
+        return strtoupper(
+            hash(
+                $hashType,
+                $this->data['LMI_PAYEE_PURSE'] .
+                $this->data['LMI_PAYMENT_AMOUNT'] .
+                $this->data['LMI_PAYMENT_NO'] .
+                $this->data['LMI_MODE'] .
+                $this->data['LMI_SYS_INVS_NO'] .
+                $this->data['LMI_SYS_TRANS_NO'] .
+                $this->data['LMI_SYS_TRANS_DATE'] .
+                $this->request->getSecretkey() .
+                $this->data['LMI_PAYER_PURSE'] .
+                $this->data['LMI_PAYER_WM']
+            )
+        );
     }
 }
diff --git a/src/Message/FetchTransactionRequest.php b/src/Message/FetchTransactionRequest.php
index 74ddb37..0ef745e 100644
--- a/src/Message/FetchTransactionRequest.php
+++ b/src/Message/FetchTransactionRequest.php
@@ -70,9 +70,9 @@ protected function calculateSignature($algorithm)
     {
         return hash(
             $algorithm,
-            $this->getWebMoneyId().
-            $this->getMerchantPurse().
-            $this->getTransactionId().
+            $this->getWebMoneyId() .
+            $this->getMerchantPurse() .
+            $this->getTransactionId() .
             $this->getSecretKey()
         );
     }
diff --git a/src/Message/FetchTransactionResponse.php b/src/Message/FetchTransactionResponse.php
index 4f3c484..7d08f96 100644
--- a/src/Message/FetchTransactionResponse.php
+++ b/src/Message/FetchTransactionResponse.php
@@ -28,33 +28,33 @@ public function isSuccessful()
 
     public function getCode()
     {
-        return (int) $this->data->retval;
+        return (int)$this->data->retval;
     }
 
     public function getMessage()
     {
-        $message = (string) $this->data->retdesc;
+        $message = (string)$this->data->retdesc;
 
         return $message ? $message : null;
     }
 
     public function getTransactionReference()
     {
-        return $this->data->operation ? (string) $this->data->operation->attributes()->wmtransid : null;
+        return $this->data->operation ? (string)$this->data->operation->attributes()->wmtransid : null;
     }
 
     public function getDescription()
     {
-        return $this->data->operation ? (string) $this->data->operation->purpose : null;
+        return $this->data->operation ? (string)$this->data->operation->purpose : null;
     }
 
     public function getAmount()
     {
-        return $this->data->operation ? (string) $this->data->operation->amount : null;
+        return $this->data->operation ? (string)$this->data->operation->amount : null;
     }
 
     public function getClientIp()
     {
-        return $this->data->operation ? (string) $this->data->operation->IPAddress : null;
+        return $this->data->operation ? (string)$this->data->operation->IPAddress : null;
     }
 }
diff --git a/src/Message/PayoutRequest.php b/src/Message/PayoutRequest.php
index 32b4e76..05763a1 100644
--- a/src/Message/PayoutRequest.php
+++ b/src/Message/PayoutRequest.php
@@ -58,7 +58,7 @@ public function getRequestNumber()
     {
         $requestNumber = $this->getParameter('requestNumber');
 
-        return $requestNumber ? $requestNumber : (string) time();
+        return $requestNumber ? $requestNumber : (string)time();
     }
 
     /**
@@ -87,7 +87,7 @@ public function setRequestNumber($value)
      */
     public function getProtectionPeriod()
     {
-        return (int) $this->getParameter('protectionPeriod');
+        return (int)$this->getParameter('protectionPeriod');
     }
 
     /**
@@ -143,7 +143,7 @@ public function setProtectionCode($value)
      */
     public function getInvoiceId()
     {
-        return (int) $this->getParameter('invoiceId');
+        return (int)$this->getParameter('invoiceId');
     }
 
     /**
@@ -175,7 +175,7 @@ public function setInvoiceId($value)
      */
     public function getOnlyAuth()
     {
-        return (int) $this->getParameter('onlyAuth');
+        return (int)$this->getParameter('onlyAuth');
     }
 
     /**
@@ -279,7 +279,7 @@ public function getData()
     /**
      * @return Client
      */
-    private function getHttpClient()
+    protected function getHttpClient()
     {
         return new Client($this->endpoint);
     }
@@ -289,10 +289,10 @@ public function sendData($data)
         $client = $this->getHttpClient();
         $client->setConfig([
             Client::CURL_OPTIONS => [
-                CURLOPT_CAINFO => $this->getCertificatePath('WMUsedRootCAs.crt'),
-                CURLOPT_SSLCERT => $this->getSslFile(),
-                CURLOPT_SSLKEY => $this->getSslKey(),
-                CURLOPT_SSLVERSION => 1,
+                CURLOPT_CAINFO         => $this->getCertificatePath('WMUsedRootCAs.crt'),
+                CURLOPT_SSLCERT        => $this->getSslFile(),
+                CURLOPT_SSLKEY         => $this->getSslKey(),
+                CURLOPT_SSLVERSION     => 1,
                 CURLOPT_SSL_VERIFYHOST => 2,
                 CURLOPT_SSL_VERIFYPEER => 1,
             ],
diff --git a/src/Message/PayoutResponse.php b/src/Message/PayoutResponse.php
index fb9e094..4f8aa3f 100644
--- a/src/Message/PayoutResponse.php
+++ b/src/Message/PayoutResponse.php
@@ -28,33 +28,33 @@ public function isSuccessful()
 
     public function getCode()
     {
-        return (int) $this->data->retval;
+        return (int)$this->data->retval;
     }
 
     public function getMessage()
     {
-        $message = (string) $this->data->retdesc;
+        $message = (string)$this->data->retdesc;
 
         return $message ? $message : null;
     }
 
     public function getTransactionId()
     {
-        return $this->data->operation ? (string) $this->data->operation->tranid : null;
+        return $this->data->operation ? (string)$this->data->operation->tranid : null;
     }
 
     public function getTransactionReference()
     {
-        return $this->data->operation ? (string) $this->data->operation->attributes()->id : null;
+        return $this->data->operation ? (string)$this->data->operation->attributes()->id : null;
     }
 
     public function getDescription()
     {
-        return $this->data->operation ? (string) $this->data->operation->desc : null;
+        return $this->data->operation ? (string)$this->data->operation->desc : null;
     }
 
     public function getAmount()
     {
-        return $this->data->operation ? (string) $this->data->operation->amount : null;
+        return $this->data->operation ? (string)$this->data->operation->amount : null;
     }
 }
diff --git a/src/Message/PurchaseRequest.php b/src/Message/PurchaseRequest.php
index 4b393cb..c14acde 100644
--- a/src/Message/PurchaseRequest.php
+++ b/src/Message/PurchaseRequest.php
@@ -15,12 +15,12 @@
 class PurchaseRequest extends AbstractRequest
 {
     /**
-     * @return int
+     * @return string
      */
     public function getHold()
     {
         if ($hold = $this->getParameter('hold')) {
-            return (string) $hold;
+            return (string)$hold;
         }
 
         return '0';
@@ -36,6 +36,51 @@ public function setHold($value)
         return $this->setParameter('hold', $value);
     }
 
+    /**
+     * @return array
+     */
+    public function getCustomFields()
+    {
+        return $this->getParameter('customFields') ?? [];
+    }
+
+    /**
+     * @param array $fields
+     *
+     * @return $this
+     * @throws \Exception
+     */
+    public function setCustomFields(array $fields)
+    {
+        $customFields = [];
+        foreach ($fields as $field => $value) {
+            if (is_numeric($field)) {
+                $field++;
+                $field = "FIELD_$field";
+            }
+
+            $field = strtoupper($field);
+
+            if (substr($field, 0, 1) === '_') {
+                throw new \Exception('"_" prefix is not allowed for custom fields');
+            }
+
+            if (substr($field, 0, 4) === 'LMI_') {
+                throw new \Exception('"LMI_" prefix is not allowed for custom fields');
+            }
+
+            if (!is_scalar($value)) {
+                throw new \Exception('Value must be a scalar');
+            }
+
+            $customFields[$field] = (string)$value;
+        }
+
+        $this->setParameter('customFields', $customFields);
+
+        return $this;
+    }
+
     /**
      * @return array
      * @throws InvalidRequestException
@@ -57,7 +102,7 @@ public function getData()
             throw new InvalidRequestException('Invalid currency for this merchant purse');
         }
 
-        return array(
+        $data = [
             'LMI_PAYEE_PURSE'         => $this->getMerchantPurse(),
             'LMI_PAYMENT_AMOUNT'      => $this->getAmount(),
             'LMI_PAYMENT_NO'          => $this->getTransactionId(),
@@ -68,8 +113,16 @@ public function getData()
             'LMI_SUCCESS_METHOD'      => $this->getReturnMethod(),
             'LMI_FAIL_URL'            => $this->getCancelUrl(),
             'LMI_FAIL_METHOD'         => $this->getCancelMethod(),
-            'LMI_HOLD'                => $this->getHold()
-        );
+            'LMI_HOLD'                => $this->getHold(),
+        ];
+
+        foreach ($this->getCustomFields() as $variable => $value) {
+            if (!isset($data[$variable])) {
+                $data[$variable] = $value;
+            }
+        }
+
+        return $data;
     }
 
     /**
diff --git a/tests/GatewayTest.php b/tests/GatewayTest.php
index 47785e5..ed5937a 100644
--- a/tests/GatewayTest.php
+++ b/tests/GatewayTest.php
@@ -9,7 +9,7 @@ class GatewayTest extends GatewayTestCase
     public $sslFile;
     public $sslKey;
 
-    public function setUp()
+    public function setUp(): void
     {
         parent::setUp();
 
diff --git a/tests/Message/CompletePurchaseRequestTest.php b/tests/Message/CompletePurchaseRequestTest.php
index 45469be..83b8423 100644
--- a/tests/Message/CompletePurchaseRequestTest.php
+++ b/tests/Message/CompletePurchaseRequestTest.php
@@ -1,4 +1,5 @@
 <?php
+
 namespace Omnipay\WebMoney\Message;
 
 use Omnipay\Tests\TestCase;
@@ -8,34 +9,34 @@ class CompletePurchaseRequestTest extends TestCase
 {
     private $request;
 
-    public function setUp()
+    public function setUp(): void
     {
         parent::setUp();
 
-        $httpRequest = new HttpRequest(array(), array (
-            'LMI_MODE' => '1',
-            'LMI_PAYMENT_AMOUNT' => '14.65',
-            'LMI_PAYEE_PURSE' => 'Z123428476799',
-            'LMI_PAYMENT_NO' => '1444212666',
-            'LMI_PAYER_WM' => '404521188333',
-            'LMI_PAYER_PURSE' => 'Z366393600555',
+        $httpRequest = new HttpRequest([], [
+            'LMI_MODE'            => '1',
+            'LMI_PAYMENT_AMOUNT'  => '14.65',
+            'LMI_PAYEE_PURSE'     => 'Z123428476799',
+            'LMI_PAYMENT_NO'      => '1444212666',
+            'LMI_PAYER_WM'        => '404521188333',
+            'LMI_PAYER_PURSE'     => 'Z366393600555',
             'LMI_PAYER_COUNTRYID' => 'AZ',
-            'LMI_PAYER_IP' => '127.0.0.1',
-            'LMI_SYS_INVS_NO' => '897',
-            'LMI_SYS_TRANS_NO' => '892',
-            'LMI_SYS_TRANS_DATE' => '20151007 13:07:36',
-            'LMI_HASH' => '0B12E75431284D6FCC05D8AF02B90AC28A0788FB95C9FF6B655344022F0746E5',
-            'LMI_PAYMENT_DESC' => 'Test',
-            'LMI_LANG' => 'en-US',
-            'LMI_DBLCHK' => 'SMS'
-        ));
+            'LMI_PAYER_IP'        => '127.0.0.1',
+            'LMI_SYS_INVS_NO'     => '897',
+            'LMI_SYS_TRANS_NO'    => '892',
+            'LMI_SYS_TRANS_DATE'  => '20151007 13:07:36',
+            'LMI_HASH'            => '0B12E75431284D6FCC05D8AF02B90AC28A0788FB95C9FF6B655344022F0746E5',
+            'LMI_PAYMENT_DESC'    => 'Test',
+            'LMI_LANG'            => 'en-US',
+            'LMI_DBLCHK'          => 'SMS',
+        ]);
 
         $this->request = new CompletePurchaseRequest($this->getHttpClient(), $httpRequest);
-        $this->request->initialize(array(
+        $this->request->initialize([
             'merchantPurse' => 'Z123428476799',
-            'secretKey' => '226778888',
-            'testMode' => true
-        ));
+            'secretKey'     => '226778888',
+            'testMode'      => true,
+        ]);
     }
 
     public function testGetData()
diff --git a/tests/Message/CompletePurchaseResponseTest.php b/tests/Message/CompletePurchaseResponseTest.php
index 989547b..74d5f3b 100644
--- a/tests/Message/CompletePurchaseResponseTest.php
+++ b/tests/Message/CompletePurchaseResponseTest.php
@@ -1,4 +1,5 @@
 <?php
+
 namespace Omnipay\WebMoney\Message;
 
 use Omnipay\Tests\TestCase;
@@ -8,83 +9,83 @@ class CompletePurchaseResponseTest extends TestCase
 {
     private $request;
 
-    public function setUp()
+    public function setUp(): void
     {
         parent::setUp();
 
         $this->request = new CompletePurchaseRequest($this->getHttpClient(), $this->getHttpRequest());
-        $this->request->initialize(array(
+        $this->request->initialize([
             'merchantPurse' => 'Z123428476799',
-            'secretKey' => '226778888',
-            'testMode' => true
-        ));
+            'secretKey'     => '226778888',
+            'testMode'      => true,
+        ]);
     }
 
     public function testSignHashException()
     {
         $this->expectException(InvalidResponseException::class);
         $this->expectExceptionMessage('Invalid hash');
-        new CompletePurchaseResponse($this->request, array(
-            'LMI_MODE' => '1',
-            'LMI_PAYMENT_AMOUNT' => '14.65',
-            'LMI_PAYEE_PURSE' => 'Z123428476799',
-            'LMI_PAYMENT_NO' => '1444212666',
-            'LMI_PAYER_WM' => '404521188333',
-            'LMI_PAYER_PURSE' => 'Z366393600555',
+        new CompletePurchaseResponse($this->request, [
+            'LMI_MODE'            => '1',
+            'LMI_PAYMENT_AMOUNT'  => '14.65',
+            'LMI_PAYEE_PURSE'     => 'Z123428476799',
+            'LMI_PAYMENT_NO'      => '1444212666',
+            'LMI_PAYER_WM'        => '404521188333',
+            'LMI_PAYER_PURSE'     => 'Z366393600555',
             'LMI_PAYER_COUNTRYID' => 'AZ',
-            'LMI_PAYER_IP' => '127.0.0.1',
-            'LMI_SYS_INVS_NO' => '897',
-            'LMI_SYS_TRANS_NO' => '892',
-            'LMI_SYS_TRANS_DATE' => '20151007 13:07:36',
-            'LMI_HASH' => '0B12E75431284D6FCC05D8AF02B90AC28A0788FB95C9FF6B655344022F0746E1',
-            'LMI_PAYMENT_DESC' => 'Test',
-            'LMI_LANG' => 'en-US',
-            'LMI_DBLCHK' => 'SMS'
-        ));
+            'LMI_PAYER_IP'        => '127.0.0.1',
+            'LMI_SYS_INVS_NO'     => '897',
+            'LMI_SYS_TRANS_NO'    => '892',
+            'LMI_SYS_TRANS_DATE'  => '20151007 13:07:36',
+            'LMI_HASH'            => '0B12E75431284D6FCC05D8AF02B90AC28A0788FB95C9FF6B655344022F0746E1',
+            'LMI_PAYMENT_DESC'    => 'Test',
+            'LMI_LANG'            => 'en-US',
+            'LMI_DBLCHK'          => 'SMS',
+        ]);
     }
 
     public function testInvalidTestModeException()
     {
         $this->expectException(InvalidResponseException::class);
         $this->expectExceptionMessage('Invalid test mode');
-        new CompletePurchaseResponse($this->request, array(
-            'LMI_MODE' => '0',
-            'LMI_PAYMENT_AMOUNT' => '14.65',
-            'LMI_PAYEE_PURSE' => 'Z123428476799',
-            'LMI_PAYMENT_NO' => '1444212666',
-            'LMI_PAYER_WM' => '404521188333',
-            'LMI_PAYER_PURSE' => 'Z366393600555',
+        new CompletePurchaseResponse($this->request, [
+            'LMI_MODE'            => '0',
+            'LMI_PAYMENT_AMOUNT'  => '14.65',
+            'LMI_PAYEE_PURSE'     => 'Z123428476799',
+            'LMI_PAYMENT_NO'      => '1444212666',
+            'LMI_PAYER_WM'        => '404521188333',
+            'LMI_PAYER_PURSE'     => 'Z366393600555',
             'LMI_PAYER_COUNTRYID' => 'AZ',
-            'LMI_PAYER_IP' => '127.0.0.1',
-            'LMI_SYS_INVS_NO' => '897',
-            'LMI_SYS_TRANS_NO' => '892',
-            'LMI_SYS_TRANS_DATE' => '20151007 13:07:36',
-            'LMI_HASH' => '4F7D9FD1177DFDAE182F0E470296080DC47A843A32826147555F5C8959E7F6DD',
-            'LMI_PAYMENT_DESC' => 'Test',
-            'LMI_LANG' => 'en-US',
-            'LMI_DBLCHK' => 'SMS'
-        ));
+            'LMI_PAYER_IP'        => '127.0.0.1',
+            'LMI_SYS_INVS_NO'     => '897',
+            'LMI_SYS_TRANS_NO'    => '892',
+            'LMI_SYS_TRANS_DATE'  => '20151007 13:07:36',
+            'LMI_HASH'            => '4F7D9FD1177DFDAE182F0E470296080DC47A843A32826147555F5C8959E7F6DD',
+            'LMI_PAYMENT_DESC'    => 'Test',
+            'LMI_LANG'            => 'en-US',
+            'LMI_DBLCHK'          => 'SMS',
+        ]);
     }
 
     public function testSuccess()
     {
-        $response = new CompletePurchaseResponse($this->request, array(
-            'LMI_MODE' => '1',
-            'LMI_PAYMENT_AMOUNT' => '14.65',
-            'LMI_PAYEE_PURSE' => 'Z123428476799',
-            'LMI_PAYMENT_NO' => '1444212666',
-            'LMI_PAYER_WM' => '404521188333',
-            'LMI_PAYER_PURSE' => 'Z366393600555',
+        $response = new CompletePurchaseResponse($this->request, [
+            'LMI_MODE'            => '1',
+            'LMI_PAYMENT_AMOUNT'  => '14.65',
+            'LMI_PAYEE_PURSE'     => 'Z123428476799',
+            'LMI_PAYMENT_NO'      => '1444212666',
+            'LMI_PAYER_WM'        => '404521188333',
+            'LMI_PAYER_PURSE'     => 'Z366393600555',
             'LMI_PAYER_COUNTRYID' => 'AZ',
-            'LMI_PAYER_IP' => '127.0.0.1',
-            'LMI_SYS_INVS_NO' => '897',
-            'LMI_SYS_TRANS_NO' => '892',
-            'LMI_SYS_TRANS_DATE' => '20151007 13:07:36',
-            'LMI_HASH' => '0B12E75431284D6FCC05D8AF02B90AC28A0788FB95C9FF6B655344022F0746E5',
-            'LMI_PAYMENT_DESC' => 'Test',
-            'LMI_LANG' => 'en-US',
-            'LMI_DBLCHK' => 'SMS'
-        ));
+            'LMI_PAYER_IP'        => '127.0.0.1',
+            'LMI_SYS_INVS_NO'     => '897',
+            'LMI_SYS_TRANS_NO'    => '892',
+            'LMI_SYS_TRANS_DATE'  => '20151007 13:07:36',
+            'LMI_HASH'            => '0B12E75431284D6FCC05D8AF02B90AC28A0788FB95C9FF6B655344022F0746E5',
+            'LMI_PAYMENT_DESC'    => 'Test',
+            'LMI_LANG'            => 'en-US',
+            'LMI_DBLCHK'          => 'SMS',
+        ]);
 
         $this->assertTrue($response->isSuccessful());
         $this->assertNull($response->getCode());
@@ -101,23 +102,23 @@ public function testSuccess()
 
     public function testSha256Hash()
     {
-        $response = new CompletePurchaseResponse($this->request, array(
-            'LMI_MODE' => '1',
-            'LMI_PAYMENT_AMOUNT' => '14.65',
-            'LMI_PAYEE_PURSE' => 'Z123428476799',
-            'LMI_PAYMENT_NO' => '1444212666',
-            'LMI_PAYER_WM' => '404521188333',
-            'LMI_PAYER_PURSE' => 'Z366393600555',
+        $response = new CompletePurchaseResponse($this->request, [
+            'LMI_MODE'            => '1',
+            'LMI_PAYMENT_AMOUNT'  => '14.65',
+            'LMI_PAYEE_PURSE'     => 'Z123428476799',
+            'LMI_PAYMENT_NO'      => '1444212666',
+            'LMI_PAYER_WM'        => '404521188333',
+            'LMI_PAYER_PURSE'     => 'Z366393600555',
             'LMI_PAYER_COUNTRYID' => 'AZ',
-            'LMI_PAYER_IP' => '127.0.0.1',
-            'LMI_SYS_INVS_NO' => '897',
-            'LMI_SYS_TRANS_NO' => '892',
-            'LMI_SYS_TRANS_DATE' => '20151007 13:07:36',
-            'LMI_HASH' => '0B12E75431284D6FCC05D8AF02B90AC28A0788FB95C9FF6B655344022F0746E5',
-            'LMI_PAYMENT_DESC' => 'Test',
-            'LMI_LANG' => 'en-US',
-            'LMI_DBLCHK' => 'SMS'
-        ));
+            'LMI_PAYER_IP'        => '127.0.0.1',
+            'LMI_SYS_INVS_NO'     => '897',
+            'LMI_SYS_TRANS_NO'    => '892',
+            'LMI_SYS_TRANS_DATE'  => '20151007 13:07:36',
+            'LMI_HASH'            => '0B12E75431284D6FCC05D8AF02B90AC28A0788FB95C9FF6B655344022F0746E5',
+            'LMI_PAYMENT_DESC'    => 'Test',
+            'LMI_LANG'            => 'en-US',
+            'LMI_DBLCHK'          => 'SMS',
+        ]);
 
         $this->assertTrue($response->isSuccessful());
         $this->assertNull($response->getCode());
@@ -135,23 +136,23 @@ public function testSha256Hash()
 
     public function testMd5Hash()
     {
-        $response = new CompletePurchaseResponse($this->request, array(
-            'LMI_MODE' => '1',
-            'LMI_PAYMENT_AMOUNT' => '14.65',
-            'LMI_PAYEE_PURSE' => 'Z123428476799',
-            'LMI_PAYMENT_NO' => '1444212666',
-            'LMI_PAYER_WM' => '404521188333',
-            'LMI_PAYER_PURSE' => 'Z366393600555',
+        $response = new CompletePurchaseResponse($this->request, [
+            'LMI_MODE'            => '1',
+            'LMI_PAYMENT_AMOUNT'  => '14.65',
+            'LMI_PAYEE_PURSE'     => 'Z123428476799',
+            'LMI_PAYMENT_NO'      => '1444212666',
+            'LMI_PAYER_WM'        => '404521188333',
+            'LMI_PAYER_PURSE'     => 'Z366393600555',
             'LMI_PAYER_COUNTRYID' => 'AZ',
-            'LMI_PAYER_IP' => '127.0.0.1',
-            'LMI_SYS_INVS_NO' => '897',
-            'LMI_SYS_TRANS_NO' => '892',
-            'LMI_SYS_TRANS_DATE' => '20151007 13:07:36',
-            'LMI_HASH' => '1D3FFAFA982B134479C4AD1AE2CABB5C',
-            'LMI_PAYMENT_DESC' => 'Test',
-            'LMI_LANG' => 'en-US',
-            'LMI_DBLCHK' => 'SMS'
-        ));
+            'LMI_PAYER_IP'        => '127.0.0.1',
+            'LMI_SYS_INVS_NO'     => '897',
+            'LMI_SYS_TRANS_NO'    => '892',
+            'LMI_SYS_TRANS_DATE'  => '20151007 13:07:36',
+            'LMI_HASH'            => '1D3FFAFA982B134479C4AD1AE2CABB5C',
+            'LMI_PAYMENT_DESC'    => 'Test',
+            'LMI_LANG'            => 'en-US',
+            'LMI_DBLCHK'          => 'SMS',
+        ]);
 
         $this->assertTrue($response->isSuccessful());
         $this->assertNull($response->getCode());
@@ -171,45 +172,45 @@ public function testInvalidHashTypeException()
     {
         $this->expectException(InvalidResponseException::class);
         $this->expectExceptionMessage('Control sign forming method "SIGN" is not supported');
-        new CompletePurchaseResponse($this->request, array(
-            'LMI_MODE' => '1',
-            'LMI_PAYMENT_AMOUNT' => '14.65',
-            'LMI_PAYEE_PURSE' => 'Z123428476799',
-            'LMI_PAYMENT_NO' => '1444212666',
-            'LMI_PAYER_WM' => '404521188333',
-            'LMI_PAYER_PURSE' => 'Z366393600555',
+        new CompletePurchaseResponse($this->request, [
+            'LMI_MODE'            => '1',
+            'LMI_PAYMENT_AMOUNT'  => '14.65',
+            'LMI_PAYEE_PURSE'     => 'Z123428476799',
+            'LMI_PAYMENT_NO'      => '1444212666',
+            'LMI_PAYER_WM'        => '404521188333',
+            'LMI_PAYER_PURSE'     => 'Z366393600555',
             'LMI_PAYER_COUNTRYID' => 'AZ',
-            'LMI_PAYER_IP' => '127.0.0.1',
-            'LMI_SYS_INVS_NO' => '897',
-            'LMI_SYS_TRANS_NO' => '892',
-            'LMI_SYS_TRANS_DATE' => '20151007 13:07:36',
-            'LMI_HASH' => '2E2A8871CBB577DE4AB3E47EBFA100EB8AD9C7AF6FB5580169B8273409863941BDA16647D2D2619D8FFF946D319FE35D758844214B02F46CBA7AE35AFE3F86940069',
-            'LMI_PAYMENT_DESC' => 'Test',
-            'LMI_LANG' => 'en-US',
-            'LMI_DBLCHK' => 'SMS'
-        ));
+            'LMI_PAYER_IP'        => '127.0.0.1',
+            'LMI_SYS_INVS_NO'     => '897',
+            'LMI_SYS_TRANS_NO'    => '892',
+            'LMI_SYS_TRANS_DATE'  => '20151007 13:07:36',
+            'LMI_HASH'            => '2E2A8871CBB577DE4AB3E47EBFA100EB8AD9C7AF6FB5580169B8273409863941BDA16647D2D2619D8FFF946D319FE35D758844214B02F46CBA7AE35AFE3F86940069',
+            'LMI_PAYMENT_DESC'    => 'Test',
+            'LMI_LANG'            => 'en-US',
+            'LMI_DBLCHK'          => 'SMS',
+        ]);
     }
 
     public function testInvalidSignatureTypeException()
     {
         $this->expectException(InvalidResponseException::class);
         $this->expectExceptionMessage('Invalid signature type');
-        new CompletePurchaseResponse($this->request, array(
-            'LMI_MODE' => '1',
-            'LMI_PAYMENT_AMOUNT' => '14.65',
-            'LMI_PAYEE_PURSE' => 'Z123428476799',
-            'LMI_PAYMENT_NO' => '1444212666',
-            'LMI_PAYER_WM' => '404521188333',
-            'LMI_PAYER_PURSE' => 'Z366393600555',
+        new CompletePurchaseResponse($this->request, [
+            'LMI_MODE'            => '1',
+            'LMI_PAYMENT_AMOUNT'  => '14.65',
+            'LMI_PAYEE_PURSE'     => 'Z123428476799',
+            'LMI_PAYMENT_NO'      => '1444212666',
+            'LMI_PAYER_WM'        => '404521188333',
+            'LMI_PAYER_PURSE'     => 'Z366393600555',
             'LMI_PAYER_COUNTRYID' => 'AZ',
-            'LMI_PAYER_IP' => '127.0.0.1',
-            'LMI_SYS_INVS_NO' => '897',
-            'LMI_SYS_TRANS_NO' => '892',
-            'LMI_SYS_TRANS_DATE' => '20151007 13:07:36',
-            'LMI_HASH' => 'ABD',
-            'LMI_PAYMENT_DESC' => 'Test',
-            'LMI_LANG' => 'en-US',
-            'LMI_DBLCHK' => 'SMS'
-        ));
+            'LMI_PAYER_IP'        => '127.0.0.1',
+            'LMI_SYS_INVS_NO'     => '897',
+            'LMI_SYS_TRANS_NO'    => '892',
+            'LMI_SYS_TRANS_DATE'  => '20151007 13:07:36',
+            'LMI_HASH'            => 'ABD',
+            'LMI_PAYMENT_DESC'    => 'Test',
+            'LMI_LANG'            => 'en-US',
+            'LMI_DBLCHK'          => 'SMS',
+        ]);
     }
 }
diff --git a/tests/Message/FetchTransactionRequestTest.php b/tests/Message/FetchTransactionRequestTest.php
index 09ab06d..e5c3f36 100644
--- a/tests/Message/FetchTransactionRequestTest.php
+++ b/tests/Message/FetchTransactionRequestTest.php
@@ -1,4 +1,5 @@
 <?php
+
 namespace Omnipay\WebMoney\Message;
 
 use Omnipay\Tests\TestCase;
@@ -7,7 +8,7 @@ class FetchTransactionRequestTest extends TestCase
 {
     private $request;
 
-    public function setUp()
+    public function setUp(): void
     {
         parent::setUp();
 
@@ -18,12 +19,12 @@ public function setUp()
         $httpClient = $this->getHttpClient();
 
         $this->request = new FetchTransactionRequest($httpClient, $this->getHttpRequest());
-        $this->request->initialize(array(
-            'webMoneyId' => '811333344777',
+        $this->request->initialize([
+            'webMoneyId'    => '811333344777',
             'merchantPurse' => 'Z123428476799',
-            'secretKey' => '226778888',
-            'transactionId' => '1444212666'
-        ));
+            'secretKey'     => '226778888',
+            'transactionId' => '1444212666',
+        ]);
     }
 
     public function testGetData()
@@ -31,11 +32,11 @@ public function testGetData()
         $data = $this->request->getData();
         $request = new \SimpleXMLElement($data);
 
-        $this->assertSame('811333344777', (string) $request->wmid);
-        $this->assertSame('Z123428476799', (string) $request->lmi_payee_purse);
-        $this->assertSame('1444212666', (string) $request->lmi_payment_no);
-        $this->assertSame('0b1fbe2eaccf29e86e144c486b2ccf258b56fb54c295f195af7a749f6f5c79d4', (string) $request->sha256);
-        $this->assertSame('edd00dcbfed2c3846393e9ce315b3af2', (string) $request->md5);
+        $this->assertSame('811333344777', (string)$request->wmid);
+        $this->assertSame('Z123428476799', (string)$request->lmi_payee_purse);
+        $this->assertSame('1444212666', (string)$request->lmi_payment_no);
+        $this->assertSame('0b1fbe2eaccf29e86e144c486b2ccf258b56fb54c295f195af7a749f6f5c79d4', (string)$request->sha256);
+        $this->assertSame('edd00dcbfed2c3846393e9ce315b3af2', (string)$request->md5);
     }
 
     public function testSendData()
diff --git a/tests/Message/FetchTransactionResponseTest.php b/tests/Message/FetchTransactionResponseTest.php
index 340e929..2d1449b 100644
--- a/tests/Message/FetchTransactionResponseTest.php
+++ b/tests/Message/FetchTransactionResponseTest.php
@@ -1,4 +1,5 @@
 <?php
+
 namespace Omnipay\WebMoney\Message;
 
 use Omnipay\Tests\TestCase;
@@ -8,17 +9,17 @@ class FetchTransactionResponseTest extends TestCase
 
     private $request;
 
-    public function setUp()
+    public function setUp(): void
     {
         parent::setUp();
 
         $this->request = new FetchTransactionRequest($this->getHttpClient(), $this->getHttpRequest());
-        $this->request->initialize(array(
+        $this->request->initialize([
             'webMoneyId' => '811333344777',
             'merchantPurse' => 'Z123428476799',
             'secretKey' => '226778888',
-            'transactionId' => '1444212666'
-        ));
+            'transactionId' => '1444212666',
+        ]);
     }
 
     public function testFailure()
@@ -29,7 +30,10 @@ public function testFailure()
 
         $this->assertFalse($response->isSuccessful());
         $this->assertSame(7, $response->getCode());
-        $this->assertSame('Payment with lmi_payment_no number not found for this merchant purse:7 step=50', $response->getMessage());
+        $this->assertSame(
+            'Payment with lmi_payment_no number not found for this merchant purse:7 step=50',
+            $response->getMessage()
+        );
         $this->assertNull($response->getTransactionReference());
         $this->assertNull($response->getDescription());
         $this->assertNull($response->getAmount());
diff --git a/tests/Message/PayoutRequestTest.php b/tests/Message/PayoutRequestTest.php
index b858a38..d81324d 100644
--- a/tests/Message/PayoutRequestTest.php
+++ b/tests/Message/PayoutRequestTest.php
@@ -1,4 +1,5 @@
 <?php
+
 namespace Omnipay\WebMoney\Message;
 
 use Guzzle\Http\Client;
@@ -11,7 +12,7 @@ class PayoutRequestTest extends TestCase
 {
     private $request;
 
-    public function setUp()
+    public function setUp(): void
     {
         parent::setUp();
 
@@ -27,27 +28,28 @@ public function setUp()
         $httpClient->addSubscriber($mockPlugin);
 
         $this->request = $this->getMockBuilder(PayoutRequest::class)
-                     ->setMethods(['getHttpClient'])
-                     ->setConstructorArgs([$this->getHttpClient(), $this->getHttpRequest()])
-                     ->getMock();
+            ->onlyMethods(['getHttpClient'])
+            ->setConstructorArgs([$this->getHttpClient(), $this->getHttpRequest()])
+            ->getMock();
+
         $this->request->method('getHttpClient')->willReturn($httpClient);
         $this->request->initialize([
-            'webMoneyId' => '811333344777',
-            'merchantPurse' => 'Z123428476799',
-            'secretKey' => '226778888',
-            'sslFile' => $sslFile,
-            'sslKey' => $sslKey,
-            'transactionId' => '1444111666',
-            'requestNumber' => '111222333',
-            'customerPurse' => 'Z123428476700',
-            'protectionPeriod' => '60',
-            'protectionCode' => 'xyZ123',
-            'invoiceId' => '12345678',
-            'onlyAuth' => false,
-            'description' => 'Payout',
-            'currency' => 'USD',
-            'amount' => '12.46'
-        ]
+                'webMoneyId'       => '811333344777',
+                'merchantPurse'    => 'Z123428476799',
+                'secretKey'        => '226778888',
+                'sslFile'          => $sslFile,
+                'sslKey'           => $sslKey,
+                'transactionId'    => '1444111666',
+                'requestNumber'    => '111222333',
+                'customerPurse'    => 'Z123428476700',
+                'protectionPeriod' => '60',
+                'protectionCode'   => 'xyZ123',
+                'invoiceId'        => '12345678',
+                'onlyAuth'         => false,
+                'description'      => 'Payout',
+                'currency'         => 'USD',
+                'amount'           => '12.46',
+            ]
         );
     }
 
@@ -67,17 +69,17 @@ public function testGetData()
         $data = $this->request->getData();
         $request = new SimpleXMLElement($data);
 
-        $this->assertSame('111222333', (string) $request->reqn);
-        $this->assertSame('', (string) $request->wmid);
-        $this->assertSame('', (string) $request->sign);
-        $this->assertSame('1444111666', (string) $request->trans->tranid);
-        $this->assertSame('Z123428476799', (string) $request->trans->pursesrc);
-        $this->assertSame('Z123428476700', (string) $request->trans->pursedest);
-        $this->assertSame('12.46', (string) $request->trans->amount);
-        $this->assertSame('60', (string) $request->trans->period);
-        $this->assertSame('xyZ123', (string) $request->trans->pcode);
-        $this->assertSame('Payout', (string) $request->trans->desc);
-        $this->assertSame('12345678', (string) $request->trans->wminvid);
-        $this->assertSame('0', (string) $request->trans->onlyauth);
+        $this->assertSame('111222333', (string)$request->reqn);
+        $this->assertSame('', (string)$request->wmid);
+        $this->assertSame('', (string)$request->sign);
+        $this->assertSame('1444111666', (string)$request->trans->tranid);
+        $this->assertSame('Z123428476799', (string)$request->trans->pursesrc);
+        $this->assertSame('Z123428476700', (string)$request->trans->pursedest);
+        $this->assertSame('12.46', (string)$request->trans->amount);
+        $this->assertSame('60', (string)$request->trans->period);
+        $this->assertSame('xyZ123', (string)$request->trans->pcode);
+        $this->assertSame('Payout', (string)$request->trans->desc);
+        $this->assertSame('12345678', (string)$request->trans->wminvid);
+        $this->assertSame('0', (string)$request->trans->onlyauth);
     }
 }
diff --git a/tests/Message/PayoutResponseTest.php b/tests/Message/PayoutResponseTest.php
index 7a6bc32..308cf8e 100644
--- a/tests/Message/PayoutResponseTest.php
+++ b/tests/Message/PayoutResponseTest.php
@@ -1,4 +1,5 @@
 <?php
+
 namespace Omnipay\WebMoney\Message;
 
 use Omnipay\Tests\TestCase;
@@ -8,7 +9,7 @@ class PayoutResponseTest extends TestCase
 
     private $request;
 
-    public function setUp()
+    public function setUp(): void
     {
         parent::setUp();
 
@@ -18,22 +19,22 @@ public function setUp()
         $sslKey = realpath($directory . '/../Certificate/webmoney.key');
 
         $this->request = new PayoutRequest($this->getHttpClient(), $this->getHttpRequest());
-        $this->request->initialize(array(
-            'webMoneyId' => '811333344777',
-            'merchantPurse' => 'Z123428476799',
-            'secretKey' => '226778888',
-            'sslFile' => $sslFile,
-            'sslKey' => $sslKey,
-            'transactionId' => '1444111666',
-            'requestNumber' => '111222333',
-            'customerPurse' => 'Z123428476700',
+        $this->request->initialize([
+            'webMoneyId'       => '811333344777',
+            'merchantPurse'    => 'Z123428476799',
+            'secretKey'        => '226778888',
+            'sslFile'          => $sslFile,
+            'sslKey'           => $sslKey,
+            'transactionId'    => '1444111666',
+            'requestNumber'    => '111222333',
+            'customerPurse'    => 'Z123428476700',
             'protectionPeriod' => '60',
-            'protectionCode' => 'xyZ123',
-            'invoiceId' => '12345678',
-            'onlyAuth' => false,
-            'description' => 'Payout',
-            'amount' => '12.46'
-        ));
+            'protectionCode'   => 'xyZ123',
+            'invoiceId'        => '12345678',
+            'onlyAuth'         => false,
+            'description'      => 'Payout',
+            'amount'           => '12.46',
+        ]);
     }
 
     public function testFailure()
diff --git a/tests/Message/PurchaseRequestTest.php b/tests/Message/PurchaseRequestTest.php
index ca367b7..97e7bab 100644
--- a/tests/Message/PurchaseRequestTest.php
+++ b/tests/Message/PurchaseRequestTest.php
@@ -1,4 +1,5 @@
 <?php
+
 namespace Omnipay\WebMoney\Message;
 
 use Exception;
@@ -8,25 +9,32 @@ class PurchaseRequestTest extends TestCase
 {
     private $request;
 
-    public function setUp()
+    public function setUp(): void
     {
         parent::setUp();
 
         $this->request = new PurchaseRequest($this->getHttpClient(), $this->getHttpRequest());
-        $this->request->initialize(array(
+        $this->request->initialize([
             'merchantPurse' => 'Z123428476799',
-            'secretKey' => '226778888',
-            'returnUrl' => 'https://www.foodstore.com/success',
-            'cancelUrl' => 'https://www.foodstore.com/failure',
-            'notifyUrl' => 'https://www.foodstore.com/notify',
-            'returnMethod' => 'POST',
-            'cancelMethod' => 'link',
-            'description' => 'Test Transaction',
+            'secretKey'     => '226778888',
+            'returnUrl'     => 'https://www.foodstore.com/success',
+            'cancelUrl'     => 'https://www.foodstore.com/failure',
+            'notifyUrl'     => 'https://www.foodstore.com/notify',
+            'returnMethod'  => 'POST',
+            'cancelMethod'  => 'link',
+            'description'   => 'Test Transaction',
             'transactionId' => '1234567890',
-            'amount' => '14.65',
-            'currency' => 'USD',
-            'testMode' => true
-        ));
+            'amount'        => '14.65',
+            'currency'      => 'USD',
+            'testMode'      => true,
+            'customFields'  => [
+                'customerId' => 123,
+                'first_name' => 'John',
+                'last_name'  => 'Doe',
+                'No-Key',
+                '1'          => 'Numeric-Key',
+            ],
+        ]);
     }
 
     public function testException()
@@ -55,6 +63,11 @@ public function testGetData()
         $this->assertSame('https://www.foodstore.com/failure', $data['LMI_FAIL_URL']);
         $this->assertSame('2', $data['LMI_FAIL_METHOD']);
         $this->assertSame('0', $data['LMI_HOLD']);
+        $this->assertSame('123', $data['CUSTOMERID']);
+        $this->assertSame('John', $data['FIRST_NAME']);
+        $this->assertSame('Doe', $data['LAST_NAME']);
+        $this->assertSame('No-Key', $data['FIELD_1']);
+        $this->assertSame('Numeric-Key', $data['FIELD_2']);
     }
 
     public function testSendData()
@@ -74,6 +87,42 @@ public function testGetCurrencyByPurse()
         $this->assertSame('UZS', $this->request->getCurrencyByPurse('Y123428476799'));
         $this->assertSame('BYR', $this->request->getCurrencyByPurse('B123428476799'));
         $this->assertSame('BTC', $this->request->getCurrencyByPurse('X123428476799'));
+        $this->assertSame('USDT', $this->request->getCurrencyByPurse('T123428476799'));
         $this->assertNull($this->request->getCurrencyByPurse('A123428476799'));
     }
+
+    public function testCustomFields()
+    {
+        $this->request->setCustomFields([
+            'field1'  => 'John',
+            'Field_2' => 'Doe',
+        ]);
+
+        $this->assertArrayHasKey('FIELD1', $this->request->getCustomFields());
+        $this->assertArrayHasKey('FIELD_2', $this->request->getCustomFields());
+    }
+
+    public function testInvalidCustomFields1()
+    {
+        $this->expectException('Exception');
+        $this->request->setCustomFields([
+            'lmi_' => 'John',
+        ]);
+    }
+
+    public function testInvalidCustomFields2()
+    {
+        $this->expectException('Exception');
+        $this->request->setCustomFields([
+            '_test' => 'Doe',
+        ]);
+    }
+
+    public function testInvalidCustomFields3()
+    {
+        $this->expectException('Exception');
+        $this->request->setCustomFields([
+            'array' => [1, 2, 3],
+        ]);
+    }
 }
diff --git a/tests/Message/PurchaseResponseTest.php b/tests/Message/PurchaseResponseTest.php
index c951719..e38e576 100644
--- a/tests/Message/PurchaseResponseTest.php
+++ b/tests/Message/PurchaseResponseTest.php
@@ -1,4 +1,5 @@
 <?php
+
 namespace Omnipay\WebMoney\Message;
 
 use Omnipay\Tests\TestCase;
@@ -7,12 +8,12 @@ class PurchaseResponseTest extends TestCase
 {
     private $request;
 
-    public function setUp()
+    public function setUp(): void
     {
         parent::setUp();
 
         $this->request = new PurchaseRequest($this->getHttpClient(), $this->getHttpRequest());
-        $this->request->initialize(array(
+        $this->request->initialize([
             'merchantPurse' => 'Z123428476799',
             'secretKey'     => '226778888',
             'returnUrl'     => 'https://www.foodstore.com/success',
@@ -23,8 +24,8 @@ public function setUp()
             'amount'        => '14.65',
             'currency'      => 'USD',
             'testMode'      => true,
-            'hold'          => 2
-        ));
+            'hold'          => 2,
+        ]);
     }
 
     public function testSuccess()
@@ -37,7 +38,7 @@ public function testSuccess()
         $this->assertNull($response->getMessage());
         $this->assertSame('POST', $response->getRedirectMethod());
         $this->assertSame('https://merchant.wmtransfer.com/lmi/payment.asp', $response->getRedirectUrl());
-        $this->assertSame(array(
+        $this->assertSame([
             'LMI_PAYEE_PURSE'         => 'Z123428476799',
             'LMI_PAYMENT_AMOUNT'      => '14.65',
             'LMI_PAYMENT_NO'          => '1234567890',
@@ -48,7 +49,7 @@ public function testSuccess()
             'LMI_SUCCESS_METHOD'      => '0',
             'LMI_FAIL_URL'            => 'https://www.foodstore.com/failure',
             'LMI_FAIL_METHOD'         => '0',
-            'LMI_HOLD'                => '2'
-        ), $response->getRedirectData());
+            'LMI_HOLD'                => '2',
+        ], $response->getRedirectData());
     }
 }