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

微信js-sdk+JAVA實現(xiàn)“分享到朋友圈”和“發(fā)送給朋友”功能詳解

 更新時間:2018年03月18日 17:31:07   投稿:wdc  
本文分享了微信js-sdk+JAVA實現(xiàn)“分享到朋友圈”和“發(fā)送給朋友”功能介紹,大家可以參考一下

主要為以下實現(xiàn)步驟:

1.綁定域名

先登錄微信公眾平臺進入“公眾號設(shè)置”的“功能設(shè)置”里填寫“JS接口安全域名”。(特別提示不需要加上http或者h(yuǎn)ttps,吃過虧)

2.頁面引入js文件

   <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
   <script src="https://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>

3.通過config接口注入權(quán)限驗證配置

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

});

4.通過ready接口處理成功驗證

  wx.ready(function(){

   //詳細(xì)代碼

});

5.通過error接口處理失敗驗證

wx.error(function(res){});

詳細(xì)頁面代碼

<script> 
//微信分享朋友圈 
$(function(){ 
 /***用戶點擊分享到微信圈后加載接口接口*******/ 
  var url=window.location.href.split('#')[0]; 
   url = url.replace(/&/g, '%26'); 
  console.log("url:"+url); 
  $.ajax({ 
    url: "<%=basePath%>/lottery/shareToFriend.action?url="+url, 
    type: "POST", 
    async:true, 
    cache: false, 
    dataType: "json", 
    success: function(data){ 
      wx.config({ 
       debug: false, 
       appId: 'wx2948dfef9ef421ee', 
       timestamp:data.timeStamp, 
       nonceStr:data.nonceStr, 
       signature:data.signature, 
       jsApiList: [ 
         'checkJsApi', 
         'onMenuShareTimeline', 
         'hideOptionMenu', 
         'onMenuShareAppMessage' 
       ] 
     }); 
       
     wx.ready(function(){ 
       //wx.hideOptionMenu();/***隱藏分享菜單****/  
       wx.checkJsApi({ 
       jsApiList: [ 
        'getLocation', 
        'onMenuShareTimeline', 
        'onMenuShareAppMessage' 
       ], 
       success: function (res) { 
        //alert(res.errMsg); 
       } 
      }); 
        
      wx.onMenuShareAppMessage({ 
         title: '刮刮樂', 
         desc: '刮刮樂開始啦', 
         link: '<%=basePath%>/lottery/lottery.action?lottery.id=${lottery.id}', 
         imgUrl: '<%=basePath%>/resources/qjc/img/start.png', 
         trigger: function (res) { 
          //alert('用戶點擊發(fā)送給朋友'); 
         }, 
         success: function (res) { 
          alert('您已獲得抽獎機會,趕緊去贏大獎吧~~'); 
          //分享之后增加游戲次數(shù) 
          $.ajax({ 
            url: "<%=basePath%>/lottery/rewardPlayCount.action?openId=${openId}&lotteryId=${lottery.id}&shareType=friend", 
            type: "POST", 
            async:true, 
            cache: false, 
            dataType: "json", 
            success: function(data){ 
               
            } 
           }); 
         }, 
         cancel: function (res) { 
          //alert('已取消'); 
         }, 
         fail: function (res) { 
          alert(res.errMsg); 
         } 
        }); 
       
       // 2.2 監(jiān)聽“分享到朋友圈”按鈕點擊、自定義分享內(nèi)容及分享結(jié)果接口 
       wx.onMenuShareTimeline({ 
         title: '刮刮樂', 
         desc: '刮刮樂開始啦', 
         link: '<%=basePath%>/lottery/lottery.action?lottery.id=${lottery.id}', 
         imgUrl: '<%=basePath%>/resources/qjc/img/start.png', 
         trigger: function (res) { 
          //alert('用戶點擊分享到朋友圈'); 
         }, 
         success: function (res) { 
          alert('您已獲得抽獎機會,趕緊去贏大獎吧~~'); 
          //分享之后增加游戲次數(shù) 
          $.ajax({ 
            url: "<%=basePath%>/lottery/rewardPlayCount.action?openId=${openId}&lotteryId=${lottery.id}&shareType=friendCircle", 
            type: "POST", 
            async:true, 
            cache: false, 
            dataType: "json", 
            success: function(data){ 
               
            } 
           }); 
         }, 
         cancel: function (res) { 
          //alert('已取消'); 
         }, 
         fail: function (res) { 
          alert(res.errMsg); 
         } 
      }); 
        
      wx.error(function (res) { 
          alert(res.errMsg); 
        }); 
      });  
    }, 
    error: function() { 
      alert('ajax request failed!!!!'); 
      return; 
    }  
  }); 
 }); 
 
</script> 

java后臺action代碼:

//微信分享 
  public void shareToFriend(){ 
    HttpServletRequest request = ServletActionContext.getRequest(); 
    String timeStamp = Sha1Util.getTimeStamp();//時間戳 
    String nonceStr = WxConfig.getUUID();//隨機字符串,不長于32位 
    String url=request.getParameter("url"); 
    String signature = WxConfig.getSignature("APPId", "APP_secret", url, timeStamp, nonceStr); 
    request.setAttribute("timeStamp", timeStamp); 
    request.setAttribute("nonceStr", nonceStr); 
    request.setAttribute("url", url); 
    request.setAttribute("signature", signature); 
    WXjssdk result = new WXjssdk(timeStamp,nonceStr,signature,url); 
    CommonUtil.returnMsg(ServletActionContext.getResponse(), new Gson().toJson(result)); 
  } 

WxConfig.java代碼 

">//jsapi_ticket 
  public final static String WEIXIN_JSAPI_TICKET_URL ="https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi"; 
   
  //access_token  
  public static String getAccessToken(String appId,String appSecret){ 
    String access_token; 
    access_token = mapToken.get("accessToken"); 
    if(access_token==null){ 
      String url = HttpUtil.WEIXIN_HOST_API + "/cgi-bin/token?grant_type=client_credential&appid="+appId+"&secret="+appSecret; 
      String menuJsonStr = HttpUtil.get(url); 
      final Type type = new TypeToken<Map<String, Object>>() {}.getType(); 
      final Map<Object, Object> accessTokenInfo = new Gson().fromJson(menuJsonStr, type); 
      try{ 
        access_token = accessTokenInfo.get("access_token").toString(); 
        Object expires_in = accessTokenInfo.get("expires_in"); 
        mapToken.put("accessToken", access_token); 
        logger.info("access_token:"+access_token+";expires_in:"+expires_in); 
      }catch (JSONException e) { 
        access_token = null; 
        e.printStackTrace(); 
        logger.error("errcode:{}:"+accessTokenInfo.get("errcode")+"errmsg:{}:"+accessTokenInfo.get("errmsg")); 
      } 
    } 
    return access_token; 
  } 
   
  //jsapi_ticket 
  public static String getJsapiTicket(String accessToken){ 
    String ticket; 
    ticket = mapTicket.get("ticket"); 
    if(ticket==null){ 
      String url = HttpUtil.WEIXIN_HOST_API + "/cgi-bin/ticket/getticket?access_token="+accessToken+"&type=jsapi"; 
      String menuJsonStr = HttpUtil.get(url); 
      final Type type = new TypeToken<Map<String, Object>>() {}.getType(); 
      final Map<Object, Object> ticketInfo = new Gson().fromJson(menuJsonStr, type); 
      try{ 
        ticket = ticketInfo.get("ticket").toString(); 
        String expires_in = ticketInfo.get("expires_in").toString(); 
        mapTicket.put("ticket", ticket); 
        logger.info("jsapi_ticket:"+ticket+";expires_in:"+expires_in); 
      }catch (JSONException e) { 
        ticket = null; 
        e.printStackTrace(); 
        logger.error("ticket errcode:{}:"+ticketInfo.get("errcode")+"errmsg:{}:"+ticketInfo.get("errmsg")); 
      } 
    } 
    return ticket; 
  } 
   
   //生成隨機字符串UUID 
  public static String getUUID(){   
     String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");   
     return uuid;   
  }  
   
  //JS-SDK Signature 
  public static String getSignature(String appId,String appSecret,String url,String timeStamp,String nonceStr){ 
    String accessToken = getAccessToken(appId,appSecret); 
    String jsapi_ticket = getJsapiTicket(accessToken); 
    logger.info("accessToken==="+accessToken); 
    String signValue = "jsapi_ticket="+jsapi_ticket+"&noncestr="+nonceStr+"×tamp="+timeStamp+"&url="+url; 
    logger.info("微信JS-SDK權(quán)限驗證的簽名串:"+signValue); 
    //這個簽名.主要是給加載微信js使用.別和上面的搞混了. 
    String signature = Sha1Util.getSha1((signValue)); 
    logger.info("微信JS-SDK權(quán)限驗證的簽名:"+signature); 
    return signature; 
  } 

另外項目用到的Sha1Util.java和MD5Util.java可以直接在平臺下載。 

相關(guān)文章

  • 手寫一個@Valid字段校驗器的示例代碼

    手寫一個@Valid字段校驗器的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何手寫一個@Valid字段校驗器,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)有一定幫助,需要的可以參考一下
    2022-07-07
  • java實現(xiàn)二分法的完整代碼

    java實現(xiàn)二分法的完整代碼

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)二分法的完整代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • java實現(xiàn)冒泡排序算法

    java實現(xiàn)冒泡排序算法

    冒泡排序(Bubble Sort)是一種簡單的排序算法。它重復(fù)地走訪過要排序的數(shù)列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數(shù)列的工作是重復(fù)地進行直到?jīng)]有再需要交換,也就是說該數(shù)列已經(jīng)排序完成。
    2015-04-04
  • SpringBoot實現(xiàn)kafka多源配置的示例代碼

    SpringBoot實現(xiàn)kafka多源配置的示例代碼

    實際開發(fā)中,不同的topic可能來自不同的集群,所以就需要配置不同的kafka數(shù)據(jù)源,基于springboot自動配置的思想,最終通過配置文件的配置,自動生成生產(chǎn)者及消費者的配置,本文介紹了SpringBoot實現(xiàn)kafka多源配置,需要的朋友可以參考下
    2024-06-06
  • 關(guān)于JDK15的新特性之TextBlocks文本塊的引入和使用

    關(guān)于JDK15的新特性之TextBlocks文本塊的引入和使用

    這篇文章主要介紹了關(guān)于JDK15的新特性之文本塊的引入和使用,如果具有一種語言學(xué)機制,可以比多行文字更直觀地表示字符串,而且可以跨越多行,而且不會出現(xiàn)轉(zhuǎn)義的視覺混亂,那么這將提高廣泛Java類程序的可讀性和可寫性,需要的朋友可以參考下
    2023-07-07
  • Java Arrays.sort()用法詳解

    Java Arrays.sort()用法詳解

    這篇文章主要介紹了Java Arrays.sort()用法詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Java并發(fā)中的ABA問題學(xué)習(xí)與解決方案

    Java并發(fā)中的ABA問題學(xué)習(xí)與解決方案

    這篇文章主要介紹了Java并發(fā)中的ABA問題學(xué)習(xí)與解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Spring中的@RefreshScope注解作用

    Spring中的@RefreshScope注解作用

    這篇文章主要介紹了Spring中的@RefreshScope注解作用詳解,@RefreshScope注解是Spring Cloud中的一個重要注解,用于實現(xiàn)動態(tài)刷新配置的功能,當(dāng)我們在應(yīng)用程序中使用@Value注解獲取配置屬性時,如果配置發(fā)生變化,需要重啟應(yīng)用程序才能生效,需要的朋友可以參考下
    2023-10-10
  • java 多線程的同步幾種方法

    java 多線程的同步幾種方法

    這篇文章主要介紹了java 多線程的同步幾種方法的相關(guān)資料,這里提供5種方法,需要的朋友可以參考下
    2017-09-09
  • 大廠面試???快速排序冒泡排序算法

    大廠面試???快速排序冒泡排序算法

    快速排序由于排序效率在同為O(N*logN)的幾種排序方法中效率較高,因此經(jīng)常被采用,再加上快速排序思想----分治法也確實實用,因此很多軟件公司的筆試面試,包括像BAT、字節(jié)、美團等知名IT公司都喜歡考查快速排序原理和手寫源碼
    2021-08-08

最新評論

高尔夫| 襄樊市| 喀喇| 鹤壁市| 吴川市| 遂平县| 潜江市| 郑州市| 望谟县| 江孜县| 达孜县| 余庆县| 仙游县| 浙江省| 银川市| 丹凤县| 司法| 娄烦县| 师宗县| 水富县| 嵊州市| 梨树县| 双桥区| 寿阳县| 佛山市| 和龙市| 大埔区| 黔西县| 怀柔区| 金门县| 邹城市| 丰原市| 息烽县| 苗栗县| 凤台县| 申扎县| 南和县| 宝兴县| 东阳市| 固始县| 罗江县|