上一篇講述了如何向小程序用戶推送公眾號的模板消息奢人,但是微信公眾號的用戶如何能獲取到呢疮薇?
- 通過獲取用戶列表然后根據(jù)openId的數(shù)組循環(huán)請求用戶信息胸墙,然后插入數(shù)據(jù)庫
但是這種請求只能請求一次,不能一直用這種方式去進(jìn)行請求惦辛。那么請求后的新用戶如何放在本地?cái)?shù)據(jù)庫里呢劳秋?請往下看。
- 通過用戶列表循環(huán)請求用戶信息胖齐,然后放在本地?cái)?shù)據(jù)庫中玻淑,方法看上一篇文章。
- 步驟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);
}
<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)系作者