Всем привет. Ситуация такая: Имеется у меня очень полезный и интересный для меня скрипт (готовый сайт), в нём присутствует обмен валют с парсом курсов через API. Ломаю голову и сёрфил несколько дней (ну не доходит до дурака). Суть проблем: Имеется 3 валюты - RUB, USD, EUR 1. Проблема Обмена Обмен RUB в USD - 1к1, хотя отображает курс и должно по нему менять. (В обратную сторону работает правильно) Обмен RUB в EUR - Идентично выше описанному. Обмен EUR в USD - идентично выше описанному. 2. Обмен валюты на саму себя Меняя любую валюту на саму себя, к примеру 50 RUB в 50 RUB - комиссия системы (в моём случае 2%) не списывается у пользователя, а наоборот прибавляется к сумме обмена. Спойлер: func.php PHP: function PW_currencyConvertor($amount,$from_Currency,$to_Currency) { global $db, $settings; $am = urlencode($amount); $prefix = $from_Currency.'_'.$to_Currency; $ch = curl_init(); $url = "https://free.currconv.com/api/v7/convert?q=$prefix&compact=ultra&apiKey=$settings[curcnv_api]"; // Disable SSL verification curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // Will return the response, if false it print the response curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Set the url curl_setopt($ch, CURLOPT_URL,$url); // Execute $result=curl_exec($ch); // Closing curl_close($ch); $json = json_decode($result, true); //echo $json[$prefix]['val']; $converted_amount = $json[$prefix]; if($amount>1 && $from_Currency != "USD") { $converted_amount = $amount * $converted_amount; return number_format($converted_amount, 2, '.', ''); } elseif($amount>1 && $to_Currency != "USD") { $converted_amount = $amount * $converted_amount; return number_format($converted_amount, 2, '.', ''); } else { return number_format($converted_amount, 2, '.', ''); } } function PW_GetRates($from_currency,$to_currency) { global $db, $settings; $data = array(); if(empty($from_currency) or empty($to_currency)) { $data['status'] = 'error'; $data['msg'] = 'Some of currencies are missing.'; } else { $fee = $settings['curcnv_fee_percentage']; $rate_from = 1; $calculate = PW_currencyConvertor($rate_from,$from_currency,$to_currency); $calculate1 = ($calculate * $fee) / 100; $calculate2 = $calculate - $calculate1; if($calculate2 < 1) { $calculate = PW_currencyConvertor($rate_from,$to_currency,$from_currency); $calculate1 = ($calculate * $fee) / 100; $calculate2 = $calculate - $calculate1; $rate_from = number_format($calculate2, 2, '.', ''); $rate_to = 1; } else { $rate_to = number_format($calculate2, 2, '.', ''); } $data['status'] = 'success'; $data['rate_from'] = $rate_from; $data['rate_to'] = $rate_to; $data['currency_from'] = $from_currency; $data['currency_to'] = $to_currency; $data['fee'] = $calculate1; } return $data; } Подскажите, может что то не доглядел, буду очень признателен. Убедительная просьба не писать по типу "Го ПМ или Го ЛС, Сделаю Платно". Я делаю всё сам, не хватает навыков, по этому обратился и прошу указать на ошибку. Спасибо за понимание!
Тут важно понять, что продажа и покупка ведется за одну и ту же валюту. Покупаете за рубли и продаете за рубли. Курсы покупки и продажи разные. Продаете дороже, чем покупаете. Не наоборот. Если же вам принесли доллары, а хотят евро, то вы сначала покупаете доллары за рубли по курсу покупки, а потом за них же продаете евро по курсу продажи евро. Если же продавать напрямую, то тут нужен так называемый кросс курс. Его нужно или высчитывать или скачивать отдельно. Что-то еще?
Ну это то я понял, иначе бы не сделал то что уже имеется. А вот причину проблем не догоняю. Вроде всё правильно, по сути берет курс с Апи для валютной пары. Но почему для одних он берет правильный, а для других по той же схеме берет верный но конвертирует по курсу 1 к 1
Возможно потому, что курсы представлены в разных валютах. Это не банковский курс. Биржевые котировки например. Или это те же кросс курсы. Приведите пример того, что скачиваете.
Какой именно пример? По функции видно что запрашивает курс одной пары (небольшой обход сделал) $prefix - валютные пары которые беруться с базы. Если обмен происходит в одну сторону, то в другую с курсом 1к1. В то же время переходя по линке апи, я вижу курс, и вполне соответствующий ЦБРФ.
Курсы извлекаются напрямую из стороннего ресурса. ссылка под спойлером имеется на сам апи. На стороне моего сервера никаких данных кроме From_To&Amount не передается.
Спасибо. хотя подумываю уже заменить просто курсы напрямую используя АПИ ЦБРФ. Как то так PHP: class CurrencyConverter { /* * Класс для конвертации валют */ // PROPERTIES protected $fromCurrencyAmount; protected $fromCurrencyName = 'RUB'; protected $fromCurrencyRate; protected $toCurrencyAmount; protected $toCurrencyName = 'RUB'; protected $toCurrencyRate; protected $precision = 1; // API public function from($currencyName) { $this->fromCurrencyName = $currencyName; return $this; } public function to($currencyName) { $this->toCurrencyName = $currencyName; return $this; } public function precision($precision) { $this->precision = $precision; return $this; } public function convert($fromCurrencyAmount) { if ($this->fromCurrencyName != 'RUB') { $this->fromCurrencyRate = $this->GetRate($this->fromCurrencyName); } else { $this->fromCurrencyRate = 1; } if ($this->toCurrencyName != 'RUB') { $this->toCurrencyRate = $this->GetRate($this->toCurrencyName); } else { $this->toCurrencyRate = 1; } $result = $fromCurrencyAmount / $this->fromCurrencyRate * $this->toCurrencyRate; $this->toCurrencyAmount = round($result, $this->precision); return $this->toCurrencyAmount; } // PROTECTED private function today() { return date('d/m/Y'); } private function GetXML() { $r = file_get_contents('http://www.cbr.ru/scripts/XML_daily.asp?date_req='.$this->today()); $xml = simplexml_load_string($r); return $xml; } private function GetRateFromXML($currency) { $xml = $this->GetXML(); foreach ($xml->Valute as $valute) { if ($valute->CharCode == $currency) { $value = str_replace(',', '.', $valute->Value); $rate = $valute->Nominal / $value; } } if (isset($rate)) { $r = $rate; } else { $r = false; } return $r; } private function GetRateFromCookie($currency) { if ($this->IsSetCurrencyCookie($currency)) { $parts = explode('_', $this->GetRateCookie($currency)); $rate = $parts[0]; $r = $rate; } else { $r = false; } return $r; } private function SetRateCookie($currency, $rate) { setcookie($currency, $rate.'_'.$this->today()); } private function GetRateCookie($currency) { return filter_input(INPUT_COOKIE, $currency); } private function IsSetCurrencyCookie($currency){ if ($this->GetRateCookie($currency) != FALSE and $this->GetRateCookie($currency) != NULL) { return TRUE; }else { return FALSE; } } private function GetRate($currency) { if ($this->IsSetCurrencyCookie($currency)) { $parts = explode('_', $this->GetRateCookie($currency)); $date = $parts[1]; if ($date == $this->today()) { $rate = $this->GetRateFromCookie($currency); } else { $rate = $this->GetRateFromXML($currency); $this->SetRateCookie($currency, $rate); } } else { $rate = $this->GetRateFromXML($currency); $this->SetRateCookie($currency, $rate); } return $rate; }