JAVA版 微信企业号开发 个人总结(微信网页授权例子,微信企业号精准定位,误差5-10米)
2017-03-16 12:17
495 查看
总路线
主要内容:案例微信网页授权,企业号精准定位(误差5-10米)
一、 access_token获取
二、 获取js-sdk的权限,票据jsapi_ticket
三、js-sdk的signature
四、js-sdk前台配置,获取精准的经纬度
五、额外附加 java定时器
后台进行sha1加密,用json格式返回前端,然前端进行处理
原理:ajax获取wx.config所需要的配置信息,配置成功后进行使用微信自带的定位功能获取经纬度,然后把获得的经纬度通过百度地图的坐标转换api的接口,从而获得在百度地图上获得比较精准的地理位置
执行顺序
wx.config>wx.ready
注意:js中的代码,注意必须先引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.1.0.js 和jq文件
使用注解进行定时调度,注意cron是时间
相关xml的配置
相关代码:
主要内容:案例微信网页授权,企业号精准定位(误差5-10米)
一、 access_token获取
二、 获取js-sdk的权限,票据jsapi_ticket
三、js-sdk的signature
四、js-sdk前台配置,获取精准的经纬度
五、额外附加 java定时器
一、 access_token获取
原理:获取公众号的corpid和corpsecret,对https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=你的corpid&corpsecret=你的corpsecret进行get请求,返回获取access_token,注意access_token的有效时间为7200秒,而请求access_token的次数是有限的,需要用定时器定时获取(后续讲述定时器,也可以用其他方法代替)/** * http GET请求封装 * * @param url * @return */ public static JSONObject doGet(String url) { DefaultHttpClient httpClient = new DefaultHttpClient(); HttpGet get = new HttpGet(url); JSONObject obj = new JSONObject(); try { HttpResponse response = httpClient.execute(get); HttpEntity entity = response.getEntity(); if (entity != null) { String result = EntityUtils.toString(entity, "utf-8"); obj = JSONObject.parseObject(result); } } catch (Exception e) { e.printStackTrace(); } return obj; } /** * 获取accesstoken,保存access_token * * @return */ public static String getToken() { String access_token = ""; String url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=你的corpid&corpsecret=你的corpsecret"; JSONObject obj = doGet(url); if (obj != null) { access_token = obj.getString("access_token"); //这里进行数据存储accesstoken或者全局缓存accesstoken //--------- //---------- } return access_token; }
二、 获取js-sdk的权限,票据jsapi_ticket
原理,通过access_token来换取jsapi_ticket/** * 获取js-sdk的权限,票据ticket * * @return */ public static String ticket() { String access_token = getToken();// 建议从数据库中获取,或者全局缓存中获取,这只是个本地的例子 JSONObject obj1 = doGet("https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=" + access_token); if (obj1 != null) { String jsapi_ticket = obj1.getString("ticket");// 全局缓存jsapi_ticket //这里进行数据存储jsapi_ticket或者全局缓存jsapi_ticket //--------- //---------- return jsapi_ticket; } return "fail"; }
三、js-sdk的signature
(后台)原理,java后台进行signature(主要进行sha1加密)后台进行sha1加密,用json格式返回前端,然前端进行处理
/** * 按照固定的排序方式进行sha1加密 * * @param url * 传递进来的url参数 * @return */ public static JSONObject signature(String url) { JSONObject obj = new JSONObject(); SimpleDateFormat sdFormat = new SimpleDateFormat("yyyyMMddhh"); // 时间戳格式化,必须取10位 String timestamp = sdFormat.format(new Date());// 当前时间戳 String noncestr = getRandom(9);// 9位随机数 String signature = "jsapi_ticket=" + WxUtil.ticket();// 获取数据 signature += "&" + "noncestr=" + noncestr; signature += "&" + "timestamp=" + timestamp; signature += "&" + "url=" + url; signature = SHA1(signature); obj.put("timestamp", timestamp); obj.put("signature", signature); obj.put("noncestr", noncestr); System.out.println("\n" + obj); return obj; } /** * @description: SHA、SHA1加密方法 @parameter: str:待加密字符串 @return: 加密串 **/ public static String SHA1(String str) { try { MessageDigest digest = java.security.MessageDigest.getInstance("SHA-1"); // 如果是SHA加密只需要将"SHA-1"改成"SHA"即可 digest.update(str.getBytes()); byte messageDigest[] = digest.digest(); // Create Hex String StringBuffer hexStr = new StringBuffer(); // 字节数组转换为 十六进制 数 for (int i = 0; i < messageDigest.length; i++) { String shaHex = Integer.toHexString(messageDigest[i] & 0xFF); if (shaHex.length() < 2) { hexStr.append(0); } hexStr.append(shaHex); } return hexStr.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return null; } /** * 生成一定位数的随机数 * * @param length * @return */ public static String getRandom(int length) { String allChar = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; StringBuffer sb = new StringBuffer(); Random random = new Random(); for (int i = 0; i < length; i++) sb.append(allChar.charAt(random.nextInt(allChar.length()))); return sb.toString(); }
四、js-sdk前台配置,获取精准的经纬度
前台,用js进行微信js-sdk的配置原理:ajax获取wx.config所需要的配置信息,配置成功后进行使用微信自带的定位功能获取经纬度,然后把获得的经纬度通过百度地图的坐标转换api的接口,从而获得在百度地图上获得比较精准的地理位置
执行顺序
wx.config>wx.ready
注意:js中的代码,注意必须先引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.1.0.js 和jq文件
var flag = false; var long = ''; var lat = ''; wx.ready(function() { getLocation(); }); function signature() { $.ajax({ url: '9', data: { 'url': "当前页面url,不包括url#后面的"}, type: "get", dataType: 'json', success: function(data) { // 可以参考微信企业号开发平台的js-sdk文档 wx.config({ appId: '你的cropid', // 必填,公众号的唯一标识 timestamp: data.timestamp, // 必填,生成签名的时间戳 nonceStr: data.noncestr, // 必填,生成签名的随机串 signature: data.signature, //必填,签名 jsApiList: ['openLocation', 'getLocation', 'chooseImage', 'uploadImage'] // 必填,需要使用的JS接口列表 }); flag = true; }, error: function(data) { alert('fail'); } }); } //使用微信自带的定位 function getLocation() { if(flag) { 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; // 位置精度 changeLocation(longitude, latitude); } }); } else { alert("flag not true"); signature(); getLocation(); } } //坐标转换API,Web服务API(百度api) function changeLocation(Long, Lat) { $.ajax({ url: "http://api.map.baidu.com/geoconv/v1/?coords=" + Long + "," + Lat + "&from=1&to=5&ak=你的密钥", type: "get", dataType: 'jsonp', success: function(data) { long = data.result[0].x; lat = data.result[0].y; //chooseImg(); }, error: function(data) { alert('fail'); } }); }
五、额外附加 定时器
配置xml文件使用注解进行定时调度,注意cron是时间
@Component public class TimeTask { /** * * 秒 0-59 , - * / * 分 0-59 , - * / * 小时 0-23 , - * / * 日期 1-31 , - * ? / L W C * 月份 1-12 或者 JAN-DEC , - * / * 星期 1-7 或者 SUN-SAT , - * ? / L C # * 年(可选)留空, 1970-2099 , - * / * cron = "0 0 0/1 * * ?"相当于每小时进行一次操作 * @throws Exception */ @Scheduled(cron = "0 0 0/1 * * ?") public void task() throws Exception { System.out.println("---------------------task start--------------------"); //调用你的获取access_token的方法,调用你的获取jsapi_ticket的方法 System.out.println("---------------------task end--------------------"); } }
相关xml的配置
相关代码:
<beans xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation=http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.2.xsd"> <!-- 设置定时任务 --> <task:annotation-driven/> </beans>
相关文章推荐
- 微信jsSDK 开发网页应用总结 java 端
- 微信公共号开发教程java版——微信网页授权(八)
- Java微信公众平台开发_05_微信网页授权
- java开发微信获取网页授权凭证
- [微信开发] 微信网页授权Java实现
- java微信开发API解析(七)-网页开发-微信网页授权
- java开发微信获取网页授权凭证
- C#微信公众号接口开发,灵活利用网页授权、带参数二维码、模板消息,提升用户体验之完成用户绑定个人微信及验证码获取
- [微信开发] 微信网页授权Java实现
- 关于微信网页授权开发总结整理
- Java企业微信开发_09_身份验证之移动端网页授权(有完整项目源码)
- [微信开发] 微信网页授权Java实现(https://www.cnblogs.com/lovebread/p/5513241.html)
- JAVA微信开发之网页授权
- C#微信公众号接口开发,灵活利用网页授权、带参数二维码、模板消息,提升用户体验之完成用户绑定个人微信及验证码获取
- 微信OAuth授权获取用户OpenId-JAVA(个人经验)
- 微信开发公共服务平台开发(.Net) - 网页授权获取用户基本信息
- 微信公共服务平台开发(.Net 的实现)13-------网页授权(下 :C#代码的实现 )
- 微信开发笔记——微信网页登录授权,获取用户信息
- 微信公共服务平台开发(.Net 的实现)13-------网页授权(下 :C#代码的实现 )