3

我知道有许多服务提供地理定位工具来确定用户从哪里访问。我正在开发的网站是一个在多个地区运行的电子商务网站。当访问者访问网站时,它应该确定他们来自哪里,并为用户显示相关的货币/语言。

过去我们使用过maxmind,但我想知道是否有更好的解决方案。我呼吁在该领域具有经验的开发人员分享他们的知识和专业知识,了解可用的解决方案以及各种解决方案的优缺点。

附加信息:有问题的网站主要在 Java (Spring) 和 PHP (Kohana) 的组合上运行,因此也可以考虑其中任何一个的库。如果我们可以获得访问者所在国家/地区的 ISO 代码,我们已经有一个解决方案来确定使用哪种货币。


更新
以为我会为访问此问题的任何人留下一个粗略的结果解释。

地理位置:我已经使用 freegoip 来检测用户位置,如该线程中所建议的那样。
语言:在确定用户使用哪种语言时,我使用 PHP 检查用户浏览器中设置的语言:http ://www.php.net/manual/en/function.http-negotiate-language.php

4

6 回答 6

1

在我工作的一个小型电子商务网站上,我们使用 Akamai 提供地理定位数据,这些数据将根据访问者所处的状态提供定制的广告和价格。查看更多信息:http ://www.akamai.com/ html/技术/产品/personalization.html

于 2012-07-06T17:55:03.450 回答
1

IPGeolocation将是您更好的选择。他们建立自己的数据库并每周更新两次数据库。他们在国家一级有 99% 的准确率,在城市一级有 75% 的准确率。他们还提供付费和免费(每天 1000 个请求)API 计划,您可以在此处查看:https ://ipgeolocation.io/pricing.html 。

为了方便开发人员,IPGeolocation API 提供了一些适用于各种编程语言的 SDK:

获取 IP 地址地理位置信息的端点:
此端点旨在从服务器端调用。

$ curl 'https://api.ipgeolocation.io/ipgeo?apiKey=API_KEY&ip=8.8.8.8'

JSON 响应将是:

{
    "ip": "8.8.8.8",
    "hostname": "google-public-dns-a.google.com",
    "continent_code": "NA",
    "continent_name": "North America",
    "country_code2": "US",
    "country_code3": "USA",
    "country_name": "United States",
    "country_capital": "Washington",
    "state_prov": "California",
    "district": "",
    "city": "Mountain View",
    "zipcode": "94043",
    "latitude": "37.4229",
    "longitude": "-122.085",
    "is_eu": false,
    "calling_code": "+1",
    "country_tld": ".us",
    "languages": "en-US,es-US,haw,fr",
    "country_flag": "https://ipgeolocation.io/static/flags/us_64.png",
    "isp": "Level 3 Communications",
    "connection_type": "",
    "organization": "Google Inc.",
    "geoname_id": "5375480",
    "currency": {
        "code": "USD",
        "name": "US Dollar",
        "symbol": "$"
    },
    "time_zone": {
        "name": "America/Los_Angeles",
        "offset": -8,
        "current_time": "2019-01-14 03:30:00.135-0800",
        "current_time_unix": 1547465400.135,
        "is_dst": false,
        "dst_savings": 1
    }
}

您还可以从整个响应中过滤特定参数。

获取访问者的位置后,您还可以使用以下简单代码根据他的语言/货币将他重定向到页面:

var request = new XMLHttpRequest(); 
request.onreadystatechange = function() { 
if (4 === this.readyState && 200 === this.status) { 
var json = JSON.parse(this.responseText); 
if (json.country_code2 == "FR" && window.location.hostname !== "http://fr.exmaple.com") { 
window.location.href = "https://fr.exmaple.com"; 
} else if (json.country_code2 == "US" && window.location.hostname !== "http://us.exmaple.com") { 
window.location.href = "https://us.exmaple.com"; 
} else if (json.country_code2 == "UK" && window.location.hostname !== "http://uk.exmaple.com") { 
window.location.href = "https://uk.exmaple.com"; 
}else { 
window.location.href = "https://exmaple.com"; 
} 
} 
} 
request.open("GET", "https ://api.ipgeolocation.io/ipgeo?apiKey=YOUR_API_KEY&fields=country_code2", false); 
request.setRequestHeader("Accept", "application/json"); 
request.send(); 

我希望这将是您的最佳选择。

于 2020-10-20T07:37:29.847 回答
0

我一直在从事一个需要地理定位的项目,不幸的是,我发现大多数服务都在MaxMind数据库上工作,最后我使用了 freegeoip,免费且迄今为止在我所在的地区精确。

问候。

于 2012-07-06T18:05:28.630 回答
0

对于语言,它应该来自浏览器。这比地理定位更有用、更准确。

例如,如果您带着笔记本电脑旅行并使用互联网,您可能希望以您所在国家的母语而不是您所在国家的母语来查看内容。

查看这个问题以获取更多信息:Checking browser's language by PHP?

于 2012-07-06T18:35:22.613 回答
0

另一种选择是http://ipinfo.io API(我自己的服务)。这是 API 返回的示例。

$ curl ipinfo.io/8.8.8.8
{
  "ip": "8.8.8.8",
  "hostname": "google-public-dns-a.google.com",
  "loc": "37.385999999999996,-122.0838",
  "org": "AS15169 Google Inc.",
  "city": "Mountain View",
  "region": "CA",
  "country": "US",
  "phone": 650
}

您还可以查询特定字段,例如本示例中的国家/地区:

$ curl ipinfo.io/8.8.8.8/country
US

更多详细信息,请访问http://ipinfo.io/developers。每天最多 1,000 个请求是免费的,您还可以注册付费计划(请参阅http://ipinfo.io/pricing

于 2014-08-31T22:01:50.070 回答
0

正如我提到的,我们为这个确切的用例构建了https://ipdata.co

$ip = '78.8.53.5';
$details = json_decode(file_get_contents("https://api.ipdata.co/{$ip}"));

这将返回

{
    "ip": "78.8.53.5",
    "city": "G\u0142og\u00f3w",
    "region": "Lower Silesia",
    "country_name": "Poland",
    "country_code": "PL",
    "continent_name": "Europe",
    "continent_code": "EU",
    "latitude": 51.663,
    "longitude": 16.0757,
    "asn": "AS12741",
    "organisation": "Netia SA",
    "postal": "67-200",
    "currency": "PLN",
    "currency_symbol": "z\u0142",
    "calling_code": "48",
    "flag": "https://ipdata.co/flags/pl.png",
    "time_zone": "Europe/Warsaw"
}

这有许多电子商务相关的数据点,特别是

  • 货币符号
  • 货币代码
  • 国家标志图标
  • 国家电话代码

货币符号z\u0142是兹罗提的 ASCII

于 2017-11-06T16:45:04.327 回答