Есть ли лучший способ получить курс обмена валют в PHP? - PullRequest
0 голосов
/ 05 июня 2018

Курс обмена валют с кодом ниже работает иногда, иногда не работает и совсем не надежен.Есть ли лучший способ получить курс обмена валют в 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 Ответ

0 голосов
/ 05 июня 2018

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

  • Вы не вызываете реальный API, вы очищаете веб-страницу, что означает, что:
    • вы, скорее всего, нарушаетеВ Google TOS
    • у вас больше шансов получить ограничение по ставке (или быть замеченным как злоупотребление и попасть в черный список) в какой-то момент, если вы слишком часто выбираете эту страницу
    • вы зависимыпри любых изменениях, внесенных в структуру 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) в другую валюту, но не дают подсказки о том, как конвертировать между двумя произвольными валютами.Я хотел бы предложить вам использовать подходящую библиотеку, которая обрабатывает эти преобразования для вас, например brick / money - заявление об отказе: я автор .

Вот каквы настроите его так, чтобы загружать курсы валют из приведенной выше таблицы:

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
...