获取当前位置 (PHP)
我们通过 geolocation 函数来获取位置,如果出现相关权限问题或浏览器不支持,可以通过 Naver 提供的 API 来通过 IP 获取位置。
在使用之前,请通过以下地址获取 Naver 的 API 密钥。
(https://www.ncloud.com/product/applicationService/geoLocation)
<?
function makeSignature($secretKey, $method, $baseString, $timestamp, $accessKey)
{
$space = ' ';
$newLine = "
";
$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 = '请输入 accessKey。';
$secretKey = '请输入 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>正在计算位置...</title>
</head>
<body>
<div style="width: 100%; text-align: center; display: inline-block; ">
<p>我们正在计算用户的位置,以确保流畅的使用体验。</p>
<p>请您 <font color="RED"><strong>允许</strong></font> 位置确认权限。</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>











Leave a Reply