【问题标题】:Currency Conversion using PHP [closed]使用 PHP 进行货币转换 [关闭]
【发布时间】:2011-03-17 23:45:56
【问题描述】:

我正在寻找一种在网站上将任何金额从一种货币转换为另一种货币的方法。用户将输入类似“100”并选择美元作为货币,然后选择澳元或加元作为要转换的货币。当他点击“转换”按钮时,我想通过一些 API 自动转换该金额,并向他显示他选择转换为的货币金额。

有什么想法吗?

【问题讨论】:

标签: php api currency


【解决方案1】:

此方法使用 Yahoo 货币 API 完整教程:Currency Converter in PHP, Python, Javascript and 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;
【解决方案2】:

找了好久,终于找到了。

// Fetching JSON
$req_url = 'https://api.exchangerate-api.com/v4/latest/USD';
$response_json = file_get_contents($req_url);

// Continuing if we got a result
if(false !== $response_json) {

    // Try/catch for json_decode operation
    try {

    // Decoding
    $response_object = json_decode($response_json);

    // YOUR APPLICATION CODE HERE, e.g.
    $base_price = 12; // Your price in USD
    $EUR_price = round(($base_price * $response_object->rates->EUR), 2);

    }
    catch(Exception $e) {
        // Handle JSON parse error...
    }
}

这工作正常。 sn-p 来自:https://www.exchangerate-api.com/docs/php-currency-api

【讨论】:

    【解决方案3】:

    将欧元转换为美元的示例

    $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;
                }
    

    【讨论】:

    • 这绝对比这里提到的其他解决方案更干净、更强大。
    • 404 Not Found - 此服务不再可用。
    【解决方案4】:

    我的 2017 解决方案 是一个非常轻量级的函数,可以从 fixer.io API 获取当前的交换信息。它还将汇率存储在每日 cookie 中,以防止网页加载时间过长。您也可以为此选择 Sessions 或将其删除:

    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');

    【讨论】:

    • 网站似乎要求您注册 API 密钥。
    • 似乎仍然可以在没有密钥的情况下调用它,尽管您对其格式的假设似乎是错误的。默认情况下,它始终使用基础货币欧元,您提供的符号是您希望对该基础货币汇率的货币。您必须自己计算才能根据这些费率在两者之间进行选择。
    【解决方案5】:

    为货币转换器 PHP 使用 Given 代码

    public function convertCurrency($from, $to, $amount)    
    {
        $url = file_get_contents('https://free.currencyconverterapi.com/api/v5/convert?q=' . $from . '_' . $to . '&compact=ultra');
        $json = json_decode($url, true);
        $rate = implode(" ",$json);
        $total = $rate * $amount;
        $rounded = round($total);
        return $total;
    }
    

    【讨论】:

      【解决方案6】:

      我喜欢第一个解决方案,但它似乎存在很大的问题。 我试图将它实现到支付网关中,但我一直得到 1 的结果。 这让我很困惑,我最终发现这是因为谷歌有一个空间用于数千个分隔符。因此,1 500.00 的数量作为 1 返还,因为其余部分已爆炸。我为它创建了一个快速而肮脏的修复程序。 让我知道是否有其他人遇到过这个问题。 这是我的解决方案:

      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); }
      

      【讨论】:

      • iGoogle 已于 2013 年 11 月 1 日停用。此 API 不再有效。
      【解决方案7】:

      这是我正在使用的:

      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);
      }
      

      【讨论】:

        【解决方案8】:

        按照Stefan Gehrig 的建议,我使用以下 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>

        然后,当请求更改货币时,我可以通过 JavaScript 使用 3 个字母的货币代码(例如,data['GBP'])轻松获取数据。

        我使用 Cron Job 每天更新一次 JSON,因此不会在每次访问页面时都进行调用。

        【讨论】:

          【解决方案9】:
          /**
           * 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('[^A-Z]', '', strtoupper(trim($fromCurrency)));
              $toCurrency = preg_replace('[^A-Z]', '', 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('Y-m-d H:i:s', $timestamp),
                  'datetime_de' => date('d.m.Y H:i:s', $timestamp),
                  'value' => $value,
                  'from' => $fromCurrency,
                  'to' => $toCurrency,
                  'ratio' => round($ratio, 6),
                  'result' => (true===$round)
                      ? round($calcValue, 2)
                      : $calcValue
              );
          }
          

          【讨论】:

          • iGoogle 已于 2013 年 11 月 1 日停用。此 API 不再有效。
          【解决方案10】:

          使用这个简单的功能:

          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,它会下载整个网页并仅提取 HTML 以获取您要查找的值。而是使用fixer.io API 查看我的答案。
          【解决方案11】:

          如果你使用本地服务器如 wamp 或 xampp 或其他服务器,这非常简单,那么你应该首先在 php.ini 中启用 openssl 扩展

          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 
          

          【讨论】:

            【解决方案12】:

            请查看以下货币兑换示例。

                function oneUSDTo($amount, $toCurrency)
            {
            $currencyUrl = $amount."usd+to+$toCurrency";
            $url = "https://www.google.com/search?q=".$currencyUrl;
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL,$url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            
            $result = curl_exec($ch);
            $data = explode("$amount US Dollar = ",$result);
            return (float) substr($data[1],0,10);
            }
            
            //Usage: oneUSDTo("type currency code here");
            echo oneUSDTo("5","EUR");
            

            【讨论】:

              【解决方案13】:
              https://fincharts.info/charts/exchange/?key=api_key&&from=USD&to=GBP,BWP,ZAR&amount=45854&date=2018-03-03&base=USD
              

              看来你必须注册一个 api 密钥,我想

              【讨论】:

                【解决方案14】:

                您也可以查看:https://free.currencyconverterapi.com

                免责声明,我是本网站的作者。

                一个示例转换 URL 是:http://free.currencyconverterapi.com/api/v6/convert?q=PHP_EUR,EUR_PHP&compact=ultra&apiKey=sample-api-key,它将返回一个 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("https://free.currencyconverterapi.com/api/v6/convert?q=$conv_id&compact=ultra&apiKey=sample-api-key");
                  $json_a = json_decode($string, true);
                
                  return $amount * round($json_a[$conv_id], 4);
                }
                
                echo(convertCurrency(5, "USD", "PHP"));
                ?> 
                

                【讨论】:

                  【解决方案15】:
                  <?php
                  //  replace this key from  fixer.io after getting  a free API access key:
                  
                  $API = '314259bbe6de76b961c84a5244ac0fc0';
                  
                  function convertCurrency($API, $amount, $from = 'EUR', $to = 'USD'){
                    $curl = file_get_contents("http://data.fixer.io/api/latest?access_key=$API&symbols=$from,$to");
                  
                    if($curl)
                    {
                      $arr = json_decode($curl,true);
                      if($arr['success'])
                      {
                          $from = $arr['rates'][$from];
                          $to = $arr['rates'][$to];
                  
                          $rate = $to / $from;
                          $result = round($amount * $rate, 6);
                          return $result;
                      }else{
                          echo $arr['error']['info'];
                      }
                    }else{
                      echo "Error reaching api";
                    }
                  }
                  
                  echo convertCurrency($API, 1, 'USD', 'EGP');
                  

                  【讨论】:

                  • Fixer 不再免费。
                  • 不,仍有 1.000 API 调用/月的免费计划
                  • {"success":false,"error":{"code":103,"info":"This API Function does not exist."}}
                  • @ZainFarooq 请在 fixer 获得免费帐户后尝试更新代码
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-11-20
                  • 2014-04-08
                  • 1970-01-01
                  • 2011-01-02
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多