1.配置接口信息进行验证

代码如下:

/**
     * 访问没认证的地址跳转
     *
     * @param request
     * @return 登录页面
     * @throws Exception
     */
    @RequestMapping(value = "/checkWxDomainUrl", method = RequestMethod.GET)
    public void checkWxDomainUrl(HttpServletRequest request) throws Exception {

try {
            // 开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数  
            String signature = request.getParameter("signature");// 微信加密签名(token、timestamp、nonce。)  
            String timestamp = request.getParameter("timestamp");// 时间戳  
            String nonce = request.getParameter("nonce");// 随机数  
            String echostr = request.getParameter("echostr");// 随机字符串  
            // 将token、timestamp、nonce三个参数进行字典序排序  
            String[] params = new String[] { TOKEN, timestamp, nonce };
            Arrays.sort(params);
            // 将三个参数字符串拼接成一个字符串进行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));
            // 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信  
            if (signature.equals(sign)) {
                response.getWriter().print(echostr);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

2.js配置

3.获取分享页面js需要参数   其中获取token、ticket加入缓存

/**
    * 方法名:getWxConfig</br>
    * 详述:获取微信的配置信息 </br>
    * 开发人员:gy
    * @param request
    * @return 说明返回值含义
    * @throws 说明发生此异常的条件
     */
    @Override
    public Map<String, Object> getWxConfig(HttpServletRequest request) {
        Map<String, Object> ret = new HashMap<String, Object>();
        String appId = wXConfigure.getAppId(); // 必填,公众号的唯一标识
        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(); // 必填,生成签名的随机串
        //此处先在缓存中查询,查询不到在调用接口查询  缓存中需要设置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 = "";
        // 注意这里参数名必须全部小写,且必须有序
        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>
    * 开发人员:gy  </br>
    * @param hash
    * @return 说明返回值含义
    * @throws 说明发生此异常的条件
     */
    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.页面的相关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">

// 微信信息的以及调用的配置
// 微信信息的以及调用的配置
    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分享。");
          }
      });   
          // 获取“分享到朋友圈”按钮点击状态及自定义分享内容接口
            wx.onMenuShareTimeline({
                title: '第六篇 :微信公众平台开发实战Java版之如何自定义微信公众号菜单',
                desc: '第六篇 :微信公众平台开发实战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;
                               }
                           }); */
                         // 用户确认分享后执行的回调函数
                            /* window.location.href = contextRoot + 'insertCollectShare?userId=' + userId; */
                    }
                },
                cancel: function (res) {
                   // 用户取消分享后执行的回调函数
                      alert(res);
                }
            });
          
         // 获取“分享给朋友”按钮点击状态及自定义分享内容接口
            wx.onMenuShareAppMessage({
                title: '第七篇 :微信公众平台开发实战Java版之如何获取微信用户基本信息', // 分享标题
                desc: "第七篇 :微信公众平台开发实战Java版之如何获取微信用户基本信息", // 分享描述
                link:'http://4d536256.ngrok.io/login',
                imgUrl: 'http://busc.4ggogo.com/media/media/img/home-show-a.png', // 分享图标
                type: 'link', // 分享类型,music、video或link,不填默认为link
            });
            
            //获取“分享到QQ”按钮点击状态及自定义分享内容接口
            wx.onMenuShareQQ({
                title: '第六篇 :微信公众平台开发实战Java版之如何自定义微信公众号菜单', // 分享标题
                desc: '第六篇 :微信公众平台开发实战Java版之如何自定义微信公众号菜单', // 分享描述
                link: 'http://4d536256.ngrok.io/login', // 分享链接
                imgUrl: 'http://busc.4ggogo.com/media/media/img/home-show-a.png', // 分享图标
                success: function () {
                   // 用户确认分享后执行的回调函数
                },
                cancel: function () {
                   // 用户取消分享后执行的回调函数
                }
            });
            
            //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口
            wx.onMenuShareWeibo({
                title: '分享到腾讯微博标题', // 分享标题
                desc: '分享到腾讯微博描述', // 分享描述
                link: 'http://4d536256.ngrok.io/login', // 分享链接
                imgUrl: 'http://busc.4ggogo.com/media/media/img/home-show-a.png', // 分享图标
                success: function () {
                   // 用户确认分享后执行的回调函数
                },
                cancel: function () {
                    // 用户取消分享后执行的回调函数
                }
            });
            
            //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口
            wx.onMenuShareQZone({
                title: '分享到QQ空间标题11111111111111111', // 分享标题
                desc: '分享到QQ空间描述2222222222222222222', // 分享描述
                link: 'http://4d536256.ngrok.io/login',
                imgUrl:'http://busc.4ggogo.com/media/media/img/home-show-a.png', // 分享图标
                success: function () {
                   // 用户确认分享后执行的回调函数
                },
                cancel: function () {
                    // 用户取消分享后执行的回调函数
                }
            });
  });

</script>

备注:调转的路径为配置的域名路径,不然无法调用,图片大小不可以大于300k

微信分享接口的java开发的一些小步骤的更多相关文章

  1. Java微信分享接口开发

    发布时间:2018-11-07   技术:springboot+maven   概述 微信JS-SDK实现自定义分享功能,分享给朋友,分享到朋友圈 详细 代码下载:http://www.demodas ...

  2. 利用JS-SDK微信分享接口调用(后端.NET)

    一直都想研究一下JS-SDK微信分享的接口调用,由于最近工作需要,研究了一下,目前只是实现了部分接口的调用:其他接口调用也是类似的: 在开发之前,需要提前准备一个微信公众号,并且域名JSAPI 配置接 ...

  3. 微信分享接口SDK简介使用

    很久没做移动端活动了,想不少人都参与过微信里面的活动,既然活动就少不了分享.那我就行一个前端的角度说说如何实现微信分享的吧. 对应微信分享,现在已有公共接口,微信的开发者文档SDK:https://m ...

  4. 微信分享接口 略缩图 php

    php插件下载地址:  https://files.cnblogs.com/files/fan-bk/jssdk_php.rar 提示:如果插件里面的jssdk.php函数 file_get_cont ...

  5. vue 项目如何使用微信分享接口

    首先做微信网页都要接入微信sdk: 安装sdk npm install weixin-js-sdk --save 具体可以查看微信公众平台技术文档:https://mp.weixin.qq.com/w ...

  6. Python微信-- 分享接口(分享到朋友圈、朋友、空间)

    生成JS-SDK权限验证的签名 获取signature(签名)首先要获得 1.#获得jsapi_ticket 2.#获取当前页面的url #获取当前页面的url url="{}://{}{} ...

  7. 微信APP支付(Java后台生成签名具体步骤)

    public class PayCommonUtil { //定义签名,微信根据参数字段的ASCII码值进行排序 加密签名,故使用SortMap进行参数排序 public static String ...

  8. 2 java开发环境的配置步骤

    1  首先需要下载JDK(以java se development kit java标准版开发包) 8.0 如果只是单纯的运行java程序则只需要安装JRE(java runtime envirome ...

  9. java开发之发牌小程序

    发牌规则  黑桃按照从小到大依次为:1-13 红桃按照从小到大依次为:14-26 梅花按照从小到大依次为:27-39 方块按照从小到大依次为:40-52 小王53  大王54 代码实现: packag ...

随机推荐

  1. Educational Codeforces Round 78 (Rated for Div. 2) C. Berry Jam

    链接: https://codeforces.com/contest/1278/problem/C 题意: Karlsson has recently discovered a huge stock ...

  2. 1. Spring Cloud Greenwich SR2 概览

    Spring Cloud provides tools for developers to quickly build some of the common patterns in distribut ...

  3. ZROI1119 【十一·联考】幸福

    ZROI1119 [十一·联考]幸福 传送门 一道矩阵快速幂. #include<iostream> #include<cstdio> #include<algorith ...

  4. mapReduce 大数据离线分析

    数据分析一般分为两种,一种是在线一种是离线 流程: 一般都是对于日志文件的采集和分析 场景实例(某个电商网站产生的用户访问日志(access.log)进行离线处理与分析的过程) 1.需求: 基于Map ...

  5. 树莓派4B基本配置

    一.系统安装 官网下载好系统解压,使用SD Card Formatter格式化内存卡 # 查看内存卡状态,通过内存卡大小判断是哪个 df -lh # 卸载内存卡 diskutil unmount /d ...

  6. 关于ThinkPHP独立分组的一些使用注意事项

    关于ThinkPHP的独立分组,功能看上去挺好的,可是官方并没有给出详细的例子和说明,在此,根据实际的开发过程,给予各位php开发人员以下几点说明: 1.独立分组的目录结构 和官方说明一样,建立Mod ...

  7. Java中的数据类型与运算符

    一.变量的命名 (1)什么是变量:变量是java中存储数据的空间. (2)变量命名的规则:由:数(数字),字(字母),下(下划线),美(美元符号),人(人名币符号)组成的标识符.注:数字不能作为首字母 ...

  8. AntDesign vue学习笔记(四)使用组件切换

    同样实现上一篇功能, 改为使用组件切换,实现方法如下 1.修改MainFrm中的<router-view/>如下代码 2.注册局部组件 export default { name: 'Ma ...

  9. 分享一个Linux C++消息通信框架TCPSHM

    由于本人从事行业关系,Linux环境下的低延迟通信是我关注的技术之一.要达到极端的低延迟,当然同机器内IPC比网络通信快,而Linux IPC方式中无疑是共享内存延迟最低.不过相对于TCP这种通用的通 ...

  10. Field "details" doesn't have a default value

    [转载:原文链接http://my.oschina.net/wojibuzhu/blog/511104] MySQL 1364 错误提示:#1364 - Field "details&quo ...