微信公众号开发之获取地理位置接口
来源:互联网 发布:混元一气太乙金仙 知乎 编辑:程序博客网 时间:2024/05/19 04:51
调用微信地理位置接口,需要用到微信的JSSDK,这是微信的介绍:
微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包。
通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照、选图、语音、位置等手机系统的能力,同时可以直接使用微信分享、扫一扫、卡券、支付等微信特有的能力,为微信用户提供更优质的网页体验。
JSSDK使用步骤:
步骤一:绑定域名
先登录微信公众平台进入“公众号设置”的“功能设置”里填写“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: '',// 必填,签名,见附录1
jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});
步骤四:通过ready接口处理成功验证
wx.ready(function(){
// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
});
步骤五:通过error接口处理失败验证
wx.error(function(res){
// config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
});
这里调用地图接口,是wx.openLocation和wx.getLocation,对wx.config进行配置, jsApiList: []中填这两个接口,其中签名需要在后台进行。
下面介绍如何配置config,一定要注意参数名的大小写,不能错!:
1、appId就不用说了,就是公众号的appId,timestamp是时间戳,生成签名用,这里单位是秒。
/** * 获取当前时间戳,单位秒 * @return */ public static long getCurrentTimestamp() { return System.currentTimeMillis()/1000; } /** * 获取当前时间戳,单位毫秒 * @return */ public static long getCurrentTimestampMs() { return System.currentTimeMillis(); }2、nonceStr,生成签名的随机字符串
/** * 获取随机字符串 Nonce Str * * @return String 随机字符串 */ public static String generateNonceStr() { return UUID.randomUUID().toString().replaceAll("-", "").substring(0, 32); }
3、signature,按照微信的签名算法,签名需要的参数noncestr-随机串,jsapi_ticket-临时票据,timestamp-时间戳,url-调用js接口的页面地址,绝对路径,形成签名的方法,分为二步
(1)获取access_token,这个access_token有一个过时的问题,有效时间7200秒,而获取access_token每天限制为100000次,所以,我是把access_token存到数据库里,每次用的时候查询一下上次更新的时间是否有超过7200秒,这个时间可以设置的小一些,用来避免临界7200秒的问题,如果超过7200秒再重新请求一次,再更新数据库存入更新的时间。获取到access_token后,再用access_token获取临时票据ticket,就是上面的jsapi_ticket。
public static Map<String,String> getTicket() throws ClientProtocolException, IOException{Map<String,String> map = new HashMap<String,String>();String turl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+ConfigUtil.APPID+"&secret="+ConfigUtil.APP_SECRECT;JSONObject jsonObject = AuthUtil.doGetJson(turl);String access_token = jsonObject.optString("access_token"); String expires_in = String.valueOf(jsonObject.optInt("expires_in"));String turl2 = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+access_token+"&type=jsapi";JSONObject jsonObject1 = AuthUtil.doGetJson(turl2);String ticket = jsonObject1.optString("ticket");map.put("expires_in", expires_in);map.put("access_token", access_token);map.put("ticket", ticket);return map;}
public static JSONObject doGetJson(String url) throws ClientProtocolException, IOException{JSONObject jsonObject = null;DefaultHttpClient client = new DefaultHttpClient();HttpGet get = new HttpGet(url);HttpResponse response = client.execute(get);HttpEntity entity = response.getEntity();if(entity!=null){String result = EntityUtils.toString(entity, "UTF-8");jsonObject = JSONObject.fromObject(result);}get.releaseConnection();return jsonObject;}
(2)四个参数形成签名,把四个参数用key=value形成四个字符串,然后对其字典序排序,按照顺序用‘&’连接起来,形成一个字符串对其sha1加密,形成签名signature。
public static String getSign(String timestamp,String noncestr,String jsapi_ticket,String url){String arr[] =new String[] {"jsapi_ticket="+jsapi_ticket,"noncestr="+noncestr,"timestamp="+timestamp,"url="+url};Arrays.sort(arr);//字典序排序 String str = "";str = arr[0]+"&"+arr[1]+"&"+arr[2]+"&"+arr[3]; System.out.println(str);String mParms = null;//sha1加密 MessageDigest digest = null; try { digest = java.security.MessageDigest.getInstance("SHA"); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } digest.update(str.getBytes()); byte messageDigest[] = digest.digest(); // Create Hex String StringBuffer hexString = new StringBuffer(); for (int i = 0; i < messageDigest.length; i++) { String shaHex = Integer.toHexString(messageDigest[i] & 0xFF); if (shaHex.length() < 2) { hexString.append(0); } hexString.append(shaHex); } mParms = hexString.toString(); return mParms; }public static String byteToStr(byte[] byteArray){String str = "";for(int i=0;i<byteArray.length;i++){str += byteToHexStr(byteArray[i]); }return str;} public static String byteToHexStr(byte mbyte){char[] Digit = {'1','2','3','4','5','6','7','8','9','0','A','B','C','D','E','F'};char[] tempArr = new char[2];tempArr[0] = Digit[(mbyte >>> 4) & 0X0F]; tempArr[1] = Digit[mbyte & 0X0F]; String s = new String(tempArr); return s; }
- 微信公众号开发之获取地理位置接口
- 公众获取用户地理位置-php开发微信公众号
- Java微信公众平台开发之获取地理位置
- 微信公众平台开发之获取用户地理位置
- 微信公众号开发---获取用户地理位置
- 微信公众号开发《三》微信JS-SDK之地理位置的获取,集成百度地图实现在线地图搜索
- 微信公众平台开发文档 获取用户地理位置
- 微信公众平台开发(85) 获取用户地理位置
- 微信公众平台开发(106) 网页获取用户地理位置
- 微信公众平台开发网页获取用户地理位置
- 微信获取地理位置接口
- 微信企业号开发之地理位置获取
- 微信测试号开发之七 获取用户地理位置
- 微信公众号开发,获取用户的地理位置坐标,经纬度
- 微信公众号、地图定位、获取地理位置
- 微信公众号location获取用户地理位置
- 微信jsapi获取用户地理位置接口开发(第八课)
- 微信jsapi获取用户地理位置接口开发(7)
- Kotlin学习笔记——Dagger2
- JSP&Servlet 统计在线人数及信息
- Godeyes 使用说明
- CentOS7引导Windows7
- 个人喜欢的关于模式识别、机器学习、推荐系统、图像特征、深度学习、数值计算、目标跟踪等方面个人主页及博客
- 微信公众号开发之获取地理位置接口
- python中获取异常描述与else用法
- Android初级工程师的service研究之路
- GMS认证之CtsVerifier测试-Screen Pinning Test
- SVN不同版本库迁移
- C++多态与继承
- 赌你半天都想不出的Bug
- 从无到有,关于RxJava的详解
- Python之文件读写