微信公众号,JS-SDK获取位置信息,并调起第三方地图App导航

微信公众号关联网页获取位置信息,可以参照《微信公众平台技术文档》-> 微信JS-SDK说明文档,官方链接地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115

步骤一:绑定域名

先登录微信公众平台进入“公众号设置”的“功能设置”里填写“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中修复)。签名算法见文末的附录1,所有JS接口列表见文末的附录2

[html]  view plain  copy
  1. wx.config({  
  2.     debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。  
  3.     appId: '', // 必填,公众号的唯一标识  
  4.     timestamp: , // 必填,生成签名的时间戳  
  5.     nonceStr: '', // 必填,生成签名的随机串  
  6.     signature: '',// 必填,签名  
  7.     jsApiList: [] // 必填,需要使用的JS接口列表  
  8. });  

步骤四:通过ready接口处理成功验证

[html]  view plain  copy
  1. wx.ready(function(){  
  2.     // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。  
  3. });  

步骤五:通过error接口处理失败验证

[html]  view plain  copy
  1. wx.error(function(res){  
  2.     // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。  
  3. });  

地理位置

使用微信内置地图查看位置接口

wx.openLocation({
latitude: 0, // 纬度,浮点数,范围为90 ~ -90
longitude: 0, // 经度,浮点数,范围为180 ~ -180。
name: '', // 位置名
address: '', // 地址详情说明
scale: 1, // 地图缩放级别,整形值,范围从1~28。默认为最大
infoUrl: '' // 在查看位置界面底部显示的超链接,可点击跳转
});

获取地理位置接口

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; // 位置精度
}
});

代码示例:

nav.js

//获取浏览器信息
var browser = {
	ua : function() {
		var u = navigator.userAgent;
		var isChrome = u.match(/Chrome\/([\d.]+)/)
				|| u.match(/CriOS\/([\d.]+)/);
		var isAndroid = u.match(/(Android);?[\s\/]+([\d.]+)?/);
		var iosVersion = function() {
			if (/iP(hone|od|ad)/.test(navigator.platform)) {
				var v = (navigator.appVersion).match(/OS (\d+)_(\d+)_?(\d+)?/);
				return [ parseInt(v[1], 10), parseInt(v[2], 10),
						parseInt(v[3] || 0, 10) ];
			}
		}();
		var chromeVersion = function() {
			var chrome = navigator.userAgent.match(/Chrome\/(\d+)\./);
			if (chrome) {
				return parseInt(chrome[1], 10);
			}
		}();
		var ios9 = iosVersion && iosVersion[0] >= 9;
		var chrome18 = isChrome && isAndroid && chromeVersion
				&& chromeVersion > 18;
		return { // 移动终端浏览器版本信息
			trident : u.indexOf('Trident') > -1, // IE内核
			presto : u.indexOf('Presto') > -1, // opera内核
			webKit : u.indexOf('AppleWebKit') > -1, // 苹果、谷歌内核
			gecko : u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1, // 火狐内核
			mobile : !!u.match(/AppleWebKit.*Mobile.*/), // 是否为移动终端
			iOS : !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), // ios终端
			android : u.indexOf('Android') > -1 || u.indexOf('Linux') > -1, // android终端或uc浏览器
			iPhone : u.indexOf('iPhone') > -1, // 是否为iPhone或者QQHD浏览器
			iPad : u.indexOf('iPad') > -1, // 是否iPad
			webApp : u.indexOf('Safari') == -1, // 是否web应该程序,没有头部与底部
			weChat : u.indexOf('MicroMessenger') > -1,
			UC : u.indexOf('UCBrowser') > -1,
			u3 : u.indexOf('U3') > -1,
			chrome : u.indexOf('Chrome') > -1,
			windowsPhone : u.indexOf("Windows Phone") > -1,
			samsung : u.indexOf("Samsung") > -1,
			QQ : (u.match(/\sQQ/i) != null ? u.match(/\sQQ/i).toLowerCase() == " qq"
					: false),
			isChrome : isChrome,
			isAndroid : isAndroid,
			iosVersion : iosVersion,
			chromeVersion : chromeVersion,
			ios9 : ios9,
			chrome18 : chrome18
		};
	}()
}
var ua = browser.ua;

// 打开地图App,开始导航
function openMapApp(lat, lng, addr) {
	// 地图uri api数组
	var uri = new Array();
	if (ua.android) {
		// 百度地图uri api
		uri[0] = "bdapp://map/navi?location=" + lat + "," + lng + "&query="
				+ addr;
		// 高德地图uri api
		uri[1] = "androidamap://navi?sourceApplication=xlwx&poiname=" + addr
				+ "&lat=" + lat + "&lon=" + lng + "&dev=1&style=2";
		// 腾讯地图uri api
		uri[2] = "qqmap://map/marker?marker=coord:" + lat + "," + lng
				+ ";title:" + addr + "&referer=xlwx";
	} else if (ua.iOS) {
		// 百度地图uri api
		uri[0] = "baidumap://map/navi?location=" + lat + "," + lng + "&query="
				+ addr;
		// 高德地图uri api
		uri[1] = "iosamap://navi?sourceApplication=xlwx&poiname=" + addr
				+ "&lat=" + lat + "&lon=" + lng + "&dev=1&style=2";
		// 腾讯地图uri api
		uri[2] = "qqmap://map/marker?marker=coord:" + lat + "," + lng
				+ ";title:" + addr + "&referer=xlwx";
		// 苹果地图uri api
		uri[3] = "http://maps.apple.com/?sll=" + lat + "," + lng + "&address="
				+ addr;
	}
	//调用uri	
	if(uri.length == 0){
		return;
	}
	window.location.href = uri[0];
	//启动定时器time1
	var time1 = setTimeout(function() {
		// 若启动应用,则js会被中断较长时间,超出此范围
		window.location.href = uri[1];
	}, 2000);
	//启动定时器time2
	var time2 = setTimeout(function() {
		// 若启动应用,则js会被中断较长时间,超出此范围
		window.location.href = uri[2];
	}, 4000);
	//清除定时器
	window.beforeunload = function() {
		if(time1 != null){
			clearTimeout(time1);
		}
		if(time2 != null){
			clearTimeout(time2);
		}		
	}
	window.pagehide = function() {
		if(time1 != null){
			clearTimeout(time1);
		}
		if(time2 != null){
			clearTimeout(time2);
		}
	}
	window.onblur = function() {
		if(time1 != null){
			clearTimeout(time1);
		}
		if(time2 != null){
			clearTimeout(time2);
		}
	}
}
map.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.*,com.wx.util.*"%>





获取位置信息









<%  
Map ret = new HashMap();  
String url = request.getScheme() + "://" + request.getServerName() + "/map";
ret = JsSignUtil.sign(url);
%>







  • 最少时间
  • 最短距离
  • 不走高速
  • 躲避拥堵

北京

2.0公里 | 12分钟

完!!!

你可能感兴趣的:(微信公众号,javaweb,js)