当前位置 博文首页 > 高远的博客:java微信开发API解析(五)-用户管理

    高远的博客:java微信开发API解析(五)-用户管理

    作者:[db:作者] 时间:2021-09-06 22:48

    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)进行自动分组,可以省去很大人工分组的麻烦,并且不需要和用户沟通即可以实现。
    • 应用二:假如我们想要设置用户备注,可以通过该部分知识,实现“智能化”,让用户自动设置自己的备注名。
    • 应用三:对于深度定制的微信公众号第三方平台,这部分很重要。比如显示用户分组、显示用户个人信息、自动化分组、改名、添加分组等。

    测试的微信号二维码

    • 测试号二维码
      测试号二维码

    • 个人技术学习公众号,欢迎关注
      个人技术学习公众号

    cs