Kilho.net
IT

Lấy vị trí hiện tại (PHP)

Lấy vị trí thông qua hàm geolocation; nếu người dùng không cấp quyền hoặc trình duyệt không hỗ trợ, lấy vị trí dựa trên địa chỉ IP thông qua API do Naver cung cấp.

Trước khi sử dụng, hãy lấy khóa API của Naver tại địa chỉ bên dưới.
(https://www.ncloud.com/product/applicationService/geoLocation)

<? 
	function makeSignature($secretKey, $method, $baseString, $timestamp, $accessKey)
	{
		$space = ' ';
		$newLine = "\n";
		$hmac = $method.$space.$baseString.$newLine.$timestamp.$newLine.$accessKey;
		$signautue = base64_encode(hash_hmac('sha256', $hmac, $secretKey,true));
		return $signautue;
	}

	if($_POST['order'] == 'geolocation')
	{
		$hostNameUrl = 'https://geolocation.apigw.ntruss.com';
		$requestUrl= '/geolocation/v2/geoLocation';
		$accessKey = 'Vui lòng nhập accessKey.';
		$secretKey = 'Vui lòng nhập secretKey.';

		$ip = $_SERVER['REMOTE_ADDR'];
		$timestamp = round(microtime(true) * 1000);

		$baseString = $requestUrl.'?ip='.$ip.'&ext=t&responseFormatType=json';

		$signautue = makeSignature($secretKey, 'GET', $baseString, $timestamp, $accessKey);
		$url = $hostNameUrl.$baseString;

		$is_post = false;
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch, CURLOPT_POST, $is_post);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		$headers = array();
		$headers[] = 'X-NCP-APIGW-TIMESTAMP: '.$timestamp;
		$headers[] = 'X-NCP-IAM-ACCESS-KEY: '.$accessKey;
		$headers[] = 'X-NCP-APIGW-SIGNATURE-V2: '.$signautue;

		curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
		$response = json_decode(curl_exec ($ch), true);

		if($response['geoLocation'])
		{
			$lat = $response['geoLocation']['lat'];
			$lng = $response['geoLocation']['long'];
		}else{
			$lat = 37.535053;
			$lng = 127.147263;
		}

		echo json_encode(array('latitude'=>$lat, 'longitude'=>$lng));
		exit;
	}

?>
<html lang="ko">
<head>
	<meta charset="UTF-8">
	<title>Đang tính toán vị trí...</title>
</head>
<body>
<div style="width: 100%; text-align: center; display: inline-block; ">
	<p>Đang tính toán vị trí của bạn để bạn có thể sử dụng dịch vụ một cách thuận tiện.</p>
	<p>Vui lòng <font color="RED"><strong>cho phép</strong></font> quyền truy cập vị trí.</p>
</div>

<script>
	function setPositionByGeo(pos)
	{
		document.cookie = "latitude=" + pos.coords.latitude;
		document.cookie = "longitude=" + pos.coords.longitude;

		location.href = "<?=$_GET['url'] ? $_GET['url'] : '/'?>";
	}

	function setPositionByIP()
	{
		var xhr = new XMLHttpRequest();
		var dat = new FormData();

		dat.append("order", "geolocation");

		xhr.open("POST", window.location.pathname);
		xhr.send(dat);

		xhr.onload = function()
		{
			if(xhr.status === 200 || xhr.status === 201)
			{
				var res = JSON.parse(xhr.responseText);

				if(res.latitude&&res.longitude)
				{
					document.cookie = "latitude=" + res.latitude;
					document.cookie = "longitude=" + res.longitude;


					location.href = "<?=$_GET['url'] ? $_GET['url'] : '/'?>";
				}
			}
		};
	}

	window.onload = function() {
		if (navigator.geolocation)
			navigator.geolocation.getCurrentPosition(setPositionByGeo, setPositionByIP);
		else
			setPositionByIP();
	}
</script>
</body>
</html>

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *