201.微信公众号开发【文本消息】
因为微信消息之间传递使用的是xml,对我们来说不大方便,我们需要创建一个Message工具将它转成Map形式(接受到数据转成Map,发送数据时再转成xml)
- 将xml 转Map(用到dom4j架包)
//将xml转成Map
public static Map<String,String> xmlToMap(HttpServletRequest request){
Map<String, String> map = new HashMap<String, String>();
SAXReader reader = new SAXReader();
try {
//获取request输入流
InputStream is = request.getInputStream();
//从输入流中读取到整个文档
Document doc = reader.read(is);
//从文档中获取根节点
Element root = doc.getRootElement();
//获取跟节点下面的所有节点
List<Element> list = root.elements();
//遍历List放入Map集合
for(Element e:list){
map.put(e.getName(), e.getText());
}
is.close();
} catch (IOException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
}
return map;
}
- 将对象转成xml文件(用到xstream架包)【特别注意:微信需求的xml区分大小写】
//将对象类型转成xml
public static String textMessageToXml(TextMessage textMessage){
XStream xStream = new XStream();
xStream.alias("xml", textMessage.getClass());//作用是将xml根元素改成xml
return xStream.toXML(textMessage);
}
然后根据xml内容创建一个文本对象(TextMessage) 设置好SET和GET方法
public class TextMessage {//由于xml区分大小写,所以这里创建属性的时候首字母也大写
private String ToUserName;
private String FromUserName;
private Long CreateTime;
private String MsgType;
private String Content;
private String MsgId;
}
在开发模式下实现数据的接收和响应(在doPost中进行接收和响应)
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();//
Map<String,String> map = MessageUtil.xmlToMap(request);
String fromUserName = map.get("FromUserName");
String toUserName = map.get("ToUserName");
String msgType = map.get("MsgType");
String content = map.get("Content");
String message = null;
if("text".equals(msgType)){//判断是不是文本消息
TextMessage textMessage = new TextMessage();
textMessage.setFromUserName(toUserName);//注意从哪里发出就要发给谁,反的
textMessage.setToUserName(fromUserName);
textMessage.setMsgType("text");
textMessage.setCreateTime(new Date().getTime());
textMessage.setContent("您发送的消息是"+content);
message = MessageUtil.textMessageToXml(textMessage);
System.out.println(message);
MinaClient.sendMinaMessage(content);//发送数据
}
out.print(message);//注意要返回给微信服务器
out.close();
}
到此基本接入已经完成。
可以回复的消息类型:
因此我们在消息工具类(MessageUtil)建立各种消息类型的常量:
// 消息类型常量
public static final String MESSAGE_TEXT = "text";
public static final String MESSAGE_IMAGE = "image";
public static final String MESSAGE_VOICE = "voice";
public static final String MESSAGE_VIDEO = "video";
public static final String MESSAGE_LINK = "link";
public static final String MESSAGE_LOCATION = "location";
public static final String MESSAGE_EVENT = "event";
public static final String MESSAGE_SUBSCRIBE = "subscribe";// 关注
public static final String MESSAGE_UNSUBSCRIBE = "unsubscribeun";// 取消关注
public static final String MESSAGE_CLICK = "CLICK";// 点击事件
public static final String MESSAGE_VIEW = "VIEW";
第九步:对每次发送的消息进行封装
// 将消息接收封装
public static String initText(String toUserName, String fromUserName, String content) {
TextMessage textMessage = new TextMessage();
textMessage.setFromUserName(toUserName);// 注意从哪里发出就要发给谁,反的
textMessage.setToUserName(fromUserName);
textMessage.setMsgType(MessageUtil.MESSAGE_TEXT);
textMessage.setCreateTime(new Date().getTime());
textMessage.setContent(content);
return textMessageToXml(textMessage);
}
下面只有有消息就封装成content作为initText的参数传给微信服务器即可。
- 封装关注时候的消息
// 关注的时候触发的菜单
public static String onSubscribeMenuText() {
StringBuffer sb = new StringBuffer();
sb.append("终于等到你,还好我没放弃!\n");
sb.append("请按照菜单提示操作:\n\n");
sb.append("1.南泰简介\n");
sb.append("2.功能介绍\n");
sb.append("回复?调出此菜单");
return sb.toString();
}
- 封装菜单消息
public static String njusttzIntroduceText() {// 按1返回南泰介绍
StringBuffer sb = new StringBuffer();
sb.append("南京理工大学泰州科技学院由国家首批“211工程”重点建设院校——南京理工大学与泰州市人民政府于2004年合作创办," + "是一所以工为主,工、经、管、文、艺等多学科综合配套、协调发展的全日制本科高校。学校围绕建设特色鲜明的高水平应用技术大学的奋斗目标,坚持“明体达用”的教育理念,秉持“帮助学生发挥优势潜能”的育人宗旨,培养高层次技术与管理人才。学校被教育部吸纳为全国CDIO工程教育改革试点高校,被誉为“工程师的摇篮”。");
return sb.toString();
}
public static String accountIntroduceText() {// 按2返回公众号功能介绍
StringBuffer sb = new StringBuffer();
sb.append("具体功能正在上线的途中...");
return sb.toString();
}
public static String menuReturnText() {//回复?时候返回
StringBuffer sb = new StringBuffer();
sb.append("请按照菜单提示操作:\n\n");
sb.append("1.南泰简介\n");
sb.append("2.功能介绍\n");
sb.append("回复?调出此菜单");
return sb.toString();
}
- 修改Servlet的Post部分代码
至此,微信开发初级阶段就全部完成,如果需要公网运行,可以架设到百度BAE中。
百度BAE需要购买服务,使用SVN上传发布,切记更换了服务器后需要更换百度公众平台里的Servlet地址。