Алгоритм конвертации валюты с использованием Api

В настоящее время я разрабатываю приложение с использованием 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;
}

0

Решение

Быстрые советы, так как результат выглядит в формате 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
1

Другие решения

Как уже упоминал Гари Томас, API CurrencyLayer документация имеет переключение исходной валюты параметр, позволяющий переключать базовую валюту с 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

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

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 используется выше.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector