獲取微信公眾號用戶關(guān)注和取消關(guān)注信息

上一篇講述了如何向小程序用戶推送公眾號的模板消息奢人,但是微信公眾號的用戶如何能獲取到呢疮薇?
  • 通過獲取用戶列表然后根據(jù)openId的數(shù)組循環(huán)請求用戶信息胸墙,然后插入數(shù)據(jù)庫
但是這種請求只能請求一次,不能一直用這種方式去進(jìn)行請求惦辛。那么請求后的新用戶如何放在本地?cái)?shù)據(jù)庫里呢劳秋?請往下看。
    1. 通過用戶列表循環(huán)請求用戶信息胖齐,然后放在本地?cái)?shù)據(jù)庫中玻淑,方法看上一篇文章。
    1. 步驟1執(zhí)行完后呀伙,新的微信公眾號的用戶關(guān)注后微信端會(huì)向服務(wù)器發(fā)送一條xml請求(需要啟用微信公眾號的服務(wù)器配置)
//獲取微信服務(wù)器發(fā)送的xml請求
@RequestMapping(value = "/serial", method = RequestMethod.POST)
 public void checkSignPost(HttpServletRequest request,HttpServletResponse response) throws AesException, IOException{
     // 將請求补履、響應(yīng)的編碼均設(shè)置為UTF-8(防止中文亂碼)
     request.setCharacterEncoding("UTF-8");
     response.setCharacterEncoding("UTF-8");
     System.out.println("請求進(jìn)入");
     String result = "";
     try {
         Map<String,String> map = WeCharHandlerUtil.parseXml(request);
         System.out.println("開始構(gòu)造消息");
         System.out.println("返回xml數(shù)據(jù):" + JSONObject.toJSON(map).toString());
         result = WeCharHandlerUtil.buildXml(map);
         System.out.println(result);
         if(result.equals("")){
             result = "未正確響應(yīng)";
         }
     } catch (Exception e) {
         e.printStackTrace();
         System.out.println("發(fā)生異常:"+ e.getMessage());
     }
     response.getWriter().println(result);
 }
  • 導(dǎo)入maven包
<dependency>
    <groupId>dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>1.6.1</version>
</dependency>
/**
   * 解析微信發(fā)來的請求(XML)
   * @param request
   * @return map
   * @throws Exception
   */
  public static Map<String,String> parseXml(HttpServletRequest request) throws Exception {
      // 將解析結(jié)果存儲(chǔ)在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();
      // 得到根元素的所有子節(jié)點(diǎn)
      List<Element> elementList = root.elements();

      // 遍歷所有子節(jié)點(diǎn)
      for (Element e : elementList) {
          System.out.println(e.getName() + "|" + e.getText());
          map.put(e.getName(), e.getText());
      }

      // 釋放資源
      inputStream.close();
      inputStream = null;
      return map;
  }
// 根據(jù)消息類型 構(gòu)造返回消息
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 處理關(guān)注公眾號操作
           System.out.println("有一個(gè)新的用戶關(guān)注公眾號");
       } else if (event.toUpperCase().equals("UNSUBSCRIBE")) {
           System.out.println("有一個(gè)新的用戶取消關(guān)注公眾號");
           // TODO 處理取消關(guān)注公眾號操作
       }
   } else{
      String fromUserName = map.get("FromUserName");
      // 開發(fā)者微信號
      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(),
                      "歡迎您關(guān)注本公眾號");
    }

    return result;
}

/**
 * 構(gòu)造文本消息
 *
 * @param map
 * @param content
 * @return
 */
private static String buildTextMessage(Map<String,String> map, String content) {
    //發(fā)送方帳號
    String fromUserName = map.get("FromUserName");
    // 開發(fā)者微信號
    String toUserName = map.get("ToUserName");
    /**
     * 文本消息XML數(shù)據(jù)格式
     */
    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就是當(dāng)前系統(tǒng)時(shí)間
    DateFormat df = new SimpleDateFormat("yyyyMMddhhmm");// 設(shè)置顯示格式
    String nowTime = df.format(dt);
    long dd = (long) 0;
    try {
        dd = df.parse(nowTime).getTime();
    } catch (Exception e) {

    }
    return String.valueOf(dd);
}

以上為獲取微信公眾號關(guān)注和取消關(guān)注的信息。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末剿另,一起剝皮案震驚了整個(gè)濱河市箫锤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌雨女,老刑警劉巖谚攒,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異氛堕,居然都是意外死亡馏臭,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門讼稚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來括儒,“玉大人,你說我怎么就攤上這事锐想“镅埃” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵赠摇,是天一觀的道長固逗。 經(jīng)常有香客問我浅蚪,道長,這世上最難降的妖魔是什么抒蚜? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任掘鄙,我火速辦了婚禮,結(jié)果婚禮上嗡髓,老公的妹妹穿的比我還像新娘操漠。我一直安慰自己,他們只是感情好饿这,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布浊伙。 她就那樣靜靜地躺著,像睡著了一般长捧。 火紅的嫁衣襯著肌膚如雪嚣鄙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天串结,我揣著相機(jī)與錄音哑子,去河邊找鬼。 笑死肌割,一個(gè)胖子當(dāng)著我的面吹牛卧蜓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播把敞,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼弥奸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了奋早?” 一聲冷哼從身側(cè)響起盛霎,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎耽装,沒想到半個(gè)月后愤炸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡掉奄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年规个,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挥萌。...
    茶點(diǎn)故事閱讀 38,577評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡绰姻,死狀恐怖枉侧,靈堂內(nèi)的尸體忽然破棺而出引瀑,到底是詐尸還是另有隱情,我是刑警寧澤榨馁,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布憨栽,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏屑柔。R本人自食惡果不足惜屡萤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望掸宛。 院中可真熱鬧死陆,春花似錦、人聲如沸唧瘾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽饰序。三九已至领虹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間求豫,已是汗流浹背塌衰。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蝠嘉,地道東北人最疆。 一個(gè)月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像是晨,于是被迫代替她去往敵國和親肚菠。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,736評論 25 707
  • title: 微信公眾號開發(fā):獲取openId和用戶信息 tags: 微信公眾號 categories: 筆記 ...
    行徑行閱讀 140,186評論 5 63
  • 用兩張圖告訴你罩缴,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料蚊逢? 從這篇文章中你...
    hw1212閱讀 12,699評論 2 59
  • 奔跑了一個(gè)冬天 寒意還是潛入了皮下 凜冽的風(fēng) 依舊逼迫得人不能大口呼吸 這有什么關(guān)系呢 路上還有跑者 明天就是立春...
    武夷閑客閱讀 193評論 0 3
  • 我們終于畢業(yè)了 也迎來期待許久的畢業(yè)旅行 旅行后我們都分別 但是是為了更好的重聚
    九巖子閱讀 221評論 0 0