zoukankan      html  css  js  c++  java
  • 如何判断用户是否已经关注公众号

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

      

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

  • 相关阅读:
    Android Studio 单刷《第一行代码》系列 05 —— Fragment 基础
    Android Studio 单刷《第一行代码》系列 04 —— Activity 相关
    Android Studio 单刷《第一行代码》系列 03 —— Activity 基础
    Android Studio 单刷《第一行代码》系列 02 —— 日志工具 LogCat
    Android Studio 单刷《第一行代码》系列 01 —— 第一战 HelloWorld
    IDEA 内网手动添加oracle,mysql等数据源,以及server returns invalid timezone错误配置
    eclipse maven设置
    IntelliJ IDE 常用配置
    eclipse maven 常见问题解决方案
    Maven 安装和配置
  • 原文地址:https://www.cnblogs.com/zhangdiIT/p/7482922.html
Copyright © 2011-2022 走看看