微信公众号开发之获取地理位置接口
?
調(diào)用微信地理位置接口,需要用到微信的JSSDK,這是微信的介紹:
?
微信JS-SDK是微信公眾平臺面向網(wǎng)頁開發(fā)者提供的基于微信內(nèi)的網(wǎng)頁開發(fā)工具包。
通過使用微信JS-SDK,網(wǎng)頁開發(fā)者可借助微信高效地使用拍照、選圖、語音、位置等手機系統(tǒng)的能力,同時可以直接使用微信分享、掃一掃、卡券、支付等微信特有的能力,為微信用戶提供更優(yōu)質(zhì)的網(wǎng)頁體驗。
JSSDK使用步驟:
?
步驟一:綁定域名
先登錄微信公眾平臺進(jìn)入“公眾號設(shè)置”的“功能設(shè)置”里填寫“JS接口安全域名”。
備注:登錄后可在“開發(fā)者中心”查看對應(yīng)的接口權(quán)限。
步驟二:引入JS文件
在需要調(diào)用JS接口的頁面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.2.0.js
備注:支持使用 AMD/CMD 標(biāo)準(zhǔn)模塊加載方法加載
步驟三:通過config接口注入權(quán)限驗證配置
所有需要使用JS-SDK的頁面必須先注入配置信息,否則將無法調(diào)用(同一個url僅需調(diào)用一次,對于變化url的SPA的web app可在每次url變化時進(jìn)行調(diào)用,目前Android微信客戶端不支持pushState的H5新特性,所以使用pushState來實現(xiàn)web app的頁面會導(dǎo)致簽名失敗,此問題會在Android6.2中修復(fù))。
wx.config({
? ? debug: true, // 開啟調(diào)試模式,調(diào)用的所有api的返回值會在客戶端alert出來,若要查看傳入的參數(shù),可以在pc端打開,參數(shù)信息會通過log打出,僅在pc端時才會打印。
? ? appId: '', // 必填,公眾號的唯一標(biāo)識
? ? timestamp: , // 必填,生成簽名的時間戳
? ? nonceStr: '', // 必填,生成簽名的隨機串
? ? signature: '',// 必填,簽名,見附錄1
? ? jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表見附錄2
});
步驟四:通過ready接口處理成功驗證
wx.ready(function(){
? ? // config信息驗證后會執(zhí)行ready方法,所有接口調(diào)用都必須在config接口獲得結(jié)果之后,config是一個客戶端的異步操作,所以如果需要在頁面加載時就調(diào)用相關(guān)接口,則須把相關(guān)接口放在ready函數(shù)中調(diào)用來確保正確執(zhí)行。對于用戶觸發(fā)時才調(diào)用的接口,則可以直接調(diào)用,不需要放在ready函數(shù)中。
});
步驟五:通過error接口處理失敗驗證
wx.error(function(res){
? ? // config信息驗證失敗會執(zhí)行error函數(shù),如簽名過期導(dǎo)致驗證失敗,具體錯誤信息可以打開config的debug模式查看,也可以在返回的res參數(shù)中查看,對于SPA可以在這里更新簽名。
});
微信文檔大概意思是,如果想調(diào)微信JSSDK,然后必須引入http://res.wx.qq.com/open/js/jweixin-1.2.0.js,而這個js需要配置成功才能夠使用,成功就自動走ready方失敗則error。
這里調(diào)用地圖接口,是wx.openLocation和wx.getLocation,對wx.config進(jìn)行配置,? jsApiList: []中填這兩個接口,其中簽名需要在后臺進(jìn)行。
下面介紹如何配置config,一定要注意參數(shù)名的大小寫,不能錯!:
1、appId就不用說了,就是公眾號的appId,timestamp是時間戳,生成簽名用,這里單位是秒。
?
/*** 獲取當(dāng)前時間戳,單位秒* @return*/public static long getCurrentTimestamp() {return System.currentTimeMillis()/1000;}/*** 獲取當(dāng)前時間戳,單位毫秒* @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,按照微信的簽名算法,簽名需要的參數(shù)noncestr-隨機串,jsapi_ticket-臨時票據(jù),timestamp-時間戳,url-調(diào)用js接口的頁面地址,絕對路徑,形成簽名的方法,分為二步
?
(1)獲取access_token,這個access_token有一個過時的問題,有效時間7200秒,而獲取access_token每天限制為100000次,所以,我是把access_token存到數(shù)據(jù)庫里,每次用的時候查詢一下上次更新的時間是否有超過7200秒,這個時間可以設(shè)置的小一些,用來避免臨界7200秒的問題,如果超過7200秒再重新請求一次,再更新數(shù)據(jù)庫存入更新的時間。獲取到access_token后,再用access_token獲取臨時票據(jù)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)四個參數(shù)形成簽名,把四個參數(shù)用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 blocke.printStackTrace();}digest.update(str.getBytes());byte messageDigest[] = digest.digest();// Create Hex StringStringBuffer 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; }?
?
?
最近在整理一些資源工具,放在網(wǎng)站分享 http://tools.maqway.com
歡迎關(guān)注公眾號:麻雀唯伊 , 不定時更新資源文章,或許有你想看的
?
總結(jié)
以上是生活随笔為你收集整理的微信公众号开发之获取地理位置接口的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 字典的创建
- 下一篇: JQuery之UI插件