Есть ли лучший способ получить курс обмена валют в PHP?

Курс обмена валют с кодом ниже работает иногда, иногда не работает и совсем не надежен. Есть ли лучший способ получить курс обмена валют в PHP?

public function getJPYtoUSDExchangeRate(){
$from    = 'JPY';
$to    = 'USD';
$amount  = 1;
$data = file_get_contents("https://finance.google.com/finance/converter?a=$amount&from=$from&to=$to");
preg_match("/<span class=bld>(.*)<\/span>/",$data, $converted);
$converted = preg_replace("/[^0-9.]/", "", $converted[1][0]);
return number_format(round($converted, 3),2);
}

1

Решение

У вас есть несколько вопросов:

  • Вы не вызываете реальный API, вы очищаете веб-страницу, а это означает, что:
    • вы, скорее всего, нарушаете TOS Google
    • у вас больше шансов получить ограничение по ставке (или быть замеченным как злоупотребление и попасть в черный список) в какой-то момент, если вы слишком часто получаете эту страницу
    • вы зависите от любых изменений, внесенных в структуру HTML веб-страницы
  • Вы очищаете страницу каждый раз, когда вам нужно конвертировать сумму в другую валюту, что означает, что любой сбой приводит к сбою конвертации вашей валюты.

Что ты должен делать:

  • загрузка курсов обмена из легального канала или API
  • загружать их на регулярной основе (например, через cron) и сохранить их в локальной базе данных, который будет использоваться для конвертации валюты

Таким образом, даже в случае сбоя вызова API вы по-прежнему имеете доступ к слегка устаревшему обменному курсу, который в большинстве случаев лучше, чем сбой.


Где вы найдете надежный канал обмена валют?

Существует множество API, бесплатных или нет, которые предлагают эту услугу.

Хороший источник, о котором я знаю, — это Европейский центральный банк, который обеспечивает XML-лента это было там в течение многих лет и обеспечивает обменные курсы для 32 валют относительно EUR,

OpenExchangeRates также предлагает бесплатный план с лимитом 1000 запросов в месяц, которого достаточно для обновления тарифов каждый час. Он обеспечивает обменные курсы для 170 валют, по отношению к USD,

Какой бы канал вы ни выбрали, вам нужно его проанализировать (если XML) или json_decode() это (если JSON) и сохранить значения в вашей базе данных. В идеале, установите задачу cron для ежедневного или даже ежечасного запуска скрипта импорта.

Фактические шаги разбора и импорта выходят за рамки этого вопроса, но давайте предположим простую таблицу MySQL, которая содержит записи:

CREATE TABLE exchange_rate(
target_currency CHAR(3) COLLATE ascii_bin NOT NULL PRIMARY KEY,
exchange_rate DOUBLE NOT NULL
);

Как правильно обрабатывать конвертации валют на основе курсов по отношению к одной валюте?

Это вопрос у меня ответил недавно. Вышеуказанные каналы дают вам курсы для конвертации базовой валюты (EUR или же USD) в другую валюту, но не дают подсказки о том, как конвертировать между двумя произвольными валютами. Я хотел бы предложить вам использовать подходящую библиотеку, которая обрабатывает эти преобразования для вас, такие как кирпич / деньгиотказ от ответственности: я автор.

Вот как вы можете настроить его для загрузки ваших обменных курсов из таблицы выше:

use Brick\Money\CurrencyConverter;
use Brick\Money\ExchangeRateProvider\PDOProvider;
use Brick\Money\ExchangeRateProvider\PDOProviderConfiguration;
use Brick\Money\ExchangeRateProvider\BaseCurrencyProvider;

// set to whatever your rates are relative to
$baseCurrency = 'USD';

// use your own credentials, or re-use your existing PDO connection
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');

$configuration = new PDOProviderConfiguration();

$configuration->tableName                = 'exchange_rate';
$configuration->exchangeRateColumnName   = 'exchange_rate';
$configuration->targetCurrencyColumnName = 'target_currency';
$configuration->sourceCurrencyCode       = $baseCurrency;

// this provider loads exchange rates from your database
$provider = new PDOProvider($pdo, $configuration);

// this provider calculates exchange rates relative to the base currency
$provider = new BaseCurrencyProvider($provider, $baseCurrency);

// this currency converter can now handle any currency pair
$converter = new CurrencyConverter($provider);

И как бы вы использовали это:

use Brick\Math\RoundingMode;
use Brick\Money\Money;

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

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

Других решений пока нет …

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