微信公众号获取地理位置
<?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 > |