Алгоритм конвертации валюты с использованием Api - PullRequest
0 голосов
/ 11 мая 2018

В настоящее время я разрабатываю приложение с использованием PHP, чтобы пользователи могли менять денежную валюту продуктов, как это делают ebay или aliexpress.Поэтому, если пользователь изменит свою валюту на доллары США, все цены на продукты будут конвертированы в доллары США.

Я искал API, чтобы получить валюты в реальном времени, называемые CurrencyLayer.API предлагает следующую структуру:

"success": true,
  "terms": "https://currencylayer.com/terms",
  "privacy": "https://currencylayer.com/privacy",
  "timestamp": 1432480209,
  "source": "USD",
  "quotes": {
    "USDAED": 3.67315,
    "USDAFN": 60.790001,
    "USDALL": 126.194504,
    "USDAMD": 477.359985,
    "USDANG": 1.790403,
    [...]
  }

Мой план - сохранять эти цитаты каждый час в моей базе данных.Учитывая функцию, которая конвертирует валюты, какой будет правильный алгоритм для конвертации одной в другую?Я знаю, что это не сложно, но я не мог понять это.

function convertCurrency($currency1 = 'USD', $currency2 = 'EUR', $value){
   //Search the currency value and algorithm to convert   
   $newValue = (????)
   return $newValue;
}

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Как уже упоминал Гари Томас, документация по CurrencyLayer API имеет параметр переключения исходной валюты , который позволяет вам переключать базовую валюту с USD на любую вашу $currency1 для параметра установлено значение.

Однако, насколько я понимаю, вы хотите периодически запрашивать API-интерфейс CurrencyLayer, указав в качестве исходной валюты только USD, и самостоятельно выполнять расчет ставки.

Для этого вам необходимо конвертировать:

  1. от CURRENCY 1 до USD
  2. от USD до CURRENCY 2

Что переводится в код как:

function convertCurrency($currency1, $currency2, $value)
{
    $baseCurrency = 'USD';

    $quotes = [
        'USDCAD' => 1.28024,
        'USDEUR' => 0.838313,
        // ...
    ];

    $quote1 = $quotes[$baseCurrency . $currency1];
    $quote2 = $quotes[$baseCurrency . $currency2];

    return $value / $quote1 * $quote2;
}

convertCurrency('EUR', 'CAD', 10); // 15.271622890257

Вы также можете использовать денежную библиотеку, такую ​​как brick / money , которая обрабатывает эти вычисления (и многие другие) для вас:

use Brick\Math\RoundingMode;
use Brick\Money\CurrencyConverter;
use Brick\Money\ExchangeRateProvider\ConfigurableProvider;
use Brick\Money\ExchangeRateProvider\BaseCurrencyProvider;
use Brick\Money\Money;

$provider = new ConfigurableProvider();
$provider->setExchangeRate('USD', 'CAD', 1.28024);
$provider->setExchangeRate('USD', 'EUR', 0.838313);

// This is where the magic happens!
$provider = new BaseCurrencyProvider($provider, 'USD');

$converter = new CurrencyConverter($provider);

$money = Money::of(10, 'EUR');
$converter->convert($money, 'CAD', RoundingMode::DOWN); // CAD 15.27

BaseCurrencyProvider предназначен для этой цели, когда у вас есть список курсов относительно одной валюты и вы хотите конвертировать между двумя произвольными валютами в списке.

Обратите внимание, что в реальных приложениях вы, вероятно, использовали бы PDOProvider для загрузки курсов валют непосредственно из вашей базы данных вместо ConfigurableProvider, использованного выше.

0 голосов
/ 11 мая 2018

Быстрый заголовок, так как результат выглядит в формате JSON, сначала вы можете вызвать json_decode для результата, чтобы получить его в формате PHP Object.

Ваш пример API после json_decode будет выглядеть так:

    // var_dump($api_result)
    stdClass Object
    (
        [success] => 1
        [terms] => https://currencylayer.com/terms
        [privacy] => https://currencylayer.com/privacy
        [timestamp] => 1432480209
        [source] => USD
        [quotes] => stdClass Object
            (
                [USDAED] => 3.67315
                [USDAFN] => 60.790001
                [USDALL] => 126.194504
                [USDAMD] => 477.359985
                [USDANG] => 1.790403
            )
    )

Следующим шагом будет использование вашей функции для объединения обоих параметров для доступа к (например) результату USDAED:

<?php

    function convertCurrency($currency1 = 'USD', $currency2 = 'EUR', $value) {
        //Search the currency value and algorithm to convert
        $combined_currencies = $currency1.$currency2;
        return $api_result->quotes->$combined_currencies * $value;
    }

    echo convertCurrency("USD", "AED", 1); // 3.67315
...