以编程方式访问货币汇率。

114

我正在设置一个在线订购系统,但我在澳大利亚,对于国际客户,我想显示美元或欧元的价格,这样他们就不必费心从澳大利亚元转换。

有人知道我是否可以从网络上获取最新的汇率,并以易于解析的格式从我的PHP脚本中访问吗?


1
@Kelly:非常好的建议,因为Google是免费的,并且在可预见的未来仍有很大的机会存在:我建议您将其提交为答案。 - Eric O. Lebigot
1
似乎无法编辑评论。这是新链接http://www.jarloo.com/exchange-rate-api/。 - Kelly
1
感谢分享,@Adam Pierce!是否还有获取历史汇率的方法? - Aris
您也可以使用此链接。它是免费的。只需注册并获取API密钥。http://jsonrates.com/docs/ - Gajendra K Chauhan
请使用 https://currencylayer.com - 他们提供实时和历史汇率的 JSON 格式,以及一些 PHP 示例 (https://currencylayer.com/documentation)。 - Frank
我无法理解这个问题,但我仍然认为可以使用简单的JS自动生成货币汇率 - Jaffer Wilson
15个回答

70
你可以从雅虎获得简单格式的货币转换:
例如,将GBP转换为EUR: http://download.finance.yahoo.com/d/quotes.csv?s=GBPEUR=X&f=sl1d1t1ba&e=.csv

4
我也对这个感兴趣,有没有关于参数代表什么的信息?特别是那个"f"参数,我在任何地方都找不到相关信息。 - Fishcake
10
如果你拥有一个商业网站,阅读这些数据是否合法? - Junior Mayhé
4
进一步的实验表明,您可以通过在“s”参数中用逗号分隔符将符号分开,以请求多个转换率,例如:http://download.finance.yahoo.com/d/quotes.csv?s=NZDEUR=X,NZDAUD=X,NZDCAD=X&f=sl1d1t1ban&e=.csv。 - Myster
3
有什么方法可以指定一个日期吗? - Maxim Egorushkin
请参考https://dev59.com/HW025IYBdhLWcg3wzpeK#21627583,获取一个用于检索货币汇率的PHP类。 - Felix Geenen
显示剩余10条评论

41

这个回答来的非常晚,但以上回答中缺少了一个重要信息。

如果您想向客户展示准确的价格,理解外汇汇率如何工作是很重要的。

大多数外汇服务只报价即期汇率(Bid和Ask之间的中间价)。即期汇率是一种简写的汇率表示方法,但没有人获得即期汇率,因为您只能按卖出价或买入价进行交易。它们之间通常至少有1%的差距,因此即期汇率对于您的客户而言会偏离0.5%。

但这并不止于此,您的客户几乎肯定正在使用信用卡,Visa / Mastercard / Amex都会收取外汇费用。根据我的经验,这些费用并不小,至少为2.5%。例如,澳大利亚花旗银行收取3.3%的费用。由于这些费用因卡而异,因此无法预测最终会向客户收取的价格。

如果您想基于汇率向客户提供“准确”的价格,则需要考虑上述因素并提供缓冲区,以免向客户收取比您所报价更高的价格。

顺便说一句,我一直在将外汇转换所示的价格增加4%。


此外,外汇汇率一直在变化,银行可能只考虑当地时间午夜的汇率。由于每日波动约为2%,因此存在不确定性。 - Alexandre C.
1
这是一个很好的观点。如果您显示一种货币但收取另一种货币,那么肯定需要缓冲区。就我而言,通过我的4%填充,我从来没有遇到过任何人退款的情况。 - philoye
并不是所有的银行都会收取这样的费用。例如来自墨西哥的信用卡和借记卡只会按照当日货币售价进行货币转换,没有其他额外费用。 - Francisco Zarabozo

28

4
我刚刚查看了(在你发表评论20分钟后),对我来说是可用的。 - Jacco
我刚刚尝试使用它,但VB.NET拒绝正确地对其进行XPath。这是因为定义命名空间的URL都是404吗? - Rikki
这个链接总是显示昨天的汇率,而不是今天的。 - erkanyildiz

13

另一个非常棒的免费开源链接是:

https://raw.github.com/currencybot/open-exchange-rates/master/latest.json
(我在这里找到它: http://josscrowcroft.github.com/open-exchange-rates/

[更新]:
Open Exchange Rates项目数据已经从GitHub中移走。
可在此获取: http://openexchangerates.org/
JSON格式的数据可在此处获得:http://openexchangerates.org/latest.json

没有接入费用,没有汇率限制,没有丑陋的XML - 只有以JSON格式每小时更新的汇率。
现在不是完全免费了。新的许可证规定允许每月最多1000次请求,然后需要付费。如果您想使用单一货币转换器(基本功能),也需要付费。

[注意:您可能还想查看这个答案。]


2
也许它不再起作用了。 - shasi kanth
1
感谢@dskanth的提醒,链接和信息已更新。:) - zeFree
1
这里提供一个免费的OpenExchangeRates计划,每月可进行1000次请求。链接很小,所以在大多数情况下你可能看不到它。https://openexchangerates.org/signup/free - Robin Rodricks

13

我最近实现了同样的功能,但是使用了Google的API。查询URL看起来像这样:

http://www.google.com/ig/calculator?hl=en&q=1GBP=?USD

这个函数需要3个参数。第一个参数是金额,然后是你要转换的ISO 4217 货币代码、一个等于号和一个问号,以及你要转换成的货币代码。你可以在这里找到Google支持的代码列表here。查询的响应结果如下:

{lhs: "1 British pound",rhs: "1.6132 U.S. dollars",error: "",icc: true}

这很容易理解,所以我不会在这里详细讲解。以下是我处理查询响应的方式:

function convert_currency($amount, $from_code, $to_code){
    ini_set('max_execution_time', 60);
    $temp = 'http://www.google.com/ig/calculator?hl=en&q=' . $amount . $from_code . '=?' . $to_code;

    $response = file_get_contents($temp);
    $result_string = explode('"', $response);

    $final_result = $result_string['3'];

    $float_result = preg_replace("/[^0-9\.]/", '', $full_result);

    return $float_result;
}

我相信这并不是最优雅的做法,但我对PHP还不是很熟悉。希望能对你有所帮助!


2
如果你想让代码更加可靠,可以使用json_decode代替explode。 - diolemo
该服务有限制吗? - sites
这个太容易表述和使用了... 谢谢。 - IWIH
6
"iGoogle于2013年11月1日停止运营,您的应用程序不再可用。" - yegor256
我使用了类似的代码,只进行了两行代码更改,以使用Yahoo quotes.csv方法。 - Marcus

6
我在 YQL 中添加了开放数据表,您可以使用它从 yahoo.finance 检索汇率数据。

在 YQL 控制台中试用

逗号分隔的格式优于 "where pair in ('EURUSD','GBPUSD')",但无论如何,您都可以同时使用它们甚至混合使用。

谢谢,伙计。这个加上 PHP 的 YQL 文档对我帮助很大! - miCRoSCoPiC_eaRthLinG
你好,我们能否添加日期参数?例如,我想获取历史汇率。 - Elisa

4

4
很遗憾它是SOAP而不是REST。除此之外,它是一个有用的工具。 - David Arno
这个是免费和稳定的吗?我能否发布依赖于它的软件? - Moe
4
显然,他们在2008年12月31日停止了这项工作。 - Sevki

4

3

尝试一下 RESTful(我不确定这是否真的是REST,因为我最初从SOAP获取了它,我只是尝试使用HTTP GET访问它)


我没有看到你提供要转换的“数量”,但你却得到了一些数字... 你能解释一下吗? - SpokaneDude
1
它不接受任何金额。这只会将fromCurrency转换为toCurrency,其中fromCurrency的金额始终为一(1)。然后由您来制定转换您的金额的算法。 - Kevin

3

iGoogle于2013年11月1日停止使用,该API已不再可用。

要获取汇率,您可以使用类似以下的内容:

function get_exchange_rate($from, $to){
    $data = file_get_contents("http://www.google.com/ig/calculator?hl=en&q=1{$from}=?{$to}");
    preg_match('/rhs\:\s?"([0-9\.]+)/', $data, $m);
    return $m[1];
}

你可以在其中添加一个数据库缓存,以确保不会被限制等。

正如其他帖子/评论所指出的那样,然后您将使用此速率计算您的货币。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接