Получаем курс валют НБУ [PHP+XML]
- Дата 9-12-2013, 02:01
- Комментариев 11 комментариев
- Категория Веб-разработка » Сниппеты
Наш, всеми любимый, Национальный Банк никак не удосужится запустить собственное API. Приходиться обходными путями получать актуальную информацию. Я для этого решил использовать средства коммерческого банка — ПриватБанк. У них на официальном сайте функционирует страница с XML разметкой, на которой и представлены курсы обмена самых основных валют: UAH, RUR, EUR, USD и золото XAU. PHP скрипт может получать курс валют по котировкам НБУ и по собственным, внутренним курсам. Взаимодействие без использования CURL запросов, а задействована функция file_get_contents.
От себя добавил, функцию сохранения XML файла на локальном сервере, на случай если ссылка привата сломается. Файл храниться ровно день, затем в него подгружается новая, актуальная информация об обменных курсах валют.
Вот сам PHP класс:
class ExchangeRate {
// URL, файл в формате XML
public $exchange_url =
'https://privat24.privatbank.ua/p24/accountorder?oper=prp&exchange&PUREXML&coursid=3'; // установив coursid=5, расчёт будет относительно ставок привата
private $xml;
private $carrency = 'cache/currency.xml';
function __construct(){
$this->getXML();
return $this->xml = simplexml_load_file($this-> carrency);
}
private function getXML(){
if ( !file_exists($this-> carrency) or (time() - filemtime($this->carrency) > 86400) )
file_put_contents($this->carrency, file_get_contents($this->exchange_url));
}
private function getExchangeVal($val, $do){
if ($this->xml!==FALSE) {
// все хорошо, можно работать дальше -
// в XML-данных нет ошибки
foreach ($this->xml as $currency) {
if ($currency->exchangerate['ccy'] == $val) {
$curs = floatval($currency->exchangerate[$do]);
}
}
}
return $curs;
}
public function getExchange($val1, $val2, $summ=0, $round=6){
$valuta1 = $this->getExchangeVal($val1, 'buy');
$valuta2 = $this->getExchangeVal($val2, 'sale');
if ($val1 == 'UAH') {
if($summ>0) $valuta2 = $summ / $valuta2;
return round($valuta2, $round);
} elseif ($val2 == 'UAH') {
if($summ>0) $valuta1 = $summ * $valuta1;
return round($valuta1, $round);
} else {
$rate = $valuta1 / $valuta2;
if($summ>0) $rate = $rate*$summ;
return round($rate, $round);
}
}
}
Примеры использования:
$er = new ExchangeRate(); //инициализируем класс
echo $er->getExchange('USD', 'RUR', 100, 2); //меняем Доллар на Рубли; сумма 100; округляем до десятых (2 знака после запятой).
echo $er->getExchange('RUR', 'UAH', 800, 3); //меняем рубли на Гривны; сумма 800 рублей; округляем до тысячных (3 знака после запятой).
echo $er->getExchange('UAH', 'RUR', 100); //стандартное округление в 6 знаков после ноля.
echo $er->getExchange('EUR', 'USD'); //курс 1 единицы валюты.
Помните, что курс рассчитывается относительно Гривны по ставкам НБУ.