Курс валют і конвертатор НБУ PHP + XML
Наш, всіма улюблений, Національний Банк ніяк не спроможеться запустити власне 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 одиниці валюти.
Пам'ятайте, що курс розраховується щодо Гривні за ставками НБУ.