Fedka

Курс валют ПриватБанка

Рекомендуемые сообщения

Fedka    143

Столкнулся с такой проблемой, что стандартный функционал обновлений курса валют для Украины немного не подходит. Зачастую курс занижен. С поставщиками оплата производится в USD по курсу ПриватБанка или Межбанка.

Немного покопавшись в API ПриватБанка вышло решение какое подошло.

Выкладываю код, может кому-то пригодится.

 

И так, открываем файл admin/model/localisation/currency.php

Находим функцию:

public function refresh($force = false) {
	if (extension_loaded('curl')) {
		$data = array();

		if ($force) {
			$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "currency WHERE code != '" . $this->db->escape($this->config->get('config_currency')) . "'");
		} else {
			$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "currency WHERE code != '" . $this->db->escape($this->config->get('config_currency')) . "' AND date_modified < '" .  $this->db->escape(date('Y-m-d H:i:s', strtotime('-1 day'))) . "'");
		}

		foreach ($query->rows as $result) {
			$data[] = $this->config->get('config_currency') . $result['code'] . '=X';
		}

		$curl = curl_init();

		curl_setopt($curl, CURLOPT_URL, 'http://download.finance.yahoo.com/d/quotes.csv?s=' . implode(',', $data) . '&f=sl1&e=.csv');
		curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($curl, CURLOPT_HEADER, false);
		curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
		curl_setopt($curl, CURLOPT_TIMEOUT, 30);

		$content = curl_exec($curl);

		curl_close($curl);

		$lines = explode("\n", trim($content));

		foreach ($lines as $line) {
			$currency = utf8_substr($line, 4, 3);
			$value = utf8_substr($line, 11, 6);

			if ((float)$value) {
				$this->db->query("UPDATE " . DB_PREFIX . "currency SET value = '" . (float)$value . "', date_modified = '" .  $this->db->escape(date('Y-m-d H:i:s')) . "' WHERE code = '" . $this->db->escape($currency) . "'");
			}
		}

		$this->db->query("UPDATE " . DB_PREFIX . "currency SET value = '1.00000', date_modified = '" .  $this->db->escape(date('Y-m-d H:i:s')) . "' WHERE code = '" . $this->db->escape($this->config->get('config_currency')) . "'");

		$this->cache->delete('currency');
	}
}

И заменяем ее на:

public function refresh($force = false) {
	if (extension_loaded('curl')) {
		if ($force) {
			$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "currency WHERE code != '" . $this->db->escape($this->config->get('config_currency')) . "'");
		} else {
			$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "currency WHERE code != '" . $this->db->escape($this->config->get('config_currency')) . "' AND date_modified < '" .  $this->db->escape(date('Y-m-d H:i:s', strtotime('-1 day'))) . "'");
		}
		
		if (!empty($query->rows)) {
			$curl = curl_init();

			curl_setopt($curl, CURLOPT_URL, 'https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5');
			curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
			curl_setopt($curl, CURLOPT_HEADER, false);
			curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
			curl_setopt($curl, CURLOPT_TIMEOUT, 30);
			$content = curl_exec($curl);			
			curl_close($curl);

			$lines = json_decode($content);
			
			foreach ($lines as $line) {
				$currency = $line->ccy;
				$value = 1/ (float)$line->sale;// (float)$line->buy

				if ((float)$value) {
					$this->db->query("UPDATE " . DB_PREFIX . "currency SET value = '" . (float)$value . "', date_modified = '" .  $this->db->escape(date('Y-m-d H:i:s')) . "' WHERE code = '" . $this->db->escape($currency) . "'");
				}
			}

			$this->db->query("UPDATE " . DB_PREFIX . "currency SET value = '1.00000', date_modified = '" .  $this->db->escape(date('Y-m-d H:i:s')) . "' WHERE code = '" . $this->db->escape($this->config->get('config_currency')) . "'");

			$this->cache->delete('currency');
		}
	}
}

Тут единственное нужно учесть, какой курс Вы хотите использовать, Покупки или Продажи валюты и исходя из этого брать параметр: $line->sale или $line->buy

Изменено пользователем Fedka

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1san4ik    1

Спасибо-то что искал. Буду пробовать

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1san4ik    1
В 03.03.2017 в 04:57, 1san4ik сказал:

Спасибо-то что искал. Буду пробовать

Все реально работает - спасибо тебе добрый человек)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу