Không biết các dev khác thế nào nhưng vói mình thì việc cần xác định quốc gia của người dùng thông qua địa chỉ IP là cực kì quan trọng. Mục đích có thể là để tìm kiếm ngôn ngữ phù hợp nhất, tìm cửa hàng gần vị trí của người dùng trên quốc gia (thông qua kinh độ, vĩ độ), xác định giới hạn phục vụ/ngăn chặn những quốc gia bạn không muốn website mình phục vụ hay đơn giản hoá thao tác nhập liệu của người dùng như tự động lựa chọn quốc gia, vùng miền tương ứng…
Trong đoạn mã dưới đây, mình giới thiệu bạn sử dụng thư viện IP IPInfoDb thông qua API của họ để xác định quốc gia, mã quốc gia, vùng miền, thành phố, kinh độ, vĩ độ của người dùng. Dĩ nhiên, tất cả đều dựa trên IP truy cập vào website bạn.
Lưu ý: dữ liệu IP có thể có một số sai khác so với dữ liệu thực tế do nhà mạng ở từng vùng cấp phát và khai báo. Nên mình không khuyến khích sử dụng các dữ liệu để “làm màu” với người dùng nếu không cần thiết nha !
Class PHP
<?php /** * This is a PHP class that will detect the client location using IpInfoDb API */ class IpInfoDb { private $appkey, $userip; function __construct($key) { $this->appkey = $key; $this->userip = $this->get_client_ip(); if (strlen($this->userip) < 6) { echo "<span style='color:red;border:solid 2px red;padding:4px;font-size:1.1em;'> Invalid IP address</span>"; exit(); } } private function get_client_ip() { $ipaddress = ''; if (getenv('HTTP_CLIENT_IP')) $ipaddress = getenv('HTTP_CLIENT_IP'); else if(getenv('HTTP_X_FORWARDED_FOR')) $ipaddress = getenv('HTTP_X_FORWARDED_FOR'); else if(getenv('HTTP_X_FORWARDED')) $ipaddress = getenv('HTTP_X_FORWARDED'); else if(getenv('HTTP_FORWARDED_FOR')) $ipaddress = getenv('HTTP_FORWARDED_FOR'); else if(getenv('HTTP_FORWARDED')) $ipaddress = getenv('HTTP_FORWARDED'); else if(getenv('REMOTE_ADDR')) $ipaddress = getenv('REMOTE_ADDR'); else $ipaddress = 'UNKNOWN'; return $ipaddress; } private function iiddecode() { $jsoncont = file_get_contents("http://api.ipinfodb.com/v3/ip-city/?key=" . $this->appkey. "&ip=" . $this->userip . "&format=json"); $getdecoded = json_decode($jsoncont, true); return $getdecoded; } public function city() { return $this->iiddecode()['cityName']; } //country public function country() { return $this->iiddecode()['countryName']; } // country code public function countrycode() { return $this->iiddecode()['countryCode']; } // regiom name public function region() { return $this->iiddecode()['regionName']; } // let from IP public function latFromIp() { return $this->iiddecode()['latitude']; } // lon from IP public function longFromIp() { return $this->iiddecode()['longitude']; } } ?> |
Ở đây 500 anh em chú ý dùm mình là biến $key được truyền trong hàm __construct() bạn cần đăng ký tài khoản API và nhận API từ ipinfodb.com. Dĩ nhiên, Free :D
Sử dụng class PHP
Sau khi tạo class chứa các hàm và thuộc tính cần thiết, bạn triển khai mã như sau:
<?php // Include the file contains the ClientLocation class include 'ClientLocation.php'; // Creating the object of ClientLocation class //Put your IPINFODB API KEY $obj = new IpInfoDb('IPINFODB_API_KEY'); // Display the city name echo $obj->city(); ?> |
Class trên cung cấp cho bạn các dữ liệu sau:
- Lattitude(vĩ độ): latFromIp()
- Longitude(kinh độ): longFromIp()
- Region: region()
- Country code: countrycode()
- Country name: country()
- City name: city()
Đấy, khi đã lấy được đống dữ liệu này rồi mình tin rằng bạn có thể làm được khối việc. Việc triển khai code và sử dụng cũng khá đơn giản.