Если мы говорим про получение курса валют для Битрикс, то в редакциях с модулем "Интернет-магазин" уже есть встроенный курс валюты, который используется в каталоге товаров. Его же можно использовать и для любой другой работы с курсами.
В документации по API есть целый набор классов для работы с валютами, со своими методами получения, обновления курсов.
Но в более младших редакциях этого нет, поэтому для решения задач иногда приходится дописывать функции получения курсов валют.
Для Беларуси актуально получать курсы с нацбанка (НБРБ). API системы находится тут: https://www.nbrb.by/apihelp/exrates внутри тоже всё достаточно просто.
Алгоритм получения курсов валют
- Создаем хранилище для курсов (как правило, это Highload блок в Битриксе)
- С помощью GET запроса получаем нужные нам данные
- Записываем эти данные в хранилище
- Настраиваем автоматическое обновление курсов
Варианты автоматического обновления
- Можно повесить скрипт на CRON и с заданной периодичностью система будет получать курсы и записывать их в хранилище. Для многих задач этот способ может стать отличным решением. Кстати, обратите внимание, что в CRON не определен массив $_SERVER, поэтому данный код
require_once($_SERVER['DOCUMENT_ROOT'] . "/bitrix/modules/main/include/prolog_before.php");
не отработает, массив $_SERVER нужно инициализировать отдельно, прописав абсолютный путь в $_SERVER['DOCUMENT_ROOT'] - Можно получать данные не по крону, а по хитам пользователя. Здесь мы исходим из того, что если к этим данным пользователи не обращаются, то они вовсе не нужны, поэтому мы будем их обновлять по первому запросу, а затем сравнивать с пороговым периодом времени. Если порог не превышен, то мы берем курс из хранилища, а если превышен - то обновляем его запросом в API НБРБ.
Данный метод также хорош, и может использоваться.
Пример реализации получения курса валюты с НБРБ
В данном примере используется как раз второй способ получения курса валюты.
<?
$currenciesHL = "2";
$curClass = getHlClass($currenciesHL);
$resultCur = array();
$siteCur = '0';
$rsData = $curClass::getList(
array(
"select" => array('*'),
"order" => array('ID' => 'ASC'),
"filter" => array()
)
);
while($arData = $rsData->Fetch()){
$resultCur[$arData["ID"]] = $arData;
}
foreach ($resultCur as $curKey => $curValue) {
if($curValue['UF_CUR_NAME']){
$timestamp = strtotime($curValue['UF_CUR_DATE']);
$today = time();
if(($today - $timestamp) > '86400'){
$url = "https://www.nbrb.by/api/exrates/rates/".$curValue['UF_CUR_NAME']."?parammode=2";
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$resp = curl_exec($curl);
curl_close($curl);
$respUSD = json_decode($resp);
if($respUSD -> Cur_OfficialRate){
$arField= array();
if(($curValue['UF_CUR_NAME'] == 'USD') || ($siteCur == '0')){
$siteCur = $respUSD -> Cur_OfficialRate;
}
// $arField['UF_CUR_NAME'] = $curValue['UF_CUR_NAME'];
$arField['UF_MAIN_VALUE'] = $respUSD -> Cur_OfficialRate;
$arField['UF_CUR_DATE'] = $respUSD -> Date;
$curClass::update($curKey, $arField);
}
} else {
if(($curValue['UF_CUR_NAME'] == 'USD') || ($siteCur == '0')){
$siteCur = $curValue['UF_MAIN_VALUE'];
}
}
}
}
?>
Хранилище:
- Highload ID=2
- UF_CUR_NAME (строка)
- UF_CUR_DATE (дата)
- UF_MAIN_VALUE (число)
Данные в итоге хранятся так:
Внутри в коде есть 86400 - это и есть порог получения новых курсов (в данном случае обновление идет раз в сутки). Для НБРБ делать чаще не имеет смысла, внутренний регламент обновления данных именно ежесуточный.
Функция getHLClass, которая используется в решении, ее нужно подключать в init.php
function getHlClass($id){
$hlblock = HL\HighloadBlockTable::getById($id)->fetch();
$entity = HL\HighloadBlockTable::compileEntity($hlblock);
$entity_data_class = $entity->getDataClass();
return $entity_data_class;
}
Если возникают проблемы с api.nbrb.by, то в 99% случаев проблема на стороне вашего сервера. АПИ нацбанка доступен практически всегда, простоев очень мало. Возможны ограничения, при которых данные отдаются только на белорусские IP адреса
Больше полезных материалов в нашем Telegram канале. Вступайте и будем на связи! https://t.me/bf_conversion