请求微信接口,判断用户是否关注公众号
最近开发了一个投票活动,用户可上传一张照片,分享微信好友或朋友圈邀请好友点赞,点赞前几名可获得相应的奖品。上传照片的用户必须关注某公众号。
用户点击上传按钮,后台判断用户是否关注公众号,关注则前端可使用相机或选择本地照片进行上传 ,未关注则弹出二维码。
对于判断用户是否关注某公众号,微信官方提供的接口是:
https://api.weixin.qq.com/cgi-bin/user/info?access_token="+accessToken+"&openid="+openid+"&lang=zh_CN
其中access_token是全局的access_token,openid就是当前微信关于当前服务号的openId
附上代码
1 public static Boolean judgeFollow(String openId){ 2 List<NameValuePair> params=new ArrayList<NameValuePair>(); 3 params.add(new BasicNameValuePair("xx","xx")); 4 params.add(new BasicNameValuePair("xxx","xx")); 5 params.add(new BasicNameValuePair("openid",openId)); 6 String s = new HttpUtil().get("http://xxx.xxx.cn/xx/xxx.php", params, "UTF-8", "UTF-8"); 7 String decode = DES.Decode(s); 8 JSONObject jsonObject = JSONArray.parseObject(decode); 9 String data = jsonObject.get("data").toString(); 10 JSONObject jsonObject1 = JSONObject.parseObject(data); 11 Integer subscribe = jsonObject1.getInteger("subscribe"); 12 if(subscribe==null){ 13 return false; 14 } 15 return 1==subscribe?true:false; 16 }
上面的这个接口地址是公司封装好了的,没有直接请求官方的接口,只用带一个openID过去就行了,另外2个参数xx是公司接口需填的参数。json包是阿里的fastjson。通过这个接口获得subscribe这个字段,是否订阅,为1则表示当前微信关注了该公众号,为0则表示未关注。 完整的请求结果为
"subscribe":1, "openid":"oeQDZabsrfs12341***", "nickname":"会飞的猫", "sex":1, "language":"zh_CN", "city":"武汉", "province":"湖北", "country":"中国", "headimgurl":"http://wx.qlogo.cn/mmopen/kBwGJuwqK9**********************ibVUEpgFE90LH3b3uj7AYRjZP/0", "subscribe_time":1474964999, "unionid":"oGCG8t5**********jPQTPw", "remark":"", "groupid":0, "tagid_list":[ 只需要拿到subscribe这个字段的值就可以了。
下面附上一段直接请求官方接口的代码,也是网上搜的,试了一下没有问题。原文地址:https://blog.csdn.net/qq_23842683/article/details/53888927
1 public static boolean judgeIsFollow(String openid){ 2 logger.error("判断是否关注:"+openid); 3 Integer subscribe=null; 4 String accessToken = getAccessToken(); 5 String url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token="+accessToken+"&openid="+openid+"&lang=zh_CN"; 6 try { 7 URL urlGet = new URL(url); 8 logger.error("urlGet:"+urlGet); 9 HttpURLConnection http = (HttpURLConnection) urlGet.openConnection(); 10 http.setRequestMethod("GET"); // 必须是get方式请求 11 http.setRequestProperty("Content-Type","application/x-www-form-urlencoded"); 12 http.setDoOutput(true); 13 http.setDoInput(true); 14 http.connect(); 15 InputStream is = http.getInputStream(); 16 int size = is.available(); 17 byte[] jsonBytes = new byte[size]; 18 is.read(jsonBytes); 19 String message = new String(jsonBytes, "UTF-8"); 20 JSONObject demoJson = JSONObject.fromObject(message); 21 System.out.println("JSON字符串:"+demoJson); 22 subscribe = demoJson.getInt("subscribe"); 23 is.close(); 24 logger.error("当前subscribe:"+subscribe); 25 } catch (Exception e) { 26 e.printStackTrace(); 27 } 28 return 1==subscribe?true:false; 29 }
上面那个getAccessToken()方法是获得我当前服务号的全局accessToken。其余的基本和原文一样。有不对的地方希望各位看官批评指正。(虽然好像没什么人看)