Thinkphp5.0 微信获取当前地理位置+坐标纠偏并获取详细地址

  • 4,330

以下代码是由Thinkphp5.0 微信网页获取用户当前地理位置[亲测无BUG]GPS坐标互转:WGS-84(GPS)、GCJ-02(Google地图)、BD-09(百度地图) 合并而成!都知道微信网页授权获取的定位是gps坐标[国际标准]。跟谷歌[GCJ-02]百度[BD-09]是有一定的偏差(因为是经过加密合成的也算是为了国家安全起见吧,详细请自行百度)。从而经过一系列的运算才会得出准确的定位!废话不多说上代码:

Thinkphp5.0 微信获取当前地理位置+坐标纠偏并获取详细地址

 

public function getLocation(){
    $jssdk = new Location("你的appid", "你的AppSecret"); //实例化引入文件的类,并将2个参数传进去,自己在微信公众后台看
    $signPackage = $jssdk->GetSignPackage(); //获取jsapi_ticket,生成JS-SDK权限验证的签名。
    return view('getLocation',['signPackage'=>$signPackage]);
    }
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
    <script src="http://libs.baidu.com/jquery/1.11.3/jquery.min.js"></script>
    <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
    <script type="text/javascript" src="http://developer.baidu.com/map/jsdemo/demo/convertor.js"></script>
    <script>
  <!--通过config接口注入权限验证配置,文档上有详细的说明-->
  wx.config({
    debug: false,
    appId: '<?php echo $signPackage["appId"];?>',
    timestamp: <?php echo $signPackage["timestamp"];?>,
    nonceStr: '<?php echo $signPackage["nonceStr"];?>',
    signature: '<?php echo $signPackage["signature"];?>',
    jsApiList: [
      // 所有要调用的 API 都要加到这个列表中
        'checkJsApi',
                'openLocation',
                'getLocation'
    ]
  });
<!--通过ready接口处理成功验证-->
  wx.ready(function () {
    // 在这里调用 API
<!--通过checkJsApi判断当前客户端版本是否支持指定获取地理位置-->
    wx.checkJsApi({
        jsApiList: [
            'getLocation'
        ],
        success: function (res) {
            // alert(JSON.stringify(res));
            // alert(JSON.stringify(res.checkResult.getLocation));
            if (res.checkResult.getLocation == false) {
                alert('你的微信版本太低,不支持微信JS接口,请升级到最新的微信版本!');
                return;
            }
        }
    });

    <!--使用getLocation接口获取地理位置坐标-->
    wx.getLocation({
    success: function (res) {
        var latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90
        var longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。
        var speed = res.speed; // 速度,以米/每秒计
        var accuracy = res.accuracy; // 位置精度

        //alert('纬度位置:'+latitude+'经度位置:'+longitude+'位置精度:'+accuracy+'速度:'+speed);//弹出经纬度,就这样就获取到了用户的位置
        //转换坐标
        $.getJSON('http://ipao.150643.com/aaa.php?a='+latitude+'&b='+longitude+'', function(jiekou){
        var at = jiekou.lat;
        var ot = jiekou.lon;

        //谷歌坐标查询
        $.getJSON("http://www.google.cn/maps/api/geocode/json?latlng="+at+","+ot+"&sensor=true", function(json){
        var json = json.results;
        var obj = eval(json);
        alert(obj[0].formatted_address);
        });


        });



    },
    cancel: function (res) {
        alert('用户拒绝授权获取地理位置');
    }
    });
  });
</script>
<!-- <script type="text/javascript">
$.getJSON("http://www.google.cn/maps/api/geocode/json?latlng="+latitude+","+longitude+"&sensor=true", function(json){
var json = json.results;
var obj = eval(json);
alert(obj[0].formatted_address);
});
</script> -->
  </head>
  <body>
    <div class="">
      <p>好看的</p>
    </div>

  </body>
</html>
<?php
namespace first\second;
class Location{
    private $appId;
    private $appSecret;
    public function __construct($appId, $appSecret) {
        $this->appId = $appId;
        $this->appSecret = $appSecret;
    }
    public function getSignPackage() {
        $jsapiTicket = $this->getJsApiTicket();
        // 注意 URL 一定要动态获取,不能 hardcode.
        $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
        $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
        $timestamp = time();
        $nonceStr = $this->createNonceStr();
        // 这里参数的顺序要按照 key 值 ASCII 码升序排序
        $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$url";
        $signature = sha1($string);
        $signPackage = array(
            "appId"     => $this->appId,
            "nonceStr"  => $nonceStr,
            "timestamp" => $timestamp,
            "url"       => $url,
            "signature" => $signature,
            "rawString" => $string
        );
        return $signPackage;
    }
    private function createNonceStr($length = 16) {
        $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        $str = "";
        for ($i = 0; $i < $length; $i++) {
            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
        }
        return $str;
    }
    private function getJsApiTicket() {
        // jsapi_ticket 应该全局存储与更新,以下代码以写入到文件中做示例
        $data = json_decode($this->get_php_file("../jsapi_ticket.php"));
        if ($data->expire_time < time()) {
            $accessToken = $this->getAccessToken();
            // 如果是企业号用以下 URL 获取 ticket
            // $url = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=$accessToken";
            $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken";
            $res = json_decode($this->httpGet($url));
            $ticket = $res->ticket;
            if ($ticket) {
                $data->expire_time = time() + 7000;
                $data->jsapi_ticket = $ticket;
                $this->set_php_file("jsapi_ticket.php", json_encode($data));
            }
        } else {
            $ticket = $data->jsapi_ticket;
        }
        return $ticket;
    }
    private function getAccessToken() {
        // access_token 应该全局存储与更新,以下代码以写入到文件中做示例
        $data = json_decode($this->get_php_file("../access_token.php"));
        if ($data->expire_time < time()) {
            // 如果是企业号用以下URL获取access_token
            // $url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$this->appId&corpsecret=$this->appSecret";
            $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret";
            $res = json_decode($this->httpGet($url));
            $access_token = $res->access_token;
            if ($access_token) {
                $data->expire_time = time() + 7000;
                $data->access_token = $access_token;
                $this->set_php_file("access_token.php", json_encode($data));
            }
        } else {
            $access_token = $data->access_token;
        }
        return $access_token;
    }
    private function httpGet($url) {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 500);
        // 为保证第三方服务器与微信服务器之间数据传输的安全性,所有微信接口采用https方式调用,必须使用下面2行代码打开ssl安全校验。
        // 如果在部署过程中代码在此处验证失败,请到 http://curl.haxx.se/ca/cacert.pem 下载新的证书判别文件。
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($curl, CURLOPT_URL, $url);
        $res = curl_exec($curl);
        curl_close($curl);
        return $res;
    }
    private function get_php_file($filename) {
        return trim(substr(file_get_contents($filename), 15));
    }
    private function set_php_file($filename, $content) {
        $fp = fopen($filename, "w");
        fwrite($fp, "<?php exit();?>" . $content);
        fclose($fp);
    }
}

 

weinxin
我的微信
这是我的微信扫一扫
开拓者博主
  • 本文由 发表于 2017年9月10日12:37:30
  • 转载请务必保留本文链接:https://www.150643.com/458.html
匿名

发表评论

匿名网友 填写信息

评论:4   其中:访客  2   博主  2
    • 韭菜韭菜 韭菜韭菜 0

      非常不错!!

      • 1111 1111 0

        这个文件是什么: jsapi_ticket.php ,里面的代码是怎样的

          • 开拓者博主 开拓者博主

            @ 1111 这个地方是存储 access_token的,建议自己单独创建一个表储存或者用redius或者memcached都是可以的