思路:1.先用微信sdk的定位功能,获取到用户的经纬度
2.把经纬度通过百度地图接口转换经纬度
3.通过百度地图接口,通过转换后的经纬度获取对应的位置信息
一.微信公众好SDK使用
步骤一:绑定域名
先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。
备注:登录后可在“开发者中心”查看对应的接口权限。
步骤二:引入JS文件
在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.2.0.js
备注:支持使用 AMD/CMD 标准模块加载方法加载
步骤三:通过config接口注入权限验证配置
所有需要使用JS-SDK的页面必须先注入配置信息,否则将无法调用(同一个url仅需调用一次,对于变化url的SPA的web app可在每次url变化时进行调用,目前Android微信客户端不支持pushState的H5新特性,所以使用pushState来实现web app的页面会导致签名失败,此问题会在Android6.2中修复)。
wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: '', // 必填,公众号的唯一标识
timestamp: , // 必填,生成签名的时间戳
nonceStr: '', // 必填,生成签名的随机串
signature: '',// 必填,签名
jsApiList: [] // 必填,需要使用的JS接口列表
});
步骤四:通过ready接口处理成功验证
wx.ready(function(){
// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
});
获取地理位置接口
wx.getLocation({
type: 'wgs84', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'
success: function (res) {
var latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90
var longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。
var speed = res.speed; // 速度,以米/每秒计
var accuracy = res.accuracy; // 位置精度
}
});
具体查看微信skd文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115
前端获取经纬度信息,通过ajax给接口处理。
// 定位功能
function location_weixin()
{
// 获取地理位置接口
wx.getLocation({
type: 'wgs84', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'
success: function (res) {
var latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90
var longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。
var speed = res.speed; // 速度,以米/每秒计
var accuracy = res.accuracy; // 位置精度
var openid = "<?=$openid?>";
$.ajax({
url:"../../2018_action/weixin_city_change/weixin_user_city_change_ajax.php",
type:'post',
data:{action:1,x:longitude,y:latitude,openid:openid},
success:function(res){
return false;
}
});
},
cancel:function(){
return false;
}
});
}
二 . 把微信经纬度转为百度
/**
* 经纬度转换
* @param
* int type 需要转换的目标类型
* int to 百度类型
* String $x,$y 经纬度
*/
function getXy($x,$y,$ak,$type,$to)
{
//调用百度地图接口
$apiUrl = "http://api.map.baidu.com/geoconv/v1/?coords={$x},{$y}&from={$type}&to={$to}&ak={$ak}";
$jsonData = curlHttp($apiUrl);
$data = json_decode($jsonData,true);
return $data;
}
三.利用经纬度,获取位置信息,百度地图key值需要去百度地图开放平台注册,创建应用。http://lbsyun.baidu.com/
/**
* @param
* $x $y 微信获取的经纬度
* $ak 百度地图key 通过注册成为开放者得到
*/
function getAddress1($x,$y,$ak){
//转换成百度认可的经纬度
$res = getXy($x,$y,$ak,1,5);
$y1 = $res['result'][0]['y'];
$x1 = $res['result'][0]['x'];
//调用百度地图接口
$apiUrl = "http://api.map.baidu.com/geocoder/v2/?location={$y1},{$x1}&output=json&ak={$ak}"; //百度地图接口地址
$jsonData = curlHttp($apiUrl); //curl 获取百度地理位置接口
$data = json_decode($jsonData,true); // 将返回的结果进行json处理
return $data;
}
/*curl*/
function curlHttp($url,$https = false,$post = false,$post_data = array())
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_HEADER,0);
/*是否post提交数据*/
if($post){
curl_setopt($ch,CURLOPT_POST,1);
if(!empty($post_data)){
curl_setopt($ch,CURLOPT_POSTFIELDS,$post_data);
}
}
/*是否需要安全证书*/
if($https){
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // https请求 不验证证书和hosts
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
}
$output = curl_exec($ch);
curl_close($ch);
return $output;
}