调用微信地理位置接口,需要用到微信的JSSDK,这是微信的介绍:
微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包。
通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照、选图、语音、位置等手机系统的能力,同时可以直接使用微信分享、扫一扫、卡券、支付等微信特有的能力,为微信用户提供更优质的网页体验。
JSSDK使用步骤:
步骤一:绑定域名
先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。
备注:登录后可在“开发者中心”查看对应的接口权限。
在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.2.0.js
备注:支持使用 AMD/CMD 标准模块加载方法加载
所有需要使用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
});
wx.ready(function(){
// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
});
wx.error(function(res){
// config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
});
微信文档大概意思是,如果想调微信JSSDK,然后必须引入http://res.wx.qq.com/open/js/jweixin-1.2.0.js,而这个js需要配置成功才能够使用,成功就自动走ready方失败则error。
这里调用地图接口,是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;
}
最近在整理一些资源工具,放在网站分享 http://tools.maqway.com
欢迎关注公众号:麻雀唯伊 , 不定时更新资源文章,或许有你想看的