`

Java微信公众平台开发之获取地理位置

阅读更多

本部分需要用到微信的JS-SDK,微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包。

通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照、选图、语音、位置等手机系统的能力,同时可以直接使用微信分享、扫一扫、卡券、支付等微信特有的能力,为微信用户提供更优质的网页体验。

详细文档点击查看

一、JS-SDK引入

1.先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”,和网页授权一样只是个域名。

2.在需要调用JS接口的页面引入如下JS文件之一

<script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
<script src="https://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>

二、通过config接口注入权限验证配置

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

 

首先生成这个signature之前需要获取到一个临时票据jsapi_ticket,jsapi_ticket是公众号用于调用微信JS接口的临时票据。正常情况下,jsapi_ticket的有效期为7200秒,通过access_token来获取。由于获取jsapi_ticket的api调用次数非常有限,频繁刷新jsapi_ticket会导致api调用受限,影响自身业务,同样也需要个中控服务器控制刷新。

1、获取临时票据

封装返回结果
package com.phil.wechatauth.model.resp;

import com.phil.common.result.ResultState;

/**
 * jsapi_ticket是公众号用于调用微信JS接口的临时票据
 * @author phil
 * @date  2017年8月21日
 *
 */
public class JsapiTicket extends ResultState {

	/**
	 * 
	 */
	private static final long serialVersionUID = -357009110782376503L;
	
	private String ticket; //jsapi_ticket
	
	private String expires_in;

	public String getTicket() {
		return ticket;
	}

	public void setTicket(String ticket) {
		this.ticket = ticket;
	}

	public String getExpires_in() {
		return expires_in;
	}

	public void setExpires_in(String expires_in) {
		this.expires_in = expires_in;
	}
}
获取方法
	/**
	 * 获取jsapi_ticket 调用微信JS接口的临时票据
	 * @return
	 */
	public String getTicket(String accessToken) {
		JsapiTicket jsapiTicket = null;
		Map<String,String> params = new TreeMap<String,String>();
		params.put("access_token",accessToken);
		params.put("type", "jsapi");
		String result = HttpReqUtil.HttpDefaultExecute(HttpReqUtil.GET_METHOD, WechatConfig.GET_TICKET_URL, params,"");
		if(StringUtils.isNotBlank(result)){
			jsapiTicket = JsonUtil.fromJson(result, JsapiTicket.class);
		}
		if(jsapiTicket.getErrcode()==0){
			return jsapiTicket.getTicket();
		}
		return null;
	}

2、生成签名并返回参数

signature生成规则如下:参与签名的字段包括noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的URL,不包含#及其后面部分) 。对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1。这里需要注意的是所有参数名均为小写字符。对string1作sha1加密,字段名和字段值都采用原始值,不进行URL 转义。

string1示例如下

jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg&noncestr=Wm3WZYTPz0wzccnW×tamp=1414587457&url=http://mp.weixin.qq.com?params=value

这里有个坑,页面是nonceStr,但是签名的字段是noncestr,注意大小写

简单封装下JS-SDK config配置信息

package com.phil.wechatauth.model.resp;

/**
 * JS-SDK的页面配置信息
 * @author phil
 * @date 2017年8月22日
 *
 */
public class JsWechatConfig {

	private String appId;

	private long timestamp;

	private String noncestr;

	private String signature;

	public String getAppId() {
		return appId;
	}

	public void setAppId(String appId) {
		this.appId = appId;
	}

	public long getTimestamp() {
		return timestamp;
	}

	public void setTimestamp(long timestamp) {
		this.timestamp = timestamp;
	}

	public String getNoncestr() {
		return noncestr;
	}

	public void setNoncestr(String noncestr) {
		this.noncestr = noncestr;
	}

	public String getSignature() {
		return signature;
	}

	public void setSignature(String signature) {
		this.signature = signature;
	}
}

添加配置信息到页面

/**
 * 
 */
package com.phil.wechatauth.controller;

import java.util.SortedMap;
import java.util.TreeMap;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.phil.common.config.SystemConfig;
import com.phil.common.config.WechatConfig;
import com.phil.common.util.DateTimeUtil;
import com.phil.common.util.PayUtil;
import com.phil.common.util.SignatureUtil;
import com.phil.wechatauth.model.resp.JsWechatConfig;
import com.phil.wechatauth.service.WechatAuthService;

/**
 * JS-SDK
 * @author phil
 * @date  2017年8月21日
 *
 */
@Controller
@RequestMapping("/auth")
public class WechatAuthController {
	
	@Autowired
	private WechatAuthService wechatAuthService;
	
	/**
	 * 获取地理位置
	 * @param request
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/getLocation")
	public String getLocation(HttpServletRequest request) throws Exception{
		JsWechatConfig jsWechatConfig = new JsWechatConfig();
		jsWechatConfig.setAppId(WechatConfig.APP_ID);
		jsWechatConfig.setTimestamp(DateTimeUtil.currentTime());
		jsWechatConfig.setNoncestr(PayUtil.createNonceStr());
		SortedMap<Object,Object> map = new TreeMap<Object,Object>();
		map.put("jsapi_ticket", wechatAuthService.getTicket(wechatAuthService.findlastestToken()));
		map.put("noncestr", jsWechatConfig.getNoncestr());
		map.put("timestamp", jsWechatConfig.getTimestamp());
		map.put("url", request.getRequestURL().toString());
		String signature = SignatureUtil.createSha1Sign(map, null, SystemConfig.CHARACTER_ENCODING);
		jsWechatConfig.setSignature(signature);
		request.setAttribute("jsWechatConfig", jsWechatConfig);
		return "wechatauth/getLocation";
	}
}

签名方法

	/**
	 * 通过Map<SortedMap,Object>中的所有元素参与签名
	 * 
	 * @param map 待参与签名的map集合
	 * @params apikey apikey中 如果为空则不参与签名,如果不为空则参与签名
	 * @return
	 */
	public static String createSha1Sign(SortedMap<Object, Object> map, String apiKey, String characterEncoding) {
		String result = notSignParams(map, apiKey);
		MessageDigest md = null;
		try {
			md = MessageDigest.getInstance("SHA-1");
			byte[] digest = md.digest(result.getBytes());
			result = byteToStr(digest);
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		return result;
	}

其他的签名方法点击查看

三、通过ready接口处理成功验证

以上执行完成,进入的完整的页面

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>获取地理位置</title>
<!-- 微信 js-sdk -->
<script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
<link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css">
<script src="http://cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>
</head>
<body>
	<br>
	<div class="container">
		<div class="form-group">
			<label for="firstname" class="col-sm-2 control-label">地址:</label>
			<div class="col-sm-10" id="item-ifo">
				<input type="text" value="" class="form-control"
					name="location.address" id="address" placeholder="正在获取地理位置" tabindex="1" autocomplete="off" />
				<div class="i-name ico" id="i-name"></div>
			</div>
		</div>
	</div>

</body>
<script type="text/javascript">
	wx.config({
	    debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
	    appId: '${jsWechatConfig.appId}', // 必填,公众号的唯一标识
	    timestamp: '${jsWechatConfig.timestamp}' , // 必填,生成签名的时间戳
	    nonceStr: '${jsWechatConfig.noncestr}', // 必填,生成签名的随机串
	    signature: '${jsWechatConfig.signature}',// 必填,签名,见附录1
	    jsApiList: [ 'checkJsApi', 'openLocation', 'getLocation'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
	});
	
	wx.checkJsApi({
	    jsApiList: ['getLocation'], // 需要检测的JS接口列表,所有JS接口列表见附录2,
	    success: function(res) {
	    	if (res.checkResult.getLocation == false) {  
                alert('你的微信版本太低,不支持微信JS接口,请升级到最新的微信版本!');  
                return;  
         }
	    }
	});
	var latitude;  
    var longitude;  
    var speed;  
    var accuracy; 
	wx.ready(function(){
	    // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
		wx.getLocation({  
            success : function(res) {  
                latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90  
                longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。  
                speed = res.speed; // 速度,以米/每秒计  
                accuracy = res.accuracy; // 位置精度  
                alert(latitude);  
                alert(accuracy);
            },  
            cancel : function(res) {  
                alert('未能获取地理位置');  
            }
        });  
	});
	
	wx.error(function(res){
	    // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
		alert("验证出错");  
	});
</script>
</html>

可以通过微信官方提供的微信web开发者工具调试

分享到:
评论

相关推荐

    微信开发获取地理位置实例(java)

    微信开发获取地理位置实例(java),使用环境 eclipse + maven + springmvc,虽然项目名是first_maven_project,但是确实是微信开发实例哈,不要有任何怀疑,免费分享啦,哈哈。实例讲解欢迎访问博主博客...

    Java微信公众平台之获取地理位置

    主要为大家详细介绍了Java微信公众平台之获取地理位置的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    微信公众平台开发视频

    3. 微信公众平台开发之Struts2 (免费) 25:31 4. 微信公众平台开发之Spring MVC 27:12 5. 识别微信浏览器 24:40 6. 限制只允许微信浏览器访问 23:30 7. 一套程序服务多个账号---原始ID 17:46 8. 一套程序服务多个账号...

    微信公众平台开发 实例 java 开发资料

    在“微信公众平台开发 实例 java 开发资料”中,我们可以学习到以下几个核心知识点: 1. **微信公众平台基础**:了解微信公众平台的基本架构和工作原理,包括订阅号、服务号和企业号的区别,以及它们各自的功能和...

    微信公众平台应用开发java源码

    微信平台java版 还有自己实现的小游戏 自动回复的机器人 地理位置导航

    微信二次开发相关部分视频

    该视频是关于java微信开发微信验证、智能机器人、微信公众平台、微信订阅号自动回复接口和LBS地理位置定位等的相关视频。

    微信公众平台应用开发:方法、技巧与案例.(机械工业.柳峰)

    刘运强,网名“柳峰”,资深微信公众平台应用开发工程师,国内微信公众平台应用开发的先驱之一,项目经验丰富。他还是一位资深的Java软件开发工程师和Android/iOS移动应用开发工程师,活跃于CocoaChina、开源中国、...

    微信公众号的开发文档.docx

    微信公众号的开发文档是微信公众平台为开发者提供的一份详细指南,旨在帮助开发者了解公众平台的开发规则、API接口、开发流程和最佳实践等。以下是对微信公众号开发文档的主要内容和特点的概述: 一、开发文档概述 ...

    基于微信平台的疫情核酸预约小程序(完整源码)

    微信小程序提供了丰富的API接口,例如获取用户信息、网络请求、地理位置、支付功能等。在核酸预约场景中,可能需要调用地图API来定位最近的检测点,使用网络请求API向服务器发送预约请求。 6. **状态管理** 小...

    校园疫情防控管理平台微信小程序.zip

    开发者可以使用JavaScript、WXML(结构语言)和WXSS(样式语言)来编写小程序,同时,微信提供了丰富的API接口,如用户授权、地理位置、网络请求等,为构建校园疫情防控功能提供了强大的支持。 此项目中,微信小...

    JEECMS微信小程序 1.0.1.zip

    开发者可以通过微信开发者工具进行小程序的开发,利用其提供的API和组件来实现各种功能,如网络请求、地理位置、用户授权等。 **三、JEECMS与微信小程序的结合** JEECMS微信小程序的1.0.1版本,通过与JEECMS的API...

    微信机器人源代码.zip

    2. **消息类型与处理**:微信机器人需要识别并处理各种消息类型,包括文本、图片、语音、视频、地理位置等。开发者需要编写代码来解析这些消息,然后根据预设规则或算法进行响应。 3. **事件推送**:除了普通的消息...

    java乐器源码-weixinapi:Java实现的微信API接口SDK

    微信公众平台 相信大家也不陌生,官方网站提供了一个简单的php程序Demo 因为微信平台采用HTTP方式承载微信的协议,而且不是双向通讯,也就是说只能由微信服务器主动请求我们的服务器。其实当你使用我开发的weixinapi...

    基于微信小程序的纸张回收系统的设计与开发.docx

    总的来说,基于微信小程序的纸张回收系统设计与开发是一个集成了前端开发、后端开发、数据库设计、地理位置服务、用户体验设计、移动支付、积分系统等多个IT技术领域的综合性项目。通过这个系统,不仅能够提高纸张...

    微信小程序springboot微信小程序反诈科普平台的设计与实现论文+答辩ppt.rar

    在反诈科普平台的设计中,微信小程序起到了关键作用,使得用户能够随时随地获取反诈知识,提高了公众的防范意识。小程序的特性如即时推送、地理位置服务、社交网络集成等,都为反诈信息的传播提供了便利。 ...

    仿微信DEMO.zip

    微信小程序提供了一系列的API,包括地理位置、用户信息、支付、分享等,开发者可以通过调用这些API来实现各种功能。 9. **调试与发布** 微信开发者工具提供了一整套调试、预览和发布功能,可以帮助开发者高效地...

    基于springboot微信小程序学生宿舍管理系统源码.zip

    微信小程序提供了丰富的API接口,可以调用微信的支付、地理位置、用户信息等功能,适合开发轻量级、高效率的应用。在本项目中,微信小程序作为学生宿舍管理系统的前端,通过调用后端接口实现数据的增删查改和展示。 ...

    微信小程序精准扶贫数据收集小程序平台源码数据库论文.docx

    这要求我们收集并分析大量关于贫困人群的数据,包括但不限于家庭收入、健康状况、教育水平、地理位置等。在这一过程中,数据收集是至关重要的第一步。通过微信小程序,我们可以设计用户友好的界面,让贫困人口或基层...

    微信小程序悬赏信息发布系统源码数据库.doc

    - 支持按类别、关键字、地理位置等多种条件筛选任务。 ##### 4. 任务接单与完成 - 用户可查看悬赏任务详情,并选择接单。 - 提供任务完成状态追踪功能,便于双方确认任务进度与结果。 ##### 5. 评价与反馈机制 - ...

    地图定位微信小程序.rar

    这个小程序可能用于导航、位置分享或者其他与地理位置相关的服务。让我们深入了解一下这个项目的关键组成部分。 1. **源码**: 提到的标签 "源码" 指的是程序的原始代码,通常包括各种编程语言(如JavaScript、...

Global site tag (gtag.js) - Google Analytics