Я ищу способ конвертировать любую сумму из одной валюты в другую на веб-сайте. Пользователь вводит что-то вроде «100» и выбирает доллар США в качестве валюты, а затем выбирает австралийские или канадские доллары в качестве валюты для конвертации. Когда он нажимает кнопку «Конвертировать», я хотел бы автоматически конвертировать эту сумму через некоторый API и показать ему сумму в валюте, которую он выбрал для конвертации.
Есть идеи?
Пример конвертации EUR в USD
$url = 'http://www.webservicex.net/CurrencyConvertor.asmx/ConversionRate?FromCurrency=EUR&ToCurrency=USD'; $xml = simpleXML_load_file($url,"SimpleXMLElement",LIBXML_NOCDATA); if($xml === FALSE) { //deal with error } else { $rate = $xml; }
Этот метод использует API Yahoo Currency Полный учебник: Конвертер валют в PHP, Python, Javascript и jQuery
function currencyConverter($currency_from,$currency_to,$currency_input){ $yql_base_url = "http://query.yahooapis.com/v1/public/yql"; $yql_query = 'select * from yahoo.finance.xchange where pair in ("'.$currency_from.$currency_to.'")'; $yql_query_url = $yql_base_url . "?q=" . urlencode($yql_query); $yql_query_url .= "&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys"; $yql_session = curl_init($yql_query_url); curl_setopt($yql_session, CURLOPT_RETURNTRANSFER,true); $yqlexec = curl_exec($yql_session); $yql_json = json_decode($yqlexec,true); $currency_output = (float) $currency_input*$yql_json['query']['results']['rate']['Rate']; return $currency_output; } $currency_input = 2; //currency codes : http://en.wikipedia.org/wiki/ISO_4217 $currency_from = "USD"; $currency_to = "INR"; $currency = currencyConverter($currency_from,$currency_to,$currency_input); echo $currency_input.' '.$currency_from.' = '.$currency.' '.$currency_to;
Мне нравится первое решение, но, похоже, проблема с BIG. Я попытался внедрить его в платежный шлюз, но я продолжал получать результат 1. Это озадачило меня, и я в конце концов обнаружил, что это потому, что существует пространство, используемое google для тысяч спараторов. Таким образом, сумма в 1 500,00 была возвращена как одна, так как остальные были взорваны. Я создал для этого быстрое и грязное решение. Дайте мне знать, если кто-то еще испытал эту проблему. Вот мое решение:
function currency($from_Currency,$to_Currency,$amount) { $amount = urlencode($amount); $from_Currency = urlencode($from_Currency); $to_Currency = urlencode($to_Currency); $url = "http://www.google.com/ig/calculator?hl=en&q=$amount$from_Currency=?$to_Currency"; $ch = curl_init(); $timeout = 0; curl_setopt ($ch, CURLOPT_URL, $url); curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_USERAGENT , "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1)"); curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout); $rawdata = curl_exec($ch); curl_close($ch); $data = explode('"', $rawdata); $data = explode('.', $data['3']); $data[0] = str_replace(" ", "",preg_replace('/\D/', '', $data[0])); if(isset($data[1])){ $data[1] = str_replace(" ", "",preg_replace('/\D/', '', $data[1])); $var = $data[0].".".$data[1]; } else{ $var = $data[0]; } return round($var,2); }
/** * Rechnet den gegebenen Betrag von einer Währung in eine andere um * @param FLOAT $value * @param STRING $fromCurrency=USD Ursprungswärung des Betrags * @param STRING $toCurrency=EUR Zielwärhung, in die umgerechnet wird * @param BOOL $round=true Wenn aktiviert, wird der errechnete Wert auf 2 Nachkommastellen kaufmännisch gerundet * @return ARRAY [timestamp][datetime_iso][datetime_de][value][from][to][result] */ function calcCurrency($value=0, $fromCurrency='USD', $toCurrency='EUR', $round=true) { $timestamp = time(); $fromCurrency = preg_replace('[^AZ]', '', strtoupper(trim($fromCurrency))); $toCurrency = preg_replace('[^AZ]', '', strtoupper(trim($toCurrency))); $round = (bool) $round; $wrongJSON = file_get_contents("http://www.google.com/ig/calculator?hl=en&q=1$fromCurrency=?$toCurrency"); $search = array('lhs', 'rhs', 'error', 'icc'); $replace = array('"lhs"', '"rhs"', '"error"', '"icc"'); $json = str_replace($search, $replace, $wrongJSON); $jsonData = json_decode($json, true); if ('' !== $jsonData['error']) throw new Exception('FEHLER: '.$jsonData['error']); $rhs = explode(' ', $jsonData['rhs'], 2); $calcValue = floatval(0.00); $value = floatval($value); $ratio = floatval($rhs[0]); // Gültigkeitsprüfungen if ($value < 0) throw new Exception('Umzurechnender Wert darf nicht negativ sein.'); // Plausibilitätsprüfung der eingestellten Währung und Festlegung if ($toCurrency == $fromCurrency) { // Ursprungswährung = Zielwährung | Es erfolgt keine Berechnung $calcValue = $value; $ratio = 1; } else { $calcValue = floatval($value * $ratio); } // Array mit Rückgabewerten erzeugen und zurück geben return array( 'timestamp' => $timestamp, 'datetime_iso' => date('Ymd H:i:s', $timestamp), 'datetime_de' => date('dmY H:i:s', $timestamp), 'value' => $value, 'from' => $fromCurrency, 'to' => $toCurrency, 'ratio' => round($ratio, 6), 'result' => (true===$round) ? round($calcValue, 2) : $calcValue ); }
Это то, что я использую:
function exchangeRate( $amount, $from, $to) { switch ($from) { case "euro": $from_Currency = "EUR"; break; case "dollar": $from_Currency = "USD"; break; case "pounds": $from_Currency = "GBP"; break; } switch ($to) { case "euro": $to_Currency = "EUR"; break; case "dollar": $to_Currency = "USD"; break; case "pound": $to_Currency = "GBP"; break; } $amount = urlencode($amount); $from_Currency = urlencode($from_Currency); $to_Currency = urlencode($to_Currency); $get = file_get_contents("https://www.google.com/finance/converter?a=$amount&from=" . $from_Currency . "&to=" . $to_Currency); $get = explode("<span class=bld>",$get); $get = explode("</span>",$get[1]); $converted_amount = preg_replace("/[^0-9\.]/", null, $get[0]); return round($converted_amount, 2); }
Я использовал следующий PHP, чтобы вытащить данные из ЕЦБ, как предложил Стефан Гериг .
<?php try { $xml_string = file_get_contents("https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml"); $xml = new SimpleXMLElement($xml_string); $cxml = $xml->xpath('//*[@currency]'); //anchored to USD in this case $usx = $xml->xpath('//*[@currency="USD"]'); $base = floatval(strval($usx[0]['rate'])); //create a simple associative array with the 3-letter code //as the key and the rate as the value $c_arr = array(); foreach ($cxml as $c) { $cur = strval($c['currency']); $rate = floatval(strval($c['rate']))/$base; $c_arr[$cur] = $rate; } //add the euro since it's assumed as the base rate for the ECB $c_arr['EUR'] = 1/$base; $currency_json = json_encode($c_arr); //write to file $file = "currency.json"; $fh = fopen($file, 'w') or die("can't open file"); fwrite($fh, $currency_json); fclose($fh); echo $currency_json; } catch (Exception $e) { echo $e; } ?>
Он записывает JSON-файл, который я включаю в качестве переменной JavaScript:
<script type="text/javascript"> var data = <?php include('currency.json'); ?>; </script>
используйте эту простую функцию:
function convertCurrency($amount, $from, $to){ $url = "https://www.google.com/finance/converter?a=$amount&from=$from&to=$to"; $data = file_get_contents($url); preg_match("/<span class=bld>(.*)<\/span>/",$data, $converted); $converted = preg_replace("/[^0-9.]/", "", $converted[1]); return round($converted, 3); }
Мое решение 2017 – очень легкая функция, которая получает текущую информацию об обмене от API fixer.io
. Он также сохраняет обменный курс в ежедневном файле cookie, чтобы предотвратить дальнейшее интенсивное время загрузки в Интернете. Вы также можете выбрать «Сеансы» для этого или удалить его:
function convertCurrency($amount, $from = 'EUR', $to = 'USD'){ if (empty($_COOKIE['exchange_rate'])) { $Cookie = new Cookie($_COOKIE); $curl = file_get_contents_curl('http://api.fixer.io/latest?symbols='.$from.','.$to.''); $rate = $curl['rates'][$to]; $Cookie->exchange_rate = $rate; } else { $rate = $_COOKIE['exchange_rate']; } $output = round($amount * $rate); return $output; }
Пример использования для конвертации 100 евро в фунты:
echo convertCurrency(100, 'EUR', 'GBP');
Это так просто, если вы используете локальный сервер, например, wamp или xampp или другой сервер, тогда вам нужно включить расширение opensl сначала в php.ini
extension=php_openssl.dll `allow_url_fopen = On`
то вы сможете запустить мой код, иначе вы запускаете свой сайт с помощью онлайн-хостинга, тогда вам не нужно это делать, поэтому вам нужно добавить эту функцию php в свой php-скрипт
<?php function currencyCnv( $amount, $from, $to){ $get = file_get_contents("https://www.google.com/finance/converter?a=$amount&from=" . $from. "&to=" . $to); $get = explode("<span class=bld>",$get); $get = explode("</span>",$get[1]); $converted_amount = $get[0]; echo round($converted_amount,2); } currencyCnv(100,'GBP','PKR'); //currencyCnv(you amount from form input filed ,currency from select box,currency to select box) //any currency convert with this code
Вы также можете проверить: http://free.currencyconverterapi.com
Отказ от ответственности, я автор этого сайта.
Образец конверсии URL: http://free.currencyconverterapi.com/api/v3/convert?q=PHP_EUR,EUR_PHP&compact=ultra, который вернет значение в формате json, например {"PHP_EUR": 0.016434, "EUR_PHP": 60.849184}
Вы должны учитывать ограничения, как и максимальные запросы и запросы (подробности найдены на сайте). Я реализовал ограничения, потому что были нарушители службы.
Я начал это с 2014 года и с тех пор все время (помимо изменения ссылки и времени обслуживания на этом пути). Я лично использую его для других веб-сайтов и предоставляю услугу публично, чтобы он мог помочь другим разработчикам.
В любом случае, это поможет, и вот пример кода PHP:
<?php function convertCurrency($amount, $from, $to){ $conv_id = "{$from}_{$to}"; $string = file_get_contents("http://free.currencyconverterapi.com/api/v3/convert?q=$conv_id&compact=ultra"); $json_a = json_decode($string, true); return $amount * round($json_a[$conv_id], 4); } echo(convertCurrency(5, "USD", "PHP")); ?>