javascript - 带recaptcha 的地理位置无法在Safari 笔记本电脑上运行(navigator.geolocation)
问题描述
我正在构建一个从访问者那里收集坐标的应用程序。该数据在整个访问期间保存为会话变量,以向访问者提供最近的事件。
在谷歌浏览器上一切正常。只有笔记本电脑上的 Safari 和 Firefox 有问题。在 Safari 和 Firefox 上,我得到:“错误:访问被拒绝!” 这是 err.code == 1,在 Internet Explorer 上我得到“不正确的参数计数错误”。
我尝试了其他所有方法都没有成功。我知道地理定位仅适用于 wifi safari,但每次测试都是在 wifi 上完成的。
PHP代码:
session_start();
if((isset($_SESSION['page_name'])) && ($_SESSION['page_name']!="")) {
$new_page = $_SESSION['page_name']; }
else { $new_page = "eventlistings.php";}
class GoogleRecaptcha
{
/* Google recaptcha API url */
private $google_url = "https://www.google.com/recaptcha/api/siteverify";
private $secret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
public function VerifyCaptcha($response)
{
$url = $this->google_url."?secret=".$this->secret."&response=".$response;
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_TIMEOUT, 15);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
$curlData = curl_exec($curl);
curl_close($curl);
$res = json_decode($curlData, TRUE);
if($res['success'] == 'true')
return TRUE;
else
return FALSE;
}
}
$message = '';
if($_SERVER["REQUEST_METHOD"] == "POST")
{
unset($_SESSION['recaptcha']);
$response = $_POST['g-recaptcha-response'];
if(!empty($response)){
$cap = new GoogleRecaptcha();
$verified = $cap->VerifyCaptcha($response);
if($verified) {
$message = "Captcha Success!";
$_SESSION['recaptcha'] = date('m_d_y');
$_SESSION['userlatitude'] = $_POST['latitude'];
$_SESSION['userlongitude'] = $_POST['longitude'];
//$_SESSION['latitude'] = $_POST['latitude'];
//$_SESSION['longitude'] = $_POST['longitude'];
header("Location: ".$new_page); // Redirect browser
exit();
}
else { $message = "Please re-enter captcha"; }
}
else { $message = "Please enter captcha"; }
}
else {
if($_SESSION['recaptcha'] == date('m_d_y')){
//still today
header("Location: ".$new_page); // Redirect browser
exit();
}
else {
//destroy session
unset($_SESSION['recaptcha']);
}
}
Javascript代码:
<script type="text/javascript">
function showPosition(){
/* stop form from submitting normally */
event.preventDefault();
allowSubmit = false;
if(navigator.geolocation){
// timeout at 60000 milliseconds (60 seconds)
var options = {timeout:60000};
navigator.geolocation.getCurrentPosition(function(position){
var latitude = position.coords.latitude;
var longitude = position.coords.longitude;
document.getElementById("latitude").value = latitude;
document.getElementById("longitude").value = longitude;
$.ajax({
type:'POST',
url:'get-location.php',
data: $('form').serialize(),
success:function(msg){
if(msg){
$("#msg").html(msg);
allowSubmit = true;
document.forms["locform"].submit();
return true;
}else{
$("#msg").html('Not Available');
return false;
}
}
});
}, errorHandler, options);
} else{
alert("Sorry, your browser does not support HTML5 geolocation.");
}
}
function errorHandler(err) {
if(err.code == 1) { alert("Error: Access is denied!");}
else if( err.code == 2) { alert("Error: Position is unavailable!");}
}
</script>
获取位置.php
session_start();
$_SESSION['userlatitude'] = $_POST['latitude'];
$_SESSION['userlongitude'] = $_POST['longitude'];
echo " Geolocation Session Ready";
形式:
locform" method="post" action="" role="form" class="text-center" >
<div class="g-recaptcha" data-sitekey="xxxxxxxxxxxxxx" data-callback="verifyRecaptchaCallback" data-expired-callback="expiredRecaptchaCallback"></div>
<!-- CAPTURING GEOLOCATION -->
<input type="hidden" id="latitude" name="latitude" value="" style="display: inline;"/>
<input type="hidden" id="longitude" name="longitude" value="" style="display: inline;"/>
<input type="submit" class="btn btn-success btn-send" value="CONTINUE" onClick="showPosition();" >
</form>
<script src='https://www.google.com/recaptcha/api.js'></script>
解决方案
推荐阅读
- node.js - 尝试通过nodejs启动browerstacklocal时出现本地错误
- python - 如何使用 python 获取 Excel 工作表的“总编辑时间”属性?
- sql - 如何退回每位作者出版的第一本书?
- javascript - 当您导航回它时更新已安装的屏幕
- css - 如何在每行中最多渲染 4 个项目
- php - 创建一个带有 2 个图标的 png 图像
- c# - 关于代码访问安全性与不可验证代码的混淆
- regex - 如何使用 Beautiful Soup 检查 p 标签中是否存在电子邮件?
- javascript - 用户点击 angular6 后获取所有子对象 ID 的列表
- java - 以编程方式解决和下载依赖关系 - 无需中间常春藤文件