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. NOIP动态规划大合集

    1.前言 NOIP2003-2014动态规划题目大合集,有简单的也有难的(对于我这种动态规划盲当然存在难的),今天就把这些东西归纳一下,做一个比较全面的总结,方便对动态规划有一个更深的理解. 2.NO ...

  2. FFT学习

    看了一天的多项式的内容,看博客的时候好像还是那么回事,一看题,哇塞,发现我其实连卷积是啥都没看懂. qtdydb,背板子. 不知道卷积是啥就很伤了. P3803 [模板]多项式乘法(FFT) #inc ...

  3. 洛谷P5020 货币系统

    题目 题意简化一下就是找题目给定的n个数最多能消掉多少个,我们用个tong[i]来记录i这个数值能不能用小于等于i的货币组合起来,等于1意味着他只能由自己本身的货币组成,等于2说明他可以被其他货币组成 ...

  4. 自动签发https证书工具 cert manager

    最近cert manager进行升级,不再支持0.11以下的版本了,所以进行升级.但是发现不能直接通过更改镜像版本来升级,在Apps里的版本也是旧版本,部署后发现不支持,于是自已动手,根据文档整理了一 ...

  5. python jenkins api

    #!/usr/bin/pythonimport sys, timeimport shutil, commands#coding=utf-8 import sysreload(sys)sys.setde ...

  6. 三个基于.net的浏览器内核使用的比较

    最近做模拟登陆发帖相关的项目 分别尝试了基于IE .NET自带的 webbrowser 和 基于WebKit 的WebKit.NET和openWebkitSharp 最开始肯定是用的.NET自带的we ...

  7. 分布式系统中我们会对一些数据量大的业务进行分拆,分布式系统中唯一主键ID的生成问题

    分布式全局唯一ID生成策略​ https://www.cnblogs.com/vandusty/p/11462585.html 一.背景 分布式系统中我们会对一些数据量大的业务进行分拆,如:用户表,订 ...

  8. Web Api 实现删除功能接口

    删除数据 [HttpDelete] public ResultModel DeleteDataById(int id) { var result = new ResultModel(); //实例化数 ...

  9. react 父组件调用子组件方法、子组件调用父组件方法

    我们闲话不多说,直接上代码 // 父组件 import React, {Component} from 'react'; class Parents extends Component { const ...

  10. 模拟 + 暴搜 --- Help Me with the Game

    Help Me with the Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3175   Accepted: ...