问题背景:在做微信公众号开发的时候往往会遇到这样的场景,用户通过网站设计的注册接口成功注册为网站的用户,但是由于网站是放在微信公众号内的,所以想让用户一并关注该公众号以方便用户下次登录,这个时候判断用户是否已经关注了公众号就显得尤为重要了。那么,如何判断用户是否关注公众号呢,具体代码如下:
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秒的时效,超时之后才会向微信端再次请求,这段代码大家也可以直接忽略,只需关注重新请求的那部分代码即可。