Курс обмена валют с кодом ниже работает иногда, иногда не работает и совсем не надежен. Есть ли лучший способ получить курс обмена валют в 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);
}
У вас есть несколько вопросов:
Что ты должен делать:
Таким образом, даже в случае сбоя вызова 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
Других решений пока нет …