最近公司要我做一个微信上班打卡的功能,因此要获取到当前微信用户的地理位置,根据地理位置来判断是否到公司地理位置的范围,因此写了这篇文章,微信上的设置我就不赘述了:第一是要开启获取地理位置功能 第二:是要设置安全域名,这里在上一篇文章(thinkphp5.0微信开发之获取微信用户信息)中已经写得比较详细了,嘿嘿嘿,没看的自己去瞧瞧哈!下面我们start...
我在application下新建了个service模块专门来处理第三方类,当然大伙也可以放在其他的地方根据个人喜好来!还是上一篇文章说道的,帖个图
新建一个类Location.php 我直接贴代码,要用大伙自己复制下就OK!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | <?php class Locatin{ 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×tamp=$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, true); curl_setopt( $curl , CURLOPT_SSL_VERIFYHOST, true); 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 ); } } |
然后我们直接调用方法即可
1 2 3 4 5 | public function getLocation(){ $jssdk = new Location( "your appID" , "your appSecret" ); //实例化引入文件的类,并将2个参数传进去,自己在微信公众后台看 $signPackage = $jssdk ->GetSignPackage(); //获取jsapi_ticket,生成JS-SDK权限验证的签名。 return view( 'getLocation' ,[ 'signPackage' =>signPackage]); } |
然后我再帖下前端的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.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);//弹出经纬度,就这样就获取到了用户的位置 }, cancel: function (res) { alert('用户拒绝授权获取地理位置'); } }); }); </ script > </ html > |
就这样前端就能获取到当前微信用户的地理位置了!
友情提示:垃圾评论一律封号...