上一节中,我们讲到微信信息的收发,并对之前的服务器开发者URL的验证地址的代码做了一个修改,让我们的springMVC项目可以同时验证微信开发者的URL,也可以接收消息的进入,上一节中,我只是简单的把消息收到后,然后直接就返回文本消息,代码的可阅读性不够,那么,我们今天要把消息的内容,也要封装成一个类,增强可读性。如果对我的文章感兴趣,欢迎订阅我的头条号,一点热,www.yeehot.com
上一节快速入口
java使用springMVC开发微信公众号的消息收发功能
那么我们开始设计我们的类
从微信的文档,我们可以看到,微信消息包含了 文本消息、 图片消息、 语音消息、 视频消息、 小视频消息、 地理位置消息、 链接消息还有事件推送消息,那么我们直接提取公共的参数,做一个基类BaseMessage,由于我在上级章节中,使用了map来存放接收的数据,同时也使用Map来对数据进行CDATA来拼接XML的字符串数据输出,那么我们这个基类也使用Map集合来做构造函数和转换方法。我们将 ToUserName接收方帐号(收到的OpenID), FromUserName开发者微信号, CreateTime是消息创建时间 ,MsgType消息类型,MsgId消息ID放在基类。
MsgType是text
package com.yeehot.model;
import java.util.HashMap;
import java.util.Map;
/**
* Created by yeehot.com on 16/7/30.
*/
public class BaseMessage {
protected String ToUserName;
protected String FromUserName;
protected String CreateTime;
protected String MsgType;
protected String MsgId;
public String getToUserName() {
return ToUserName;
}
public void setToUserName(String toUserName) {
ToUserName = toUserName;
}
public String getCreateTime() {
return CreateTime;
}
public void setCreateTime(String createTime) {
CreateTime = createTime;
}
public String getFromUserName() {
return FromUserName;
}
public void setFromUserName(String fromUserName) {
FromUserName = fromUserName;
}
public String getMsgType() {
return MsgType;
}
public void setMsgType(String msgType) {
MsgType = msgType;
}
public String getMsgId() {
return MsgId;
}
public void setMsgId(String msgId) {
MsgId = msgId;
}
public BaseMessage() {
}
public BaseMessage(String toUserName, String fromUserName, String createTime, String msgType, String msgId) {
ToUserName = toUserName;
FromUserName = fromUserName;
CreateTime = createTime;
MsgType = msgType;
MsgId = msgId;
}
//写一个参数为Map的构造函数
public BaseMessage(Map<String ,String> info) {
this.CreateTime=info.get(“CreateTime”);
this.MsgId=info.get(“MsgId”);
this.MsgType=info.get(“MsgType”);
this.FromUserName=info.get(“FromUserName”);
this.ToUserName=info.get(“ToUserName”);
}
//将类的属性输出为Map
public Map<String,String> MessageToMap(){
Map<String,String> map=new HashMap<String, String>();
map.put(“FromUserName”,this.getFromUserName());
map.put(“ToUserName”,this.getToUserName());
map.put(“CreateTime”,this.getCreateTime());
map.put(“MsgType”,this.getMsgType());
map.put(“MsgId”,this.getMsgId());
return map;
}
}
做好了基类,我们可以定义一个文本消息类,它继承基本basemessage.它里面的属性就多一个消息的内容,我们定义为Content。
/**
* Created by yeehot.com on 16/7/30.
*/
public class YhTextMessage extends BaseMessage{
private String Content;
public String getContent() {
return Content;
}
public void setContent(String content) {
Content = content;
}
public YhTextMessage() {
super();
}
public YhTextMessage(String toUserName, String fromUserName, String createTime, String msgType, String msgId, String content) {
super(toUserName, fromUserName, createTime, msgType, msgId);
Content = content;
}
public YhTextMessage(Map<String ,String> info) {
super(info);
this.Content=info.get(“Content”);
}
public Map<String,String> MessageToMap(){
Map<String,String> map=new HashMap<String, String>();
map.put(“Content”,this.Content);
Map<String,String> map2=super.MessageToMap();
if (map!=null){
map.putAll(map2);
}
return map;
}
}
接着我们对我们原来的controller进行修改,这里主要是实现,用户发送消息后,我们程序根据当前用户名,自动回复一段内容给发送者。然后这里主要是将消息变成我们的类。
@ResponseBody
@RequestMapping(value = “/wx/developer”, produces = “text/plain;charset=utf-8”)
public String index(HttpServletRequest request) {
//
String method=request.getMethod();
System.out.print(method+”?”);
if (method.equals(“GET”)) {
//此处省略了验证token的步骤
else {
Map<String,String> postmessage=new HashMap<String, String>();
Map<String,String> responsemessage=new HashMap<String, String>();
StringBuffer jb = new StringBuffer();
String line = null;
BufferedReader reader = null;
try {
reader = request.getReader();
while ((line = reader.readLine()) != null)
{
jb.append(line);
}
postmessage=XmlParseTool.doXMLParse(jb.toString());
YhTextMessage RecivetextMessage=new YhTextMessage(postmessage);
System.out.print(“helo,”+RecivetextMessage.getContent()+RecivetextMessage.getToUserName());
YhTextMessage sendMessage=new YhTextMessage();
sendMessage.setContent(“你好,www.yeehot.com”);
sendMessage.setToUserName(RecivetextMessage.getFromUserName());
sendMessage.setMsgType(RecivetextMessage.getMsgType());
sendMessage.setMsgId(System.currentTimeMillis()+”10″);
sendMessage.setFromUserName(RecivetextMessage.getToUserName());
responsemessage=sendMessage.MessageToMap();
return XmlParseTool.RequestXml2String(responsemessage,true);
}
catch (JDOMException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
return “success”;
}
}
最后我们在公众号测试一下,我们随便输入我们的内容,发现返回的数据,就是我们在代码输入的内容。 结果正确,不过这里要注意的是,我的文本消息而不是链接消息。
今天就讲到这里,欢迎继续关注我的头条号:一点热,如果有什么问题,欢迎留言咨询,我看到之后会第一时间回复大家的。,也欢迎收藏与转发,如果需要转载到其他网站,请与我联系。