最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java開發(fā)微信分享接口的步驟

 更新時(shí)間:2017年11月22日 09:43:56   作者:admingy  
這篇文章主要為大家詳細(xì)介紹了java開發(fā)微信分享接口的步驟,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

微信分享接口的java開發(fā)的一些小步驟,具體內(nèi)容如下

1.配置接口信息進(jìn)行驗(yà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");// 時(shí)間戳 
      String nonce = request.getParameter("nonce");// 隨機(jī)數(shù) 
      String echostr = request.getParameter("echostr");// 隨機(jī)字符串 
      // 將token、timestamp、nonce三個(gè)參數(shù)進(jìn)行字典序排序 
      String[] params = new String[] { TOKEN, timestamp, nonce };
      Arrays.sort(params);
      // 將三個(gè)參數(shù)字符串拼接成一個(gè)字符串進(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)識(shí)該請求來源于微信 
      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)識(shí)
    String requestUrl = request.getRequestURL().toString();
    String accessToken = null;
    String jsapiTicket = null;
    String url = "";
    String timestamp = Long.toString(System.currentTimeMillis() / 1000); // 必填,生成簽名的時(shí)間戳
    String nonceStr = UUID.randomUUID().toString(); // 必填,生成簽名的隨機(jī)串
    //此處先在緩存中查詢,查詢不到在調(diào)用接口查詢 緩存中需要設(shè)置access-token的有效時(shí)間
//    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 + "&timestamp="
        + 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值,過期時(shí)間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分享。");
     }
   });  
     // 獲取“分享到朋友圈”按鈕點(diǎn)擊狀態(tài)及自定義分享內(nèi)容接口
      wx.onMenuShareTimeline({
        title: '第六篇 :微信公眾平臺(tái)開發(fā)實(shí)戰(zhàn)Java版之如何自定義微信公眾號菜單', 
        desc: '第六篇 :微信公眾平臺(tái)開發(fā)實(shí)戰(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);
        }
      });
     
     // 獲取“分享給朋友”按鈕點(diǎn)擊狀態(tài)及自定義分享內(nèi)容接口
      wx.onMenuShareAppMessage({
        title: '第七篇 :微信公眾平臺(tái)開發(fā)實(shí)戰(zhàn)Java版之如何獲取微信用戶基本信息', // 分享標(biāo)題
        desc: "第七篇 :微信公眾平臺(tái)開發(fā)實(shí)戰(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”按鈕點(diǎn)擊狀態(tài)及自定義分享內(nèi)容接口
      wx.onMenuShareQQ({
        title: '第六篇 :微信公眾平臺(tái)開發(fā)實(shí)戰(zhàn)Java版之如何自定義微信公眾號菜單', // 分享標(biāo)題
        desc: '第六篇 :微信公眾平臺(tái)開發(fā)實(shí)戰(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ù)
        }
      });
      
      //獲取“分享到騰訊微博”按鈕點(diǎn)擊狀態(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空間”按鈕點(diǎn)擊狀態(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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java超詳細(xì)教你寫一個(gè)學(xué)籍管理系統(tǒng)案例

    Java超詳細(xì)教你寫一個(gè)學(xué)籍管理系統(tǒng)案例

    這篇文章主要介紹了怎么用Java來寫一個(gè)學(xué)籍管理系統(tǒng),學(xué)籍管理主要涉及到學(xué)生信息的增刪查改,本篇將詳細(xì)的實(shí)現(xiàn),感興趣的朋友跟隨文章往下看看吧
    2022-03-03
  • 使用Netty快速實(shí)現(xiàn)一個(gè)群聊功能的示例詳解

    使用Netty快速實(shí)現(xiàn)一個(gè)群聊功能的示例詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用?Netty?框架開發(fā)一個(gè)?WebSocket?服務(wù)端,從而實(shí)現(xiàn)一個(gè)簡單的在線聊天功能,感興趣的小伙伴可以了解下
    2023-11-11
  • Tomcat集群和Session復(fù)制應(yīng)用介紹

    Tomcat集群和Session復(fù)制應(yīng)用介紹

    本文將詳細(xì)介紹Tomcat集群和Session復(fù)制應(yīng)用,需要了解的朋友可以參考下
    2012-11-11
  • java生成隨機(jī)字符串的兩種方法

    java生成隨機(jī)字符串的兩種方法

    這篇文章主要為大家詳細(xì)介紹了java生成隨機(jī)字符串的兩種方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • java中Webclient對象如何解析400狀態(tài)碼詳解

    java中Webclient對象如何解析400狀態(tài)碼詳解

    這篇文章主要介紹了java中Webclient對象如何解析400狀態(tài)碼的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用java具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-12-12
  • Java?MethodHandles介紹與反射對比區(qū)別詳解

    Java?MethodHandles介紹與反射對比區(qū)別詳解

    這篇文章主要為大家介紹了Java?MethodHandles介紹與反射對比區(qū)別詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • 解密Spring?Boot深入理解條件裝配與條件注解

    解密Spring?Boot深入理解條件裝配與條件注解

    條件注解是一種特殊的注解,用于標(biāo)記在配置類、組件類或方法上,它們根據(jù)某些條件的結(jié)果來決定是否應(yīng)用相應(yīng)的配置或組件,這篇文章主要介紹了解密Spring?Boot深入理解條件裝配與條件注解,需要的朋友可以參考下
    2024-06-06
  • 圖解JVM內(nèi)存模型

    圖解JVM內(nèi)存模型

    這篇文章主要介紹了JVM內(nèi)存模型的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)Java虛擬機(jī),感興趣的朋友可以了解詳細(xì)
    2020-10-10
  • SpringBoot深入理解之內(nèi)置web容器及配置的總結(jié)

    SpringBoot深入理解之內(nèi)置web容器及配置的總結(jié)

    今天小編就為大家分享一篇關(guān)于SpringBoot深入理解之內(nèi)置web容器及配置的總結(jié),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Java中JWT(JSON?Web?Token)的運(yùn)用具體案例

    Java中JWT(JSON?Web?Token)的運(yùn)用具體案例

    這篇文章主要介紹了Java中JWT(JSON?Web?Token)的運(yùn)用具體案例,JWT(JSON?Web?Token)是一種開放標(biāo)準(zhǔn),用于在網(wǎng)絡(luò)應(yīng)用環(huán)境中安全地傳遞信息,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-11-11

最新評論

锡林郭勒盟| 深泽县| 竹北市| 新丰县| 山西省| 黑水县| 宿迁市| 文登市| 连山| 峨山| 山阳县| 库车县| 微山县| 平舆县| 平凉市| 淮阳县| 阿克陶县| 安塞县| 孟州市| 屏东市| 宝兴县| 延寿县| 万宁市| 卓尼县| 沾化县| 吴忠市| 广灵县| 平邑县| 广宁县| 高尔夫| 龙泉市| 贡觉县| 祥云县| 司法| 黎城县| 察雅县| 西昌市| 鹿邑县| 缙云县| 基隆市| 瓮安县|