java開發(fā)微信分享接口的步驟
更新時間:2017年11月22日 09:43:56 作者:admingy
這篇文章主要為大家詳細(xì)介紹了java開發(fā)微信分享接口的步驟,具有一定的參考價值,感興趣的小伙伴們可以參考一下
微信分享接口的java開發(fā)的一些小步驟,具體內(nèi)容如下
1.配置接口信息進(jìn)行驗證
代碼如下:
/** * 訪問沒認(rèn)證的地址跳轉(zhuǎn) * * @param request * @return 登錄頁面 * @throws Exception */ @RequestMapping(value = "/checkWxDomainUrl", method = RequestMethod.GET) public void checkWxDomainUrl(HttpServletRequest request) throws Exception { try { // 開發(fā)者提交信息后,微信服務(wù)器將發(fā)送GET請求到填寫的服務(wù)器地址URL上,GET請求攜帶參數(shù) String signature = request.getParameter("signature");// 微信加密簽名(token、timestamp、nonce。) String timestamp = request.getParameter("timestamp");// 時間戳 String nonce = request.getParameter("nonce");// 隨機(jī)數(shù) String echostr = request.getParameter("echostr");// 隨機(jī)字符串 // 將token、timestamp、nonce三個參數(shù)進(jìn)行字典序排序 String[] params = new String[] { TOKEN, timestamp, nonce }; Arrays.sort(params); // 將三個參數(shù)字符串拼接成一個字符串進(jìn)行sha1加密 String clearText = params[0] + params[1] + params[2]; String algorithm = "SHA-1"; String sign = new String(Hex.encodeHex( MessageDigest.getInstance(algorithm).digest((clearText).getBytes()), true)); // 開發(fā)者獲得加密后的字符串可與signature對比,標(biāo)識該請求來源于微信 if (signature.equals(sign)) { response.getWriter().print(echostr); } } catch (Exception e) { e.printStackTrace(); } }
2.js配置
3.獲取分享頁面js需要參數(shù) 其中獲取token、ticket加入緩存
/** * 方法名:getWxConfig</br> * 詳述:獲取微信的配置信息 </br> * 開發(fā)人員:gy * @param request * @return 說明返回值含義 * @throws 說明發(fā)生此異常的條件 */ @Override public Map<String, Object> getWxConfig(HttpServletRequest request) { Map<String, Object> ret = new HashMap<String, Object>(); String appId = wXConfigure.getAppId(); // 必填,公眾號的唯一標(biāo)識 String requestUrl = request.getRequestURL().toString(); String accessToken = null; String jsapiTicket = null; String url = ""; String timestamp = Long.toString(System.currentTimeMillis() / 1000); // 必填,生成簽名的時間戳 String nonceStr = UUID.randomUUID().toString(); // 必填,生成簽名的隨機(jī)串 //此處先在緩存中查詢,查詢不到在調(diào)用接口查詢 緩存中需要設(shè)置access-token的有效時間 // redisTemplate.opsForValue().getOperations().delete(prefix); // accessToken = (String) redisTemplate.opsForValue().get(prefix); Token accessTokenFromRedis = getAccessTokenFromRedis(); accessToken = accessTokenFromRedis.getAccessToken(); if (accessTokenFromRedis.getAccessToken() != null) { jsapiTicket = (String) redisTemplate.opsForValue().get(prefixTicket); if (jsapiTicket==null) { url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + accessToken + "&type=jsapi"; JSONObject json = httpRequest(url, "GET", null); if (json != null) { jsapiTicket = json.getString("ticket"); redisTemplate.opsForValue().set(prefixTicket, jsapiTicket); redisTemplate.expire(prefixTicket, Integer.parseInt(wXConfigure.getExpireTime()), TimeUnit.SECONDS); } } } String signature = ""; // 注意這里參數(shù)名必須全部小寫,且必須有序 String sign = "jsapi_ticket=" + jsapiTicket + "&noncestr=" + nonceStr + "×tamp=" + timestamp + "&url=" + requestUrl; try { MessageDigest crypt = MessageDigest.getInstance("SHA-1"); crypt.reset(); crypt.update(sign.getBytes("UTF-8")); signature = byteToHex(crypt.digest()); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } ret.put("appId", appId); ret.put("timestamp", timestamp); ret.put("nonceStr", nonceStr); ret.put("signature", signature); return ret; } /** * 方法名:byteToHex</br> * 詳述:字符串加密輔助方法 </br> * 開發(fā)人員:gy </br> * @param hash * @return 說明返回值含義 * @throws 說明發(fā)生此異常的條件 */ private static String byteToHex(final byte[] hash) { Formatter formatter = new Formatter(); for (byte b : hash) { formatter.format("%02x", b); } String result = formatter.toString(); formatter.close(); return result; } /** * 從redis中獲取accessToken,指定key的String值,過期時間7200s * * @param key * @return */ public Token getAccessTokenFromRedis() { Token token = null; String assesstoken = (String) redisTemplate.opsForValue().get(wXConfigure.getTokenKey()); if (null != assesstoken && !"".equals(assesstoken)) { token = new Token(); token.setAccessToken(assesstoken); return token; } else { token = CommonWxUtil.getToken(wXConfigure.getAppId(), wXConfigure.getSecret()); redisTemplate.opsForValue().set(wXConfigure.getTokenKey(), token.getAccessToken()); redisTemplate.expire(wXConfigure.getTokenKey(), Integer.parseInt(wXConfigure.getExpireTime()), TimeUnit.SECONDS); return token; } }
4.頁面的相關(guān)js的引入
<script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script> <script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script> <script type="text/javascript"> // 微信信息的以及調(diào)用的配置 // 微信信息的以及調(diào)用的配置 var signature=$("#signature").val(); var appId=$("#appId").val(); var timestamp=$("#timestamp").val(); var nonceStr=$("#nonceStr").val(); var userId=$("#userId").val(); var productName=1; alert(signature); wx.config({ debug: false, appId:appId , timestamp:timestamp, nonceStr: nonceStr, signature:signature, jsApiList: ['onMenuShareTimeline', 'onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] }); wx.ready(function(){ var isOk = true; wx.checkJsApi({ jsApiList: ['onMenuShareTimeline'], fail: function (res) { alert("微信版本太低,不支持分享給朋友的功能!"); isOk = false; }, success: function (res) { alert("支持QQ分享。"); } }); // 獲取“分享到朋友圈”按鈕點擊狀態(tài)及自定義分享內(nèi)容接口 wx.onMenuShareTimeline({ title: '第六篇 :微信公眾平臺開發(fā)實戰(zhàn)Java版之如何自定義微信公眾號菜單', desc: '第六篇 :微信公眾平臺開發(fā)實戰(zhàn)Java版之如何自定義微信公眾號菜單', link: 'http://4d536256.ngrok.io/login', imgUrl: 'http://busc.4ggogo.com/media/media/img/home-show-a.png', success: function (res) { alert(JSON.stringify(res)); if (res.errMsg=='shareTimeline:ok') { /* $.ajax({ type:"get", url:'insertCollectShare', data:{ userId:userId, }, dataType:"json", async: false, success:function(data){ alert(200); }, error:function(data){ var rUrl = xhr.getResponseHeader('CONTENTPATH'); window.location.href = rUrl; } }); */ // 用戶確認(rèn)分享后執(zhí)行的回調(diào)函數(shù) /* window.location.href = contextRoot + 'insertCollectShare?userId=' + userId; */ } }, cancel: function (res) { // 用戶取消分享后執(zhí)行的回調(diào)函數(shù) alert(res); } }); // 獲取“分享給朋友”按鈕點擊狀態(tài)及自定義分享內(nèi)容接口 wx.onMenuShareAppMessage({ title: '第七篇 :微信公眾平臺開發(fā)實戰(zhàn)Java版之如何獲取微信用戶基本信息', // 分享標(biāo)題 desc: "第七篇 :微信公眾平臺開發(fā)實戰(zhàn)Java版之如何獲取微信用戶基本信息", // 分享描述 link:'http://4d536256.ngrok.io/login', imgUrl: 'http://busc.4ggogo.com/media/media/img/home-show-a.png', // 分享圖標(biāo) type: 'link', // 分享類型,music、video或link,不填默認(rèn)為link }); //獲取“分享到QQ”按鈕點擊狀態(tài)及自定義分享內(nèi)容接口 wx.onMenuShareQQ({ title: '第六篇 :微信公眾平臺開發(fā)實戰(zhàn)Java版之如何自定義微信公眾號菜單', // 分享標(biāo)題 desc: '第六篇 :微信公眾平臺開發(fā)實戰(zhàn)Java版之如何自定義微信公眾號菜單', // 分享描述 link: 'http://4d536256.ngrok.io/login', // 分享鏈接 imgUrl: 'http://busc.4ggogo.com/media/media/img/home-show-a.png', // 分享圖標(biāo) success: function () { // 用戶確認(rèn)分享后執(zhí)行的回調(diào)函數(shù) }, cancel: function () { // 用戶取消分享后執(zhí)行的回調(diào)函數(shù) } }); //獲取“分享到騰訊微博”按鈕點擊狀態(tài)及自定義分享內(nèi)容接口 wx.onMenuShareWeibo({ title: '分享到騰訊微博標(biāo)題', // 分享標(biāo)題 desc: '分享到騰訊微博描述', // 分享描述 link: 'http://4d536256.ngrok.io/login', // 分享鏈接 imgUrl: 'http://busc.4ggogo.com/media/media/img/home-show-a.png', // 分享圖標(biāo) success: function () { // 用戶確認(rèn)分享后執(zhí)行的回調(diào)函數(shù) }, cancel: function () { // 用戶取消分享后執(zhí)行的回調(diào)函數(shù) } }); //獲取“分享到QQ空間”按鈕點擊狀態(tài)及自定義分享內(nèi)容接口 wx.onMenuShareQZone({ title: '分享到QQ空間標(biāo)題11111111111111111', // 分享標(biāo)題 desc: '分享到QQ空間描述2222222222222222222', // 分享描述 link: 'http://4d536256.ngrok.io/login', imgUrl:'http://busc.4ggogo.com/media/media/img/home-show-a.png', // 分享圖標(biāo) success: function () { // 用戶確認(rèn)分享后執(zhí)行的回調(diào)函數(shù) }, cancel: function () { // 用戶取消分享后執(zhí)行的回調(diào)函數(shù) } }); }); </script>
備注:調(diào)轉(zhuǎn)的路徑為配置的域名路徑,不然無法調(diào)用,圖片大小不可以大于300k
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。