获取微信公众号用户关注和取消关注信息

上一篇讲述了如何向小程序用户推送公众号的模板消息,但是微信公众号的用户如何能获取到呢?
  • 通过获取用户列表然后根据openId的数组循环请求用户信息,然后插入数据库
但是这种请求只能请求一次,不能一直用这种方式去进行请求。那么请求后的新用户如何放在本地数据库里呢?请往下看。
    1. 通过用户列表循环请求用户信息,然后放在本地数据库中,方法看上一篇文章。
    1. 步骤1执行完后,新的微信公众号的用户关注后微信端会向服务器发送一条xml请求(需要启用微信公众号的服务器配置)
//获取微信服务器发送的xml请求
@RequestMapping(value = "/serial", method = RequestMethod.POST)
 public void checkSignPost(HttpServletRequest request,HttpServletResponse response) throws AesException, IOException{
     // 将请求、响应的编码均设置为UTF-8(防止中文乱码)
     request.setCharacterEncoding("UTF-8");
     response.setCharacterEncoding("UTF-8");
     System.out.println("请求进入");
     String result = "";
     try {
         Map<String,String> map = WeCharHandlerUtil.parseXml(request);
         System.out.println("开始构造消息");
         System.out.println("返回xml数据:" + JSONObject.toJSON(map).toString());
         result = WeCharHandlerUtil.buildXml(map);
         System.out.println(result);
         if(result.equals("")){
             result = "未正确响应";
         }
     } catch (Exception e) {
         e.printStackTrace();
         System.out.println("发生异常:"+ e.getMessage());
     }
     response.getWriter().println(result);
 }
  • 导入maven包
<dependency>
    <groupId>dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>1.6.1</version>
</dependency>
/**
   * 解析微信发来的请求(XML)
   * @param request
   * @return map
   * @throws Exception
   */
  public static Map<String,String> parseXml(HttpServletRequest request) throws Exception {
      // 将解析结果存储在HashMap中
      Map<String,String> map = new HashMap();
      // 从request中取得输入流
      InputStream inputStream = request.getInputStream();
      System.out.println("获取输入流");
      // 读取输入流
      SAXReader reader = new SAXReader();
      Document document = reader.read(inputStream);
      // 得到xml根元素
      Element root = document.getRootElement();
      // 得到根元素的所有子节点
      List<Element> elementList = root.elements();

      // 遍历所有子节点
      for (Element e : elementList) {
          System.out.println(e.getName() + "|" + e.getText());
          map.put(e.getName(), e.getText());
      }

      // 释放资源
      inputStream.close();
      inputStream = null;
      return map;
  }
// 根据消息类型 构造返回消息
public static String buildXml(Map<String,String> map) {
    String result;
    String msgType = map.get("MsgType").toString();
    System.out.println("MsgType:" + msgType);
    if(msgType.toUpperCase().equals("TEXT")){
        result = buildTextMessage(map, "Hello World!");
    } else if (msgType.toUpperCase().equals("EVENT")) {
       String event = map.get("Event").toString();
       if (event.toUpperCase().equals("SUBSCRIBE")) {
           // TODO 处理关注公众号操作
           System.out.println("有一个新的用户关注公众号");
       } else if (event.toUpperCase().equals("UNSUBSCRIBE")) {
           System.out.println("有一个新的用户取消关注公众号");
           // TODO 处理取消关注公众号操作
       }
   } else{
      String fromUserName = map.get("FromUserName");
      // 开发者微信号
      String toUserName = map.get("ToUserName");
      result = String
              .format(
                      "<xml>" +
                              "<ToUserName><![CDATA[%s]]></ToUserName>" +
                              "<FromUserName><![CDATA[%s]]></FromUserName>" +
                              "<CreateTime>%s</CreateTime>" +
                              "<MsgType><![CDATA[text]]></MsgType>" +
                              "<Content><![CDATA[%s]]></Content>" +
                              "</xml>",
                      fromUserName, toUserName, getUtcTime(),
                      "欢迎您关注本公众号");
    }

    return result;
}

/**
 * 构造文本消息
 *
 * @param map
 * @param content
 * @return
 */
private static String buildTextMessage(Map<String,String> map, String content) {
    //发送方帐号
    String fromUserName = map.get("FromUserName");
    // 开发者微信号
    String toUserName = map.get("ToUserName");
    /**
     * 文本消息XML数据格式
     */
    return String.format(
            "<xml>" +
                    "<ToUserName><![CDATA[%s]]></ToUserName>" +
                    "<FromUserName><![CDATA[%s]]></FromUserName>" +
                    "<CreateTime>%s</CreateTime>" +
                    "<MsgType><![CDATA[text]]></MsgType>" +
                    "<Content><![CDATA[%s]]></Content>" + "</xml>",
            fromUserName, toUserName, getUtcTime(), content);
}

private static String getUtcTime() {
    Date dt = new Date();// 如果不需要格式,可直接用dt,dt就是当前系统时间
    DateFormat df = new SimpleDateFormat("yyyyMMddhhmm");// 设置显示格式
    String nowTime = df.format(dt);
    long dd = (long) 0;
    try {
        dd = df.parse(nowTime).getTime();
    } catch (Exception e) {

    }
    return String.valueOf(dd);
}

以上为获取微信公众号关注和取消关注的信息。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,270评论 25 707
  • title: 微信公众号开发:获取openId和用户信息 tags: 微信公众号 categories: 笔记 ...
    行径行阅读 140,123评论 5 63
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 12,672评论 2 59
  • 奔跑了一个冬天 寒意还是潜入了皮下 凛冽的风 依旧逼迫得人不能大口呼吸 这有什么关系呢 路上还有跑者 明天就是立春...
    武夷闲客阅读 191评论 0 3
  • 我们终于毕业了 也迎来期待许久的毕业旅行 旅行后我们都分别 但是是为了更好的重聚
    九岩子阅读 218评论 0 0