问题背景:在做微信公众号开发的时候往往会遇到这样的场景,用户通过网站设计的注册接口成功注册为网站的用户,但是由于网站是放在微信公众号内的,所以想让用户一并关注该公众号以方便用户下次登录,这个时候判断用户是否已经关注了公众号就显得尤为重要了。那么,如何判断用户是否关注公众号呢,具体代码如下:

  

public  String judgeIsFollow(
            String openId,
            HttpServletRequest req,
            HttpServletResponse resp){    
        //获取基础accesstoken
        String accessToken = "";
        //1、先从本地数据库读取
        JsonReadUtil jsonUtil = new JsonReadUtil();
        String pathRoot = req.getSession().getServletContext().getRealPath("");    
        AccessToken token = jsonUtil.findAccessToken(pathRoot+"/config/access_token.json");
        //2、获取当前时间精确到秒
        Date d = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
        String dateNowStr = sdf.format(d);
        //3、将当前日期与数据表日期做对比,大于7200秒从新请求
        long sec = 0;
        try {
            sec = DateUtil.getDistanceTimeForSec(token.getDate(), dateNowStr);
            log.info("INFO[DistanceTime]================>"+sec);
        } catch (ParseException e1) {
            log.info("ERROR================>DistanceTime");
            log.info("ERROR================>DistanceTime");
            log.info("ERROR================>DistanceTime");
            e1.printStackTrace();
        }
        if(sec < 7200){//时间小于7200,直接从数据库中读取accesstoken
            log.info("GET FROM================>JSON");
            accessToken = token.getToken();
        }else{//时间大于7200重新从微信请求
            log.info("GET FROM================>WECHAT");
            //执行获取accessToken
            WeixinUtil u = new WeixinUtil();
            AccessToken t = u.getAccessToken();
            log.info("accessToken[base]====================>"+token.getToken());
            log.info("accessToken[time]====================>"+token.getExpiresIn());
            //获取当前精确时间
            Date d1 = new Date();
            String dateNowStr1 = sdf.format(d1);
            t.setDate(dateNowStr1);
            //执行写入操作
            jsonUtil.writeAccesstoken(t, req);
            //赋值
            accessToken = t.getToken();
        }
        //执行获取用户是否关注公众号操作
        Integer subscribe = null;
        String url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token="+accessToken+"&openid="+openId+"&lang=zh_CN";
        try {  
                URL urlGet = new URL(url);  
                HttpURLConnection http = (HttpURLConnection) urlGet.openConnection();  
                http.setRequestMethod("GET"); // 必须是get方式请求  
                http.setRequestProperty("Content-Type","application/x-www-form-urlencoded");  
                http.setDoOutput(true);  
                http.setDoInput(true);  
                http.connect();  
                InputStream is = http.getInputStream();  
                int size = is.available();  
                byte[] jsonBytes = new byte[size];  
                is.read(jsonBytes);  
                String message = new String(jsonBytes, "UTF-8");  
                JSONObject demoJson = JSONObject.fromObject(message);
                log.info("json[subscribe]====================>"+demoJson.toString());
                subscribe = demoJson.getInt("subscribe");
                is.close();  
        } catch (Exception e) {  
                e.printStackTrace();  
        }
        if(subscribe==null){
            return "2";
        }else{            
            return 1==subscribe?"1":"0";
        }
    }

  这便是判断用户是否关注公众号的方法。0代表未关注,1代表关注,2代表请求未成功。(不成功的原因有:1、openid错误,2、accesstoken已经失效等)这里我要特别说明一下,由于业务设计原因,用户的openid我已经预先保存到用户的字段中去了,所以这里是直接传参调用即可,如果你的业务中没有预先保存用户openid的话,那么你需要再预先获取一下(即向微信端请求),第二个问题是access_token的获取,因为微信开发机制的原因,对于accesstoken的请求一天有限制,所以我将其缓存到了服务器上并设置了7200秒的时效,超时之后才会向微信端再次请求,这段代码大家也可以直接忽略,只需关注重新请求的那部分代码即可。