Безлимитный хостинг на сверхбыстрых SSD-дисках от 66р в месяц   •   Реклама
19 706 просм
21 комм
Поделиться:

Получаем курсы валют с сайта Центробанка на PHP

В некоторых случаях при работе с коммерцией возникает необходимость получения актуальной информации о курсе той или иной валюты. Центробанк – лучший источник таких данных, а учитывая то, что он предоставляет открытую и своевременно обновляемую информацию о курсе валют в формате XML – грех ею не воспользоваться.

Я рад поделиться с вами своей небольшой функцией, которая отлично справляется с описанной в заголовке задачей, а именно – бесплатным получением курса валют ЦБ РФ на PHP.

Функция эта выглядит следующим образом:

function get_currency($currency_code, $format) {

	$date = date('d/m/Y'); // Текущая дата
	$cache_time_out = '3600'; // Время жизни кэша в секундах

	$file_currency_cache = __DIR__.'/XML_daily.asp';

	if(!is_file($file_currency_cache) || filemtime($file_currency_cache) < (time() - $cache_time_out)) {

		$ch = curl_init();

		curl_setopt($ch, CURLOPT_URL, 'https://www.cbr.ru/scripts/XML_daily.asp?date_req='.$date);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
		curl_setopt($ch, CURLOPT_HEADER, 0);

		$out = curl_exec($ch);

		curl_close($ch);

		file_put_contents($file_currency_cache, $out);

	}

	$content_currency = simplexml_load_file($file_currency_cache);

	return number_format(str_replace(',', '.', $content_currency->xpath('Valute[CharCode="'.$currency_code.'"]')[0]->Value), $format);

}

В ней строки:

$date = date('d/m/Y'); // Текущая дата
$cache_time_out = '3600'; // Время жизни кэша в секундах

отвечают за дату (в нашем случае она текущая) и время жизни кэша соответственно. Поскольку ЦБ не так часто обновляет данные о валютах, не стоит докучать ему просто так при каждом их использовании. Значения в этих строках (по желанию) можете изменить на свои.

Использование функции следующее:

echo get_currency('USD', 3);

Здесь «USD» – символьный код валюты (в нашем случае – это доллар США), а «3» – количество знаков после запятой.

Допустимый перечень валют, предоставляемых ЦБ РФ (на момент написания статьи) в виде «символьный код валюты – номинал и название»:

AUD – 1 австралийский доллар
AZN – 1 азербайджанский манат
GBP – 1 фунт стерлингов Соединенного королевства
AMD – 100 армянских драмов
BYN – 1 белорусский рубль
BGN – 1 болгарский лев
BRL – 1 бразильский реал
HUF – 100 венгерских форинтов
HKD – 10 гонконгских долларов
DKK – 10 датских крон
USD – 1 доллар США
EUR – 1 евро
INR – 100 индийских рупий
KZT – 100 казахстанских тенге
CAD – 1 канадский доллар
KGS – 100 киргизских сомов
CNY – 10 китайских юаней
MDL – 10 молдавских леев
NOK – 10 норвежских крон
PLN – 1 польский злотый
RON – 1 румынский лей
XDR – 1 СДР (специальные права заимствования)
SGD – 1 сингапурский доллар
TJS – 10 таджикских сомони
TRY – 1 турецкая лира
TMT – 1 новый туркменский манат
UZS – 10 000 узбекских сумов
UAH – 10 украинских гривен
CZK – 10 чешских крон
SEK - 10 шведских крон
CHF – 1 швейцарский франк
ZAR – 10 южноафриканских рэндов
KRW – 1 000 вон Республики Корея

Надеюсь, функция найдет свое место в вашем проекте. Если остались вопросы или что-то показалось непонятным – обязательно пишите об этом в комментариях под данной статьей.

21
комментарий
Форма комментирования этой статьи скрыта. Авторизуйтесь, чтобы расширить привилегии гостевого посещения и получить необходимую помощь от сообщества Pandoge.
    • 1
    2
      •  Пользователь
    26 фев в 08:58

    Подскажите куда это прописать то ? echo get_currency("USD", 3);

      • 1
      2
        •  Пользователь
      26 фев в 12:45

      Что то не работает вас скрипт все белое

      • 1
      839
        •  Администратор
      изменено 29 фев в 03:39

      Михаил Зав, здравствуйте! Слишком мало информации.

      Что показывают логи сервера?

      На какой CMS используете код?

      Сохраняется ли файл с данными валют?

    • 0
    1
      •  Пользователь
    23 сен в 19:41

    А реально такое только в С++ и для Arduino?

      • 1
      839
        •  Администратор
      23 сен в 22:29

      Андрей Ка, с C++ знаком очень мало, а с Arduino только в качестве общего представления, поэтому с Вашей задачей, к сожалению, я помочь не смогу.

    • 1
    766
      •  Гости
    23 авг в 15:13

    Добрый день

    Как сделать вывод только двух знаков после запятой? Сейчас 4

      • 3
      839
        •  Администратор
      23 авг в 23:13

      Андрей, нужную валюту оберните в round. На примере доллара это будет выглядеть так:

      echo "Доллар - ".round($usd, 2);

    • 1
    766
      •  Гости
    22 июн в 11:32

    а данный скрипт буден работать на сайте ( Opencart 2.3, https) ?

      • 0
      839
        •  Администратор
      22 июн в 13:06

      Николай, Да.

    • 0
    766
      •  Гости
    12 мая в 04:20

    Во-первых, в настройках системы можно указать критический порог изменения курса валюты в процентах или рублях. Если он превышен, незамедлительно отправляется sms и e-mail сообщения.

    • 2
    766
      •  Гости
    13 апр в 21:37

    Спасибо! Как подключить обработчик на DLE?

    • 2
    766
      •  Гости
    6 мар в 19:26

    Работает конечно, но через раз! После ctrl+f5 то показывает то пропадает как решить?

      • 9
      839
        •  Администратор
      6 мар в 19:34

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

      Грузите файл к себе на сервер и проверяйте: если файлу больше двух часов - значит нужно его обновить, если нет - то используете тот что на вашем сервере.

      А вообще, обновлять файл можно и раз в день. ЦБ не так часто обновляет данные.

    • 1
    766
      •  Гости
    26 фев в 15:47

    Здравствуйте, как вывести дату и разницу, наподобие вашего информера?

      • 9
      839
        •  Администратор
      26 фев в 19:50

      Павел, делаете два запроса - 1 запрос на сегодняшнюю дату, а 2 - на вчерашнюю.

      Получаете данные за оба дня и вычитаете одно из другого.

    • 3
    766
      •  Гости
    16 фев в 10:57

    А курсы получаем только по отношению к рублю?

    есть ли возможность например EURJPY?

    • 1
    766
      •  Гости
    13 фев в 01:30

    Здравствуйте!

    можно сделат http://cbu.uz/uzc/arkhiv-kursov-valyut/xml/

    • 0
    766
      •  Гости
    4 фев в 14:21

    классная вещь, а можно сделать так же, только с казахстанского национального банка http://www.nationalbank.kz/rss/rates.xml ?

      • 6
      839
        •  Администратор
      4 фев в 14:28

      Родион, можно. В ближайшее время сделаем.

      -----

      Готово - https://www.pandoge.com/moduli_i_skripty/poluchaem-kursy-valyut-s-sayta-nacionalnogo-banka-kazahstana-na-php

    • 0
    766
      •  Гости
    3 ноя в 22:43

    А если нужен только доллар? Перебор foreach не нужен?

      • 5
      839
        •  Администратор
      4 ноя в 01:32

      Дмитрий, да, foreach не нужен. Пример на долларе будет такой:

      echo $content->xpath('Valute[@ID="R01235"]')[0]->Value;

Подняться наверх
«Pandoge» - помощник вебмастера