• 如何判断用户是否已经关注公众号


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

      

    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秒的时效,超时之后才会向微信端再次请求,这段代码大家也可以直接忽略,只需关注重新请求的那部分代码即可。

  • 相关阅读:
    filter_input() 函数
    php get_magic_quotes_gpc()函数用法介绍
    echo、print、sprint、sprintf输出
    nl2br() 函数
    chop函数
    in_array 查询数组中是否存在某个值
    SQL技巧
    运算符(一)
    JS数据类型
    JS的基本语法与字面量和变量
  • 原文地址:https://www.cnblogs.com/zhangdiIT/p/7482922.html
Copyright © 2020-2023  润新知