zoukankan      html  css  js  c++  java
  • Java微信二次开发(八)

    高级接口,先做了两个(获取用户信息和获取关注者列表)

    第一步:找到包com.wtz.vo,新建类UserInfo.java

     1 package com.wtz.vo;
     2 
     3 /**
     4  *     @author wangtianze QQ:864620012
     5  *    @date 2017年4月24日 下午4:51:57
     6  *  <p>version:1.0</p>
     7  *     <p>description:微信用户的基本信息</p>
     8  */
     9 public class UserInfo {
    10     //用户的标识
    11     private String openId;
    12     //关注状态(1是关注,0是未关注),未关注时获取不到其余信息
    13     private int subscribe;
    14     //用户关注时间,为时间戳,如果用户曾多次关注,则取最后关注时间
    15     private String subscribeTime;
    16     //昵称
    17     private String nickname;
    18     //用户的性别(1是男性,2是女性,0是未知)
    19     private int sex;
    20     //用户所在国家
    21     private String country;
    22     //用户所在省份
    23     private String province;
    24     //用户所在城市
    25     private String city;
    26     //用户的语言,中文为zh_CN
    27     private String language;
    28     //用户头像
    29     private String headImgUrl;
    30     //unionid
    31     private String unionid;
    32     
    33     public String getOpenId() {
    34         return openId;
    35     }
    36     public void setOpenId(String openId) {
    37         this.openId = openId;
    38     }
    39     public int getSubscribe() {
    40         return subscribe;
    41     }
    42     public void setSubscribe(int subscribe) {
    43         this.subscribe = subscribe;
    44     }
    45     public String getSubscribeTime() {
    46         return subscribeTime;
    47     }
    48     public void setSubscribeTime(String subscribeTime) {
    49         this.subscribeTime = subscribeTime;
    50     }
    51     public String getNickname() {
    52         return nickname;
    53     }
    54     public void setNickname(String nickname) {
    55         this.nickname = nickname;
    56     }
    57     public int getSex() {
    58         return sex;
    59     }
    60     public void setSex(int sex) {
    61         this.sex = sex;
    62     }
    63     public String getCountry() {
    64         return country;
    65     }
    66     public void setCountry(String country) {
    67         this.country = country;
    68     }
    69     public String getProvince() {
    70         return province;
    71     }
    72     public void setProvince(String province) {
    73         this.province = province;
    74     }
    75     public String getCity() {
    76         return city;
    77     }
    78     public void setCity(String city) {
    79         this.city = city;
    80     }
    81     public String getLanguage() {
    82         return language;
    83     }
    84     public void setLanguage(String language) {
    85         this.language = language;
    86     }
    87     public String getHeadImgUrl() {
    88         return headImgUrl;
    89     }
    90     public void setHeadImgUrl(String headImgUrl) {
    91         this.headImgUrl = headImgUrl;
    92     }
    93     public String getUnionid() {
    94         return unionid;
    95     }
    96     public void setUnionid(String unionid) {
    97         this.unionid = unionid;
    98     }
    99 }

    第二步:找到包com.wtz.vo,新建类UserList.java

     1 package com.wtz.vo;
     2 
     3 import java.util.List;
     4 
     5 /**
     6  *     @author wangtianze QQ:864620012
     7  *    @date 2017年4月24日 下午5:08:28
     8  *  <p>version:1.0</p>
     9  *     <p>description:关注的用户列表</p>
    10  */
    11 public class UserList {
    12     //公众账号的总关注用户数
    13     private int total;
    14     //获取的openId个数
    15     private int count;
    16     //OpenID列表
    17     private List<String> openIdList;
    18     //拉取列表的后一个用户的OPENID
    19     private String nextOpenId;
    20     
    21     public int getTotal() {
    22         return total;
    23     }
    24     public void setTotal(int total) {
    25         this.total = total;
    26     }
    27     public int getCount() {
    28         return count;
    29     }
    30     public void setCount(int count) {
    31         this.count = count;
    32     }
    33     public List<String> getOpenIdList() {
    34         return openIdList;
    35     }
    36     public void setOpenIdList(List<String> openIdList) {
    37         this.openIdList = openIdList;
    38     }
    39     public String getNextOpenId() {
    40         return nextOpenId;
    41     }
    42     public void setNextOpenId(String nextOpenId) {
    43         this.nextOpenId = nextOpenId;
    44     }
    45 }

    第三步:找到包com.wtz.vo,新建类WeixinGroup.java

     1 package com.wtz.vo;
     2 
     3 /**
     4  *     @author wangtianze QQ:864620012
     5  *    @date 2017年4月24日 下午5:24:57
     6  *  <p>version:1.0</p>
     7  *     <p>description:公众账号分组信息</p>
     8  */
     9 public class WeixinGroup {
    10     //分组id
    11     private int id;
    12     //分组名称
    13     private String name;
    14     //分组内的用户数
    15     private int count;
    16     
    17     public int getId() {
    18         return id;
    19     }
    20     public void setId(int id) {
    21         this.id = id;
    22     }
    23     public String getName() {
    24         return name;
    25     }
    26     public void setName(String name) {
    27         this.name = name;
    28     }
    29     public int getCount() {
    30         return count;
    31     }
    32     public void setCount(int count) {
    33         this.count = count;
    34     }
    35 }

    第四步:找到包com.wtz.util,修改类WeixinUtil.java

      1 package com.wtz.util;
      2 
      3 import java.io.BufferedReader;
      4 import java.io.IOException;
      5 import java.io.InputStream;
      6 import java.io.InputStreamReader;
      7 import java.io.OutputStream;
      8 import java.io.UnsupportedEncodingException;
      9 import java.net.ConnectException;
     10 import java.net.MalformedURLException;
     11 import java.net.URL;
     12 import java.security.KeyManagementException;
     13 import java.security.NoSuchAlgorithmException;
     14 import java.security.NoSuchProviderException;
     15 
     16 import javax.net.ssl.HttpsURLConnection;
     17 import javax.net.ssl.SSLContext;
     18 import javax.net.ssl.SSLSocketFactory;
     19 import javax.net.ssl.TrustManager;
     20 
     21 import net.sf.json.JSONObject;
     22 
     23 import org.slf4j.Logger;
     24 import org.slf4j.LoggerFactory;
     25 
     26 import com.wtz.vo.Token;
     27 
     28 /**
     29  *     @author wangtianze QQ:864620012
     30  *    @date 2017年4月23日 下午5:08:02
     31  *  <p>version:1.0</p>
     32  *     <p>description:通用https请求工具类</p>
     33  */
     34 public class WeixinUtil {
     35     //需要导入库slf4j-api-1.5.10.jar和slf4j-log4j12-1.5.10.jar以及log4j-1.2.15.jar和log4j.properties
     36     private static Logger log = LoggerFactory.getLogger(WeixinUtil.class);
     37     
     38     //凭证获取(GET)
     39     public final static String token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
     40     
     41     /**
     42      * 发送https请求
     43      * 
     44      * @param requestUrl 请求地址
     45      * @param requestMethod 请求方式(GET/POST)
     46      * @param outputStr 提交的数据
     47      * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
     48      */
     49     public static JSONObject httpsRequest(String requestUrl,String requestMethod,String outputStr){
     50         //需要导入库json-lib-2.2.1-jdk15.jar
     51         JSONObject jsonObject = null;
     52         
     53         //创建SSLContext对象,并使用我们指定的信任管理器初始化
     54         TrustManager[] tm = {new MyX509TrustManager()};
     55         try {
     56             SSLContext sslContext = SSLContext.getInstance("SSL","SunJSSE");
     57             
     58             sslContext.init(null, tm, new java.security.SecureRandom());
     59             
     60             //从上述SSLContext对象中得到SSLSocketFactory对象
     61             SSLSocketFactory ssf = sslContext.getSocketFactory();
     62             
     63             URL url = new URL(requestUrl);
     64             
     65             HttpsURLConnection connection = (HttpsURLConnection)url.openConnection();
     66             
     67             connection.setSSLSocketFactory(ssf);
     68             
     69             connection.setDoOutput(true);
     70             connection.setDoInput(true);
     71             connection.setUseCaches(false);
     72             
     73             //设置请求方式(GET/POST)
     74             connection.setRequestMethod(requestMethod);
     75             
     76             //当outputStr不为null时向输出流写入数据
     77             if(null != outputStr){
     78                 OutputStream outputStream = connection.getOutputStream();
     79                 outputStream.write(outputStr.getBytes("UTF-8"));
     80                 outputStream.close();
     81             }
     82             
     83             //从输入流读取返回内容
     84             InputStream inputStream = connection.getInputStream();
     85             InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
     86             BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
     87             String str = null;
     88             StringBuffer buffer = new StringBuffer();
     89             while((str = bufferedReader.readLine()) != null){
     90                 buffer.append(str);
     91             }
     92             
     93             //释放资源
     94             bufferedReader.close();
     95             inputStreamReader.close();
     96             inputStream.close();
     97             inputStream = null;
     98             connection.disconnect();
     99             
    100             jsonObject = JSONObject.fromObject(buffer.toString());
    101             
    102         } catch (ConnectException e) {
    103             log.error("连接超时:{}",e);
    104         } catch (NoSuchAlgorithmException e) {
    105             log.error("https请求异常:{}",e);
    106         } catch (NoSuchProviderException e) {
    107             log.error("https请求异常:{}",e);
    108         } catch (KeyManagementException e) {
    109             log.error("https请求异常:{}",e);
    110         } catch (MalformedURLException e) {
    111             log.error("https请求异常:{}",e);
    112         } catch (IOException e){
    113             log.error("https请求异常:{}",e);
    114         } catch (Exception e) {
    115             log.error("https请求异常:{}",e);
    116         }
    117     
    118         return jsonObject;
    119     }
    120     
    121     /**
    122      * 获取接口访问凭证
    123      * 
    124      * @param appid 
    125      * @param appsecret 密钥
    126      * @return
    127      */
    128     public static Token getToken(String appid,String appsecret){
    129         Token token = null;
    130         String requestUrl = token_url.replace("APPID", appid).replace("APPSecret", appsecret);
    131         
    132         //发起GET请求获取凭证
    133         JSONObject jsonObject = httpsRequest(requestUrl,"GET",null);
    134         
    135         if(null != jsonObject){
    136             token = new Token();
    137             token.setAccessToken(jsonObject.getString("access_token"));
    138             token.setExpiresIn(jsonObject.getInt("expires_in"));
    139         }
    140         
    141         return token;
    142     }
    143     
    144     /**
    145      * URL编码(utf-8)
    146      * @param source
    147      * @return
    148      */
    149     public static String urlEncodeUTF8(String source){
    150         String result = source;
    151         try {
    152             result = java.net.URLEncoder.encode(source,"utf-8");
    153         } catch (UnsupportedEncodingException e) {
    154             // TODO Auto-generated catch block
    155             e.printStackTrace();
    156         }
    157         return result;
    158     }
    159     
    160     /**
    161      * 根据内容类型判断来返回文件的扩展名
    162      * @param contentType 内容类型
    163      * @return
    164      */
    165     public static String getFileExt(String contentType){
    166         String fileExt = "";
    167         if("img/jepg".equals(contentType)){
    168             fileExt = ".jpg";
    169         }else if("audio/mpeg".equals(contentType)){
    170             fileExt = ".mp3";
    171         }else if("audio/amr".equals(contentType)){
    172             fileExt = ".amr";
    173         }else if("video/mp4".equals(contentType)){
    174             fileExt = ".mp4";
    175         }else if("video/mpeg4".equals(contentType)){
    176             fileExt = ".mp4";
    177         }
    178         
    179         return fileExt;
    180     }
    181 }

    第五步:找到包com.wtz.util,新建类AdvancedUtil.java

      1 package com.wtz.util;
      2 
      3 import java.text.SimpleDateFormat;
      4 import java.util.Date;
      5 import java.util.List;
      6 
      7 import net.sf.json.JSONArray;
      8 import net.sf.json.JSONObject;
      9 
     10 import org.slf4j.Logger;
     11 import org.slf4j.LoggerFactory;
     12 
     13 import com.wtz.vo.UserInfo;
     14 import com.wtz.vo.UserList;
     15 import com.wtz.vo.WeixinGroup;
     16 
     17 /**
     18  *     @author wangtianze QQ:864620012
     19  *    @date 2017年4月24日 下午7:36:03
     20  *  <p>version:1.0</p>
     21  *     <p>description:高级接口工具类</p>
     22  */
     23 public class AdvancedUtil {
     24     private static Logger log = LoggerFactory.getLogger(AdvancedUtil.class);
     25     
     26     /**
     27      * 获取用户信息
     28      * 
     29      * @param accessToken 接口访问凭证
     30      * @param openId 用户凭证
     31      * @return WeixinUserInfo
     32      */
     33     public static UserInfo getUserInfo(String accessToken,String openId){
     34         UserInfo weixinUserInfo = null;
     35         //拼接请求地址
     36         String requestUrl = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID";
     37         requestUrl = requestUrl.replace("ACCESS_TOKEN",accessToken).replace("OPENID",openId);
     38         //获取用户信息
     39         JSONObject jsonObject = WeixinUtil.httpsRequest(requestUrl, "GET", null);
     40         
     41         if(null != jsonObject){
     42             try{
     43                 weixinUserInfo = new UserInfo();
     44                 
     45                 //用户的标识
     46                 weixinUserInfo.setOpenId(jsonObject.getString("openid"));
     47                 
     48                 //关注状态(1是关注,0是未关注),未关注时获取不到其余信息
     49                 weixinUserInfo.setSubscribe(jsonObject.getInt("subscribe"));
     50                 
     51                 //用户关注时间
     52                 weixinUserInfo.setSubscribeTime(jsonObject.getString("subscribe_time"));
     53                 
     54                 //昵称
     55                 weixinUserInfo.setNickname(jsonObject.getString("nickname"));
     56                 
     57                 //用户的性别(1是男性,2是女性,0是未知)
     58                 weixinUserInfo.setSex(jsonObject.getInt("sex"));
     59                 
     60                 //用户所在的国家
     61                 weixinUserInfo.setCountry(jsonObject.getString("country"));
     62                 
     63                 //用户所在的省份
     64                 weixinUserInfo.setProvince(jsonObject.getString("province"));
     65                 
     66                 //用户所在的城市
     67                 weixinUserInfo.setCity(jsonObject.getString("city"));
     68                 
     69                 //用户的语言,简体中文为zh_CN
     70                 weixinUserInfo.setLanguage(jsonObject.getString("language"));
     71                 
     72                 //用户头像
     73                 weixinUserInfo.setHeadImgUrl(jsonObject.getString("headimgurl"));
     74                 
     75                 //uninonid
     76                 weixinUserInfo.setUnionid(jsonObject.getString("unionid"));
     77             }catch(Exception e){
     78                 if(0 == weixinUserInfo.getSubscribe()){
     79                     log.error("用户{}已取消关注",weixinUserInfo.getOpenId());
     80                 }else{
     81                     int errorCode = jsonObject.getInt("errcode");
     82                     String errorMsg = jsonObject.getString("errmsg");
     83                     log.error("获取用户信息失败 errorcode:{} errormsg:{}",errorCode,errorMsg);
     84                 }
     85             }
     86         }
     87         return weixinUserInfo;
     88     } 
     89     
     90     /**
     91      * 获取关注者列表
     92      * 
     93      * @param accessToken 调用接口凭证
     94      * @param nextOpenId 第一个拉取nextOpenId,不填默认从头开始拉取
     95      * @return WeixinUserList
     96      */
     97     @SuppressWarnings({ "deprecation", "unchecked" })
     98     public static UserList getUserList(String accessToken,String nextOpenId){
     99         UserList weixinUserList = null;
    100         if(null == nextOpenId){
    101             nextOpenId = "";
    102         }
    103         //拼接请求地址
    104         String requestUrl = "https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&next_openid=NEXT_OPENID";
    105         
    106         requestUrl.replace("ACCESS_TOKEN", accessToken).replace("NEXT_OPENID",nextOpenId);
    107         
    108         //获取关注者列表
    109         JSONObject jsonObject = WeixinUtil.httpsRequest(requestUrl, "GET", null);
    110         
    111         //如果请求成功
    112         if(null != jsonObject){
    113             weixinUserList = new UserList();
    114             weixinUserList.setTotal(jsonObject.getInt("total"));
    115             weixinUserList.setCount(jsonObject.getInt("count"));
    116             weixinUserList.setNextOpenId(jsonObject.getString("next_openid"));
    117             JSONObject dataObject = (JSONObject)jsonObject.get("data");
    118             weixinUserList.setOpenIdList(JSONArray.toList(dataObject.getJSONArray("openid"),List.class));    
    119         }
    120 
    121         return weixinUserList;
    122     }
    123     
    124     public static void main(String[] args){
    125         //获取接口访问凭证
    126         String accessToken = WeixinUtil.getToken(Parameter.appId,Parameter.appSecret).getAccessToken();
    127         System.out.println("accessToken:" + accessToken);
    128         
    129         //获取关注者列表
    130         UserList weixinUserList = getUserList(accessToken,"");
    131         System.out.println("总关注用户数:" + weixinUserList.getTotal());
    132         System.out.println("本次获取用户数:" + weixinUserList.getCount());
    133         System.out.println("OpenId列表:" + weixinUserList.getOpenIdList().toString());
    134         System.out.println("next_openid" + weixinUserList.getNextOpenId());
    135         
    136         UserInfo user = null;
    137         List<String> list = weixinUserList.getOpenIdList();
    138         for(int i = 0; i < list.size(); i++){
    139             //获取用户信息
    140             user = getUserInfo(accessToken,(String)list.get(i));
    141             System.out.println("OpenId:" + user.getOpenId());
    142             System.out.println("关注状态:" + user.getSubscribe());
    143             System.out.println("关注时间:" + (new SimpleDateFormat("yyyy-MM-dd HH:mm-ss").format(new Date(new Long(user.getSubscribeTime())))));
    144             System.out.println("昵称:" + user.getNickname());
    145             System.out.println("性别:" + user.getSex());
    146             System.out.println("国家:" + user.getCountry());
    147             System.out.println("省份:" + user.getProvince());
    148             System.out.println("城市:" + user.getCity());
    149             System.out.println("语言:" + user.getLanguage());
    150             System.out.println("头像:" + user.getHeadImgUrl());
    151             System.out.println("unionid:" + user.getUnionid());
    152             System.out.println("=====================================");
    153         }
    154     }
    155 }

    高级接口(获取用户信息和获取关注者列表)完成

  • 相关阅读:
    PHP 8.0 带来的新特性
    do sth 之 提取了一份文档
    Java入门15---网络编程
    Java入门14---logback
    限流策略
    JConsole 可视化工具
    SpringBoot注解---6.声明式事务
    SpringBoot注解---5.AOP
    SpringBoot注解---4.扩展原理
    SpringBoot注解---2.组件赋值
  • 原文地址:https://www.cnblogs.com/wangtianze/p/6760592.html
Copyright © 2011-2022 走看看