微信js-sdk+JAVA实现“分享到朋友圈”和“发送给朋友”功能详解

 更新时间:2018年03月18日 17:31:07   投稿:wdc  
本文分享了微信js-sdk+JAVA实现“分享到朋友圈”和“发送给朋友”功能介绍,大家可以参考一下

主要为以下实现步骤:

1.绑定域名

先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。(特别提示不需要加上http或者https,吃过亏)

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接口注入权限验证配置

wx.config({

debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。

  appId: '', // 必填,公众号的唯一标识

  timestamp: , // 必填,生成签名的时间戳

  nonceStr: '', // 必填,生成签名的随机串

  signature: '',// 必填,签名,见附录1

  jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2

});

4.通过ready接口处理成功验证

  wx.ready(function(){

   //详细代码

});

5.通过error接口处理失败验证

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

详细页面代码

<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('用户点击发送给朋友'); 
         }, 
         success: function (res) { 
          alert('您已获得抽奖机会,赶紧去赢大奖吧~~'); 
          //分享之后增加游戏次数 
          $.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 监听“分享到朋友圈”按钮点击、自定义分享内容及分享结果接口 
       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('您已获得抽奖机会,赶紧去赢大奖吧~~'); 
          //分享之后增加游戏次数 
          $.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权限验证的签名串:"+signValue); 
    //这个签名.主要是给加载微信js使用.别和上面的搞混了. 
    String signature = Sha1Util.getSha1((signValue)); 
    logger.info("微信JS-SDK权限验证的签名:"+signature); 
    return signature; 
  } 

另外项目用到的Sha1Util.java和MD5Util.java可以直接在平台下载。 

相关文章

  • SpringBoot Jpa分页查询配置方式解析

    SpringBoot Jpa分页查询配置方式解析

    这篇文章主要介绍了SpringBoot Jpa分页查询配置方式解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • 分享java打印简单图形的实现代码

    分享java打印简单图形的实现代码

    这篇文章主要分享给大家运用java打印简单图形:三角形,菱形,四边形,需要的朋友可以参考下
    2015-07-07
  • SpringBoot参数验证10个技巧值得收藏

    SpringBoot参数验证10个技巧值得收藏

    Spring Boot提供了内置的验证注解,可以帮助简单、快速地对输入字段进行验证,例如检查 null 或空字段、强制执行长度限制、使用正则表达式验证模式以及验证电子邮件地址,那么在Spring Boot应用中如何做好参数校验工作呢,本文提供了10个小技巧感兴趣的朋友一起看看吧
    2023-08-08
  • SpringCloud-Spring Boot Starter使用测试及问题小结

    SpringCloud-Spring Boot Starter使用测试及问题小结

    Spring Boot Starter 是在 SpringBoot 组件中被提出来的一种概念、简化了很多烦琐的配置、通过引入各种 Spring Boot Starter 包可以快速搭建出一个项目的脚手架,这篇文章主要介绍了SpringCloud-Spring Boot Starter使用测试,需要的朋友可以参考下
    2022-07-07
  • Java编程synchronized与lock的区别【推荐】

    Java编程synchronized与lock的区别【推荐】

    互联网信息泛滥环境下少有的良心之作!如果您想对Java编程synchronized与lock的区别有所了解,这篇文章绝对值得!分享给大家,供需要的朋友参考。不说了,我先学习去了。
    2017-10-10
  • Java处理表格的实用工具库

    Java处理表格的实用工具库

    EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目,在尽可能节约内存的情况下支持读写百M的Excel,下面这篇文章主要给大家分享介绍了一个关于Java处理表格的实用工具库,需要的朋友可以参考下
    2021-11-11
  • Java下http下载文件客户端和上传文件客户端实例代码

    Java下http下载文件客户端和上传文件客户端实例代码

    这篇文章主要介绍了Java下http下载文件客户端和上传文件客户端实例代码,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-12-12
  • Servlet实现简单文件上传功能

    Servlet实现简单文件上传功能

    这篇文章主要为大家详细介绍了Servlet实现简单文件上传功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • Java private修饰符失效的原因

    Java private修饰符失效的原因

    在Java编程里,使用private关键字修饰了一个成员,只有成员内部可以访问,其余成员都不可访问,今天说明一下private功能失效的问题。
    2020-10-10
  • 利用java+mysql递归实现拼接树形JSON列表的方法示例

    利用java+mysql递归实现拼接树形JSON列表的方法示例

    这篇文章主要给大家介绍了关于利用java+mysql递归实现拼接树形JSON列表的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面跟着小编来一起看看吧。
    2017-08-08

最新评论