Супербыстрый хостинг на SSD от 165р в месяц   •   Реклама
15 451 просм
18 комм
Поделиться:

Получаем курсы валют с сайта Центробанка на 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);

		$fp = fopen($file_currency_cache, "w");

		fwrite($fp, $out);
		fclose($fp);

	}

	$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 вон Республики Корея

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

18
комментариев
Гостям запрещено участвовать в обсуждениях сайта. Авторизуйтесь, чтобы расширить привилегии гостевого посещения и получить необходимую помощь от сообщества Pandoge.
Администратор  |  722

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

23.09 в 22:29
  • 0
Пользователь  |  1

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

23.09 в 19:41
  • 0
Администратор  |  722

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

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

23.08 в 23:13
  • 1
Гости  |  679

Добрый день

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

23.08 в 15:13
  • 0
Администратор  |  722

Николай, Да.

22.06 в 13:06
  • 0
Гости  |  679

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

22.06 в 11:32
  • 0
Гости  |  679

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

12.05 в 04:20
  • 0
Гости  |  679

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

13.04 в 21:37
  • 0
Администратор  |  722

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

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

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

6.03 в 19:34
  • 9
Гости  |  679

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

6.03 в 19:26
  • 0
Администратор  |  722

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

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

26.02 в 19:50
  • 8
Гости  |  679

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

26.02 в 15:47
  • 0
Гости  |  679

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

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

16.02 в 10:57
  • 2
Гости  |  679

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

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

13.02 в 01:30
  • 0
Администратор  |  722

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

-----

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

4.02 в 14:28
  • 5
Гости  |  679

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

4.02 в 14:21
  • 0
Администратор  |  722

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

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

4.11 в 01:32
  • 5
Гости  |  679

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

3.11 в 22:43
  • 0
Подняться наверх
«Pandoge» - помощник веб-мастера