首页 > 解决方案 > 带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>

标签: javascriptphpgeolocation

解决方案


推荐阅读