获取微信公众号用户关注列表

通用工具类:CommonUtil

package com.weixin.util;import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.ConnectException;
import java.net.URL;import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;import com.weixin.entity.AccessToken;
import net.sf.json.JSONException;
import net.sf.json.JSONObject;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;/*** 通用工具*/
public class CommonUtil {private static Logger log = LoggerFactory.getLogger(CommonUtil.class);// 凭证获取Access_Token(请求方式为GET)public final static String tokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";/*** 发送https请求** @param requestUrl 请求地址* @param requestMethod 请求方式(GET、POST)* @param outputStr 提交的数据* @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)*/public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {JSONObject jsonObject = null;try {// 创建SSLContext对象,并使用我们指定的信任管理器初始化TrustManager[] tm = { new MyX509TrustManager() };SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");sslContext.init(null, tm, new java.security.SecureRandom());// 从SSLContext对象中得到SSLSocketFactory对象SSLSocketFactory ssf = sslContext.getSocketFactory();URL url = new URL(requestUrl);HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();conn.setSSLSocketFactory(ssf);conn.setDoOutput(true);conn.setDoInput(true);conn.setUseCaches(false);// 设置请求方式(GET/POST)conn.setRequestMethod(requestMethod);// 当outputStr不为null时向输出流写数据if (null != outputStr) {OutputStream outputStream = conn.getOutputStream();// 设置编码格式outputStream.write(outputStr.getBytes("UTF-8"));outputStream.close();}// 从输入流读取返回内容InputStream inputStream = conn.getInputStream();InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");BufferedReader bufferedReader = new BufferedReader(inputStreamReader);String str = null;StringBuffer buffer = new StringBuffer();while ((str = bufferedReader.readLine()) != null) {buffer.append(str);}// 释放资源bufferedReader.close();inputStreamReader.close();inputStream.close();inputStream = null;conn.disconnect();jsonObject = JSONObject.fromObject(buffer.toString());} catch (ConnectException ce) {log.error("连接超时:{}", ce);} catch (Exception e) {log.error("https请求异常:{}", e);}return jsonObject;}/*** 获取接口访问凭证** @param appid 凭证* @param appsecret 密钥* @return*/public static AccessToken getToken(String appid, String appsecret) {AccessToken token = null;String requestUrl = tokenUrl.replace("APPID", appid).replace("APPSECRET", appsecret);// 发起GET请求获取凭证JSONObject jsonObject = httpsRequest(requestUrl, "GET", null);if (null != jsonObject) {try {token = new AccessToken();token.setAccessToken(jsonObject.getString("access_token"));token.setExpiresIn(jsonObject.getInt("expires_in"));} catch (JSONException e) {token = null;// 获取token失败log.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));}}return token;}/*** URL编码(utf-8)** @param source* @return*/public static String urlEncodeUTF8(String source) {String result = source;try {result = java.net.URLEncoder.encode(source, "utf-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}return result;}/*** 根据内容类型判断文件扩展名** @param contentType 内容类型* @return*/public static String getFileExt(String contentType) {String fileExt = "";if ("image/jpeg".equals(contentType))fileExt = ".jpg";else if ("audio/mpeg".equals(contentType))fileExt = ".mp3";else if ("audio/amr".equals(contentType))fileExt = ".amr";else if ("video/mp4".equals(contentType))fileExt = ".mp4";else if ("video/mpeg4".equals(contentType))fileExt = ".mp4";return fileExt;}
}

获取用户关注列表信息:WeiXinUtils

package com.weixin.util;import com.weixin.entity.WeixinUser;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.util.ArrayList;
import java.util.List;public class WeiXinUtils {private static Logger log = LoggerFactory.getLogger(CommonUtil.class);/*** 获取用户信息** @param accessToken 接口访问凭证* @param openId 用户标识* @return WeixinUserInfo*/public static WeixinUser getUserInfo(String accessToken, String openId) {WeixinUser weixinUserInfo = null;// 拼接请求地址//String requestUrl = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID";// requestUrl = requestUrl.replace("ACCESS_TOKEN", accessToken).replace("OPENID", openId);String requestUrl = "https://api.weixin.qq.com/cgi-bin/user/info?access_token="+accessToken+"&openid="+openId;// 获取用户信息JSONObject jsonObject = CommonUtil.httpsRequest(requestUrl, "GET", null);//System.out.println("jsonObject: "+jsonObject);if (null != jsonObject) {try {weixinUserInfo = new WeixinUser();// 用户的标识weixinUserInfo.setOpenid(jsonObject.getString("openid"));// 关注状态(1是关注,0是未关注),未关注时获取不到其余信息weixinUserInfo.setSubscribe(jsonObject.getInt("subscribe"));// 用户关注时间weixinUserInfo.setSubscribeTime(jsonObject.getString("subscribe_time"));// 昵称weixinUserInfo.setNickname(jsonObject.getString("nickname"));// 用户的性别(1是男性,2是女性,0是未知)weixinUserInfo.setSex(jsonObject.getInt("sex"));// 用户所在国家weixinUserInfo.setCountry(jsonObject.getString("country"));// 用户所在省份weixinUserInfo.setProvince(jsonObject.getString("province"));// 用户所在城市weixinUserInfo.setCity(jsonObject.getString("city"));// 用户的语言,简体中文为zh_CNweixinUserInfo.setLanguage(jsonObject.getString("language"));// 用户头像weixinUserInfo.setHeadImgUrl(jsonObject.getString("headimgurl"));} catch (Exception e) {if (0 == weixinUserInfo.getSubscribe()) {log.error("用户{}已取消关注", weixinUserInfo.getOpenid());// System.out.println("用户{}已取消关注"+weixinUserInfo.getOpenid());} else {int errorCode = jsonObject.getInt("errcode");String errorMsg = jsonObject.getString("errmsg");log.error("获取用户信息失败 errcode:{} errmsg:{}", errorCode, errorMsg);//System.out.println("获取用户信息失败 errcode:{} errmsg:{}"+errorCode+errorMsg);}}}return weixinUserInfo;}/*** 通过accessToken 和 openIdList 获取多个用户关注列表信息* @param accessToken 接口访问凭证* @param openIdList 用户标识* @return 用户关注列表信息 返回类型为list*/public List<WeixinUser> getUserInfoList(String accessToken, List<String> openIdList){List<WeixinUser> weixinUserList = new ArrayList<>();WeixinUser user=null;for(String openId : openIdList) {user = new WeixinUser();user =getUserInfo(accessToken,openId);weixinUserList.add(user);}return weixinUserList;}
}

实体类:

package com.weixin.entity;public class AccessToken {// 接口访问凭证private String accessToken;// 凭证有效期,单位:秒private int expiresIn;public String getAccessToken() {return accessToken;}public void setAccessToken(String accessToken) {this.accessToken = accessToken;}public int getExpiresIn() {return expiresIn;}public void setExpiresIn(int expiresIn) {this.expiresIn = expiresIn;}
}
package com.weixin.entity;public class WeixinUser {private int subscribe;//  用户是否订阅该公众号标识,值为0时,代表此用户没有关注该公众号,拉取不到其余信息。private String openid;//  用户的标识,对当前公众号唯一private String nickname;// 用户的昵称private int sex;// 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知private String city;//    用户所在城市private String country;// 用户所在国家private String province;//    用户所在省份private String language;//    用户的语言,简体中文为zh_CNprivate String subscribeTime;// 用户关注的时间private String headImgUrl; //  用户头像public int getSubscribe() {return subscribe;}public void setSubscribe(int subscribe) {this.subscribe = subscribe;}public String getOpenid() {return openid;}public void setOpenid(String openid) {this.openid = openid;}public String getNickname() {return nickname;}public void setNickname(String nickname) {this.nickname = nickname;}public int getSex() {return sex;}public void setSex(int sex) {this.sex = sex;}public String getCity() {return city;}public void setCity(String city) {this.city = city;}public String getCountry() {return country;}public void setCountry(String country) {this.country = country;}public String getProvince() {return province;}public void setProvince(String province) {this.province = province;}public String getLanguage() {return language;}public void setLanguage(String language) {this.language = language;}public String getSubscribeTime() {return subscribeTime;}public void setSubscribeTime(String subscribeTime) {this.subscribeTime = subscribeTime;}public String getHeadImgUrl() {return headImgUrl;}public void setHeadImgUrl(String headImgUrl) {this.headImgUrl = headImgUrl;}@Overridepublic String toString() {return "WeixinUser{" +"subscribe=" + subscribe +", openid='" + openid + '\'' +", nickname='" + nickname + '\'' +", sex=" + sex +", city='" + city + '\'' +", country='" + country + '\'' +", province='" + province + '\'' +", language='" + language + '\'' +", subscribeTime='" + subscribeTime + '\'' +", headImgUrl='" + headImgUrl + '\'' +'}';}
}

获取OpenId

package com.weixin.util;import net.sf.json.JSONArray;
import net.sf.json.JSONObject;import java.util.ArrayList;
import java.util.List;public class GetOpenIdUtil {public List<String> getOpenIdList(String appid,String appsecret,String next_openId){//获取接口访问凭证String accessToken = CommonUtil.getToken(appid, appsecret).getAccessToken();String requestUrl = "https://api.weixin.qq.com/cgi-bin/user/get?access_token="+accessToken+"&next_openid="+next_openId;JSONObject jsonObject = CommonUtil.httpsRequest(requestUrl, "GET", null);String data = jsonObject.getString("data");JSONObject json = JSONObject.fromObject(data);List<String> listOpenId = new ArrayList<String>();if (jsonObject.has("data")) {JSONArray list = json.getJSONArray("openid");for (int i = 0; i < list.size(); i++) {listOpenId.add(list.getString(i));}}return listOpenId;}
}

微信请求–信息管理器

package com.weixin.util;import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.X509TrustManager;/*** 微信请求--信息管理器*/
public class MyX509TrustManager implements X509TrustManager {public MyX509TrustManager() {}@Overridepublic void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {}@Overridepublic void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {}@Overridepublic X509Certificate[] getAcceptedIssuers() {return  null;}
}

测试

 @Testpublic void test1(){GetOpenIdUtil getOpenIdList = new GetOpenIdUtil();List<String> openIdList = getOpenIdList.getOpenIdList("wx8dbd76c49615fac9","2ce38ac5f549e4984ecaa67934edd081","");WeiXinUtils weiXinUtils2 = new WeiXinUtils();String accessToken = CommonUtil.getToken("wx8dbd76c49615fac9", "2ce38ac5f549e4984ecaa67934edd081").getAccessToken();List<WeixinUser> list = weiXinUtils2.getUserInfoList(accessToken,openIdList);for (int i=0;i<list.size();i++){System.out.println(list.get(i));}}

用java代码实现获取微信公众号用户关注列表相关推荐

  1. vue axios封装 获取微信公众号用户的openid

    目录 axios封装 openid vue vue+ts axios封装 一般会在项目的src目录中,新建一个文件夹,作为网络请求模块,用来封装axios, 创建axios实例: axios.crea ...

  2. 获取微信公众号用户分组-php开发管理公众号用户

    经过上一节课程的学习, 你已经能够新建很多的用户分组, 要在我们的web服务器管理这些分组时, 你可以先从微信服务器把所有的分组获取到, 然后保存到自己的web服务器数据库, 这样下次使用时, 就可以 ...

  3. 获取微信公众号历史文章列表页链接

    通用公式:https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=这里替换你的biz== Tips:红字内容为下面找到的biz值,切 ...

  4. php获取微信公众号用户信息头像,微信公众号的web页面如何获取微信用户名和头像?...

    首先,你的网站入口必须是微信服务号(开通认证.拥有获取用户openid权限:订阅号是不行的). 方法:网页通过微信的Oauth2认证链接.(必须是微信的内置浏览器,通过微信服务号进入) 操作:通过服务 ...

  5. 手把手教你如何获取微信公众号用户的个人信息(包括OpenId)

    最近,对微信公众号有点兴趣,就自己研究了研究里面的一些内容,发现还挺有意思的,而且通过微信公众号可以调用一些比较有意思的接口,就比如百度开发服务平台 点击进入 里面的很有接口,就比较常见的翻译,语音识 ...

  6. H5获取微信公众号用户openId,用户信息

    一共两步:1:用户同意授权,获取code,2:将code值传给后台获取用户openId或用户信息 一.怎样获取code值 1.登录微信公众平台后台获取公众号的AppId,设置回调地址. 回调地址设置: ...

  7. 如何获取微信公众号的关注链接?

    1.打开PC端微信,点击公众号 2.左键点击公众号图标,然后再带年纪中间的那个按钮. 3.点击"复制链接地址",这串地址就是公众号关注链接.

  8. 如何获取微信公众号一键关注链接

    1.登录微信公众平台:https://mp.weixin.qq.com/ 2.登录后进入首页, 3.键盘按住[Ctrl+Shift+I],或者右键点击[检查],Ctrl+F查找  [wx.uin]获取 ...

  9. 获取微信公众号临时素材音频并转war格式

    获取微信公众号临时素材音频并转war格式 绝对亲测好用支持windows和linux 如果linux使用的话需要去ffmpge官网下载工具 第一步: 第二步: 首先选择linux系统 第三步: 选择适 ...

最新文章

  1. linux开启FTP以及添加用户配置权限,只允许访问自身目录,不能跳转根目录
  2. CRM Fiori my note应用的后台ABAP实现
  3. shiro学习(12)No WebApplicationContext found:
  4. C/C++—— #include“stdafx.h”详解
  5. GJB150.10A-2009霉菌试验标准费用-霉菌试验GJBA检测机构
  6. pdf数据结构题集c语言版,数据结构题集答案(c语言版)(严蔚敏-吴伟民著).pdf
  7. android 支付宝 记账本,使用支付宝记账----懒人的最佳记账模式
  8. ANT:修改测试报告的样式jmeter-results-shanhe-me.xsl
  9. 如果看了此文你还不懂傅里叶变换,那就过来掐死我吧【完整版教程】
  10. 洛克菲勒家族是如何发家的,我们都看看
  11. 一道面试题(限流,幂等key)
  12. EasyPusher安卓Android手机直播推送之RTSP流媒体协议流程
  13. 电脑使用技巧(按键失灵的几种解决方法)
  14. 管中窥豹,看看可能是谁在卖港股.
  15. 记2020年元宵节-我又回来了
  16. (asp.net)PayPal案例的关键源码代码__PayPal集成_API接口
  17. 使用OpenVINO™在“端—边—云”快速实现高性能人工智能推理
  18. new115.com dz.html,人源血管紧张素转化酶-C结构域在毕赤酵母中的表达
  19. 【C语言】初始C语言系列 代码详解 _ 编程入门 _【内附代码和图片】_ [初阶篇 _ 总结复习]
  20. 微擎安装之腾讯云懒人教程篇

热门文章

  1. Dell台式计算机BIOS放电,DELL台式机BIOS常见问题
  2. 贪心:将真分数用埃及分数之和表示
  3. csr8675 设置tws_tws 004如何将nodejs配置为使用端口443
  4. 数据结构c语言版二叉树的顺序存储表示,数据结构(十一) -- C语言版 -- 树 - 二叉树基本概念...
  5. 关于角色的转变的思考
  6. 金蝶云星空配置读写分离分发服务器
  7. 一款可扩展跨平台网络安全工具套件CaptfEncoder
  8. 学习SpringSecurity这一篇就够了
  9. excel 数据的有效性检查
  10. 基于springboot的高校社团管理系统