微信公众号开发之获取地理位置接口
?
調用微信地理位置接口,需要用到微信的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可以在這里更新簽名。
});
微信文檔大概意思是,如果想調微信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 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; }?
?
?
最近在整理一些資源工具,放在網站分享 http://tools.maqway.com
歡迎關注公眾號:麻雀唯伊 , 不定時更新資源文章,或許有你想看的
?
總結
以上是生活随笔為你收集整理的微信公众号开发之获取地理位置接口的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 字典的创建
- 下一篇: JQuery之UI插件