java微信开发API解析(五)-用户管理

java微信开发API解析(五)-用户管理

全局说明

* 详细说明请参考前两篇文章。

本文说明

*本文分为五部分:
    * 工具类MyHttpUtils的封装
    * 用户分组管理文档的简单阅读解析
    * 分组bean的构建以及各种分组管理的实现源码
    * 用户管理的应用场景
    * 测试的微信号二维码
* 本文只分析用户管理的用户分组管理部分,其它都大同小异,不再分析处理。如需要,请留言。
* 以后原理分析会越来越简洁,具体原理分析请查看以前文章。
* 下一篇文章会对于用户普通消息、自定义菜单消息、自动完成用户分组等进行分析处理。
* 然后的文章是关于微信网页开发部分的分析。

工具类MyHttpUtils的封装

  • 在上篇文章关于自定义菜单的创建以及第三篇文章关于Access_token的处理,我们都用到了Http请求部分的内容。今天,我们简单的抽离,抽离成一个简单的工具类MyHttpUtils
  • MyHttpUtils.java

    package com.gist.utils;
    
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.net.MalformedURLException;
    import java.net.URL;
    
    import javax.net.ssl.HttpsURLConnection;
    
    /**
     * @author 高远</n>
     * 编写日期   2016-4-17下午12:45:37</n>
     * 邮箱  wgyscsf@163.com</n>
     * 博客  http://blog.csdn.net/wgyscsf</n>
     * TODO</n>
     */
    /*
     * 该工具封装一些请求http的一些常用方法。
     */
    public class MyHttpUtils {
        static String TAG = "MyHttpUtils";// 确定我们打印的数据属于哪个方法
    
        /*
         * 我们封装一个http请求方法,该方法需要传递一个请求的url和一个json数据。返回值是一个json字符串。
         */
        public static String getReturnJson(String url, String osrJson) {
            String reslut = "";// 返回的结果json
            try {
                // 创建一个url
                URL reqURL = new URL(url);
                // 拿取链接
                HttpsURLConnection httpsConn = (HttpsURLConnection) reqURL
                        .openConnection();
                // 当需要参数传递时,才执行该方法
                if (osrJson != null) {
                    httpsConn.setDoOutput(true);
                    // 取得该连接的输出流,以读取响应内容
                    OutputStreamWriter osr = new OutputStreamWriter(
                            httpsConn.getOutputStream());
                    osr.write(osrJson);// 写请求数据
                    osr.close();
                }
    
    
                // 返回结果
                InputStreamReader isr = new InputStreamReader(
                        httpsConn.getInputStream());
                char[] chars = new char[1024];
                int len;
                while ((len = isr.read(chars)) != -1) {
                    reslut += new String(chars, 0, len);
                }
                isr.close();
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return reslut;
        }
    }
    

用户分组管理文档的简单阅读解析

  • 用户分组管理
    • 创建分组
    • 查询所有分组
    • 查询用户所在分组
    • 修改分组名
    • 移动用户分组
    • 批量移动用户分组
    • 删除分组
  • 文档地址:http://mp.weixin.qq.com/wiki/8/d6d33cf60bce2a2e4fb10a21be9591b8.html
  • 关于创建分组(其它用户分组管理类似,不再给出),官网文档给出这样解释:

    • 开发者可以使用接口,对公众平台的分组进行查询、创建、修改、删除等操作,也可以使用接口在需要时移动用户到某个分组。
    • 接口调用请求说明

      http请求方式: POST(请使用https协议)
      https://api.weixin.qq.com/cgi-bin/groups/create?access_token=ACCESS_TOKEN
      POST数据格式:json
      POST数据例子:{"group":{"name":"test"}}  
      
    • 返回说明 正常时的返回JSON数据包示例:

      {
          "group": {
              "id": 107, 
              "name": "test"
          }
      }
      
  • 理解:

    • 同样的post请求,同样的json处理,同样的数据返回格式。
    • 我们重点放到关于bean的构建,因为bean格式的正确与否直接影响到我们能否正确进行分组管理。
    • 特别注意,移动用户分组可以是在用户没有分组的时候进行(因为有一个默认分组)。
    • 特别注意,对于没有认证的公众号,是不能进行分组管理的,因为没有权限,会报异常,异常代码是48001,文档给出该代码的解释是“api功能未授权,请确认公众号已获得该接口,可以在公众平台官网-开发者中心页中查看接口权限”。

分组bean的构建以及各种分组管理的实现源码

  • 分组bean的构建

    /*
     * 分组所需要的各种信息
     */
    public class Group {
        private int id;
        private String name;
        private int count;
        private String openid;
        private String to_groupid;
        private String groupid;
    
        //Setter、Getter...
    
    }
    
    
    
    /*
     * 有时候返回是一个list类型;或者是一个类似这样格式的信息:{
     * ‘group‘:{‘name‘:‘组名‘}},请注意这个json的“group”。常规的bean,转化为json是{‘name‘:‘组名‘}这样的格式。
     * 我们需要这样一个类进行处理,我们称之为Group联合体。
     */
    public class GroupUnit {
        private Group group;
        private List<Group> groups;
    
        //Setter、Getter...
        }
    
  • 各种分组操作的实现源码

    package com.gist.demo_offline;
    
    import java.util.List;
    
    import org.junit.Test;
    
    import com.gist.bean.Group;
    import com.gist.bean.GroupUnit;
    import com.gist.utils.AccessTokenUtils;
    import com.gist.utils.MyHttpUtils;
    import com.google.gson.Gson;
    
    /**
     * @author 高远</n> 编写日期 2016-4-17下午12:31:32</n> 邮箱 wgyscsf@163.com</n> 博客
     *         http://blog.csdn.net/wgyscsf</n> TODO</n>
     */
    /*
     * 该类主要测试用户分组管理
     */
    public class GroupManager {
        private static final String TAG = "GroupManager";
    
        /*
         * 测试创建分组
         */
        @Test
        public void createGroup() {
            String ACCESS_TOKEN = AccessTokenUtils.getSavedAccess_token();// 获取我们保存且实时更新的ACCESS_TOKEN,实现原理参看第三篇文章
            String url = "https://api.weixin.qq.com/cgi-bin/groups/create?access_token="
                    + ACCESS_TOKEN;// 请求路径
            // String osrJson = "{‘group‘:{‘name‘:‘组名‘}}";// 简单测试,不再封装对应bean
            // 创建分组群组
            GroupUnit groupUnit = new GroupUnit();
            // 创建分组对象
            Group group = new Group();
            group.setName("测试组名");// 设置新建组名
            groupUnit.setGroup(group);
            Gson gson = new Gson();
            String osrJson = gson.toJson(groupUnit);
            System.out.println(osrJson);
            String returnJson = MyHttpUtils.getReturnJson(url, osrJson);// 我们封装的http工具类
            System.out.println(TAG + "返回结果:" + returnJson);
        }
    
        /*
         * 测试查询所有分组
         */
        @Test
        public void showAllGroup() {
            String ACCESS_TOKEN = AccessTokenUtils.getSavedAccess_token();// 获取我们保存且实时更新的ACCESS_TOKEN,实现原理参看第三篇文章
            String url = "https://api.weixin.qq.com/cgi-bin/groups/get?access_token="
                    + ACCESS_TOKEN;// 请求路径
            String returnJson = MyHttpUtils.getReturnJson(url, null);// 我们封装的http工具类
            System.out.println(TAG + "返回结果:" + returnJson);
    
            /*
             * 我们对返回的数据进行封装
             */
            GroupUnit groupUnit = new GroupUnit();
            Gson gson = new Gson();
            groupUnit = gson.fromJson(returnJson, groupUnit.getClass());
            List<Group> groups = groupUnit.getGroups();
            for (Group group : groups) {
                System.out.println(TAG + ":组名" + group.getName());
            }
        }
    
        /*
         * 该方法测试得到用户所在的分组id,需要传递过来一个用户openid
         */
        public static String getGroup(String openid) {
    
            String ACCESS_TOKEN = AccessTokenUtils.getSavedAccess_token();// 获取我们保存且实时更新的ACCESS_TOKEN,实现原理参看第三篇文章
            String url = "https://api.weixin.qq.com/cgi-bin/groups/getid?access_token="
                    + ACCESS_TOKEN;// 请求路径
            String osrJson = "{\"openid\":\"" + openid + "\"}";// 简单json,不再封装
            System.out.println(osrJson);
            String returnJson = MyHttpUtils.getReturnJson(url, osrJson);// 我们封装的http工具类
            System.out.println(TAG + "返回结果:" + returnJson);
            /*
             * 封装返回结果
             */
            Group goup = new Group();
            Gson gson = new Gson();
            goup = gson.fromJson(returnJson, goup.getClass());
            return goup.getGroupid();
    
        }
    
        /*
         * 该方法测试将用户移动到指定分组
         */
        public static String updateGroup(String openid, String to_groupid) {
            String ACCESS_TOKEN = AccessTokenUtils.getSavedAccess_token();// 获取我们保存且实时更新的ACCESS_TOKEN,实现原理参看第三篇文章
            String url = "https://api.weixin.qq.com/cgi-bin/groups/members/update?access_token="
                    + ACCESS_TOKEN;// 请求路径
            // 封装请求数据
            Group group = new Group();
            group.setOpenid(openid);
            group.setTo_groupid(to_groupid);
            Gson gson = new Gson();
            String osrJson = gson.toJson(group);
            System.out.println(TAG + osrJson);
    
            String returnJson = MyHttpUtils.getReturnJson(url, osrJson);// 我们封装的http工具类
            System.out.println(TAG + "返回结果:" + returnJson);
    
            return returnJson;
    
        }
    
        /**
         * TODO
         */
        public static void main(String[] args) {
    
            // 移动分组
            String msg = updateGroup("obM1Qt2oWq3K1FD6MIM1ImCm5ZZE", 101 + "");
            System.out.println(msg);
            // 获取用户分组id
            String id = getGroup("obM1Qt2oWq3K1FD6MIM1ImCm5ZZE");
            System.out.println(id);
        }
    
    }
    

用户管理的应用场景

  • 应用一:假如一个公众号需要根据分组给用户提供相应的服务,这个时候人工去一个一个实现分组,甚至需要和用户沟通,太麻烦。我们可以在用户关注该公众号时要求用户根据指令(比如:1、2)进行自动分组,可以省去很大人工分组的麻烦,并且不需要和用户沟通即可以实现。
  • 应用二:假如我们想要设置用户备注,可以通过该部分知识,实现“智能化”,让用户自动设置自己的备注名。
  • 应用三:对于深度定制的微信公众号第三方平台,这部分很重要。比如显示用户分组、显示用户个人信息、自动化分组、改名、添加分组等。

测试的微信号二维码

  • 测试号二维码
    java微信开发API解析(五)-用户管理

  • 个人技术学习公众号,欢迎关注
    java微信开发API解析(五)-用户管理

java微信开发API解析(五)-用户管理

上一篇:仿微信主界面导航栏图标字体颜色的变化


下一篇:微信硬件蓝牙开发各种坑不完全开发指南