上一章主要对介绍了开发前的环境搭建,本章将在上一章搭建的环境基础下实现一个简单文本消息接受和响应的功能。
后续的学习都离不开微信提供的开发者文档:http://mp.weixin.qq.com/wiki/home/ ,里面详细介绍了接口的相关介绍。
前面学习到,微信服务器第一次校验是通过get请求,以后微信将向我们发送Post请求,并以XML的格式发送与接收数据。
微信发送给我们服务器的是XML格式的数据,比如:文本消息的xml
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[this is a test]]></Content>
<MsgId>1234567890123456</MsgId>
</xml>
其中,xml中各个节点的含义,在官方文档中也有详细的介绍:
接下来我们在上一章的servlet中post方法中实现一个文本消息的接受和响应,由于xml数据不方面进行数据处理,我们将xml数据转成我们熟悉的集合对象进行处理,返回时在将对象转换为xml给微信服务器。
代码如下:
package WeiXinCode;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.dom4j.DocumentException;
/**
* Servlet implementation class TestWeixinConnect
*/
@WebServlet("/TestWeixinConnect")
public class TestWeixinConnect extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* Default constructor.
*/
public TestWeixinConnect() {
// TODO Auto-generated constructor stub
//System.out.println("123");
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
// 获取微信公众平台传过来的参数,并进行校验
String signature = request.getParameter("signature");
String timestamp = request.getParameter("timestamp");
String nonce = request.getParameter("nonce");
String echostr = request.getParameter("echostr");
PrintWriter pw = response.getWriter(); // 获取输出流
// 如果校验成功,将得到的随机字符串原路返回
if (CheckUtil.checkSignature(signature, timestamp, nonce)) {
pw.print(echostr);
System.out.println("接入 成功");
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
// doGet(request, response);
request.setCharacterEncoding("UTF-8"); //设置中文,防止乱码
response.setCharacterEncoding("UTF-8");
PrintWriter pw = response.getWriter();
String str = null;
try {
// 将request请求,传到Message工具类的转换方法中,返回接收到的Map对象
Map<String, String> map = MessageUtil.xmlToMap(request);
// 从集合中,获取XML各个节点的内容
String ToUserName = map.get("ToUserName");
String FromUserName = map.get("FromUserName");
String CreateTime = map.get("CreateTime");
String MsgType = map.get("MsgType");
String Content = map.get("Content");
String MsgId = map.get("MsgId");
System.out.println(MsgType+";"+Content);
if (MsgType.equals("text")) {// 判断消息类型是否是文本消息(text)
TestMessage message = new TestMessage(); //TestMessage 消息文本的实体类
message.setFromUserName(ToUserName);// 原来【接收消息用户】变为回复时【发送消息用户】
message.setToUserName(FromUserName);
message.setMsgType("text");
message.setCreateTime(new Date().getTime());// 创建当前时间为消息时间
message.setContent("您好," + FromUserName + "\n我是:" + ToUserName
+ "\n您发送的消息类型为:" + MsgType + "\n您发送的时间为" + CreateTime
+ "\n我回复的时间为:" + message.getCreateTime() + "您发送的内容是" + Content);
str = MessageUtil.objectToXml(message); // 调用Message工具类,将对象转为XML字符串
}
} catch (DocumentException e) {
e.printStackTrace();
}
pw.print(str); // 返回转换后的XML字符串
pw.close();
}
}
工具类:MessageUtil
package WeiXinCode;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import com.thoughtworks.xstream.XStream;
/**
* 消息xml格式与map对象相互转换类
**/
public class MessageUtil {
/**
*
* 新建方法,将接收到的XML格式,转化为Map对象
*
* @param request 将request对象,通过参数传入
*
* @return 返回转换后的Map对象
*
*/
public static Map<String, String> xmlToMap(HttpServletRequest request) throws IOException, DocumentException {
Map<String, String> map = new HashMap<String, String>();
SAXReader reader = new SAXReader(); // 从dom4j的jar包中,拿到SAXReader对象。
InputStream is = request.getInputStream();// 从request中,获取输入流
Document doc = reader.read(is);// 从reader对象中,读取输入流
Element root = doc.getRootElement();// 获取XML文档的根元素
List<Element> list = root.elements();// 获得根元素下的所有子节点
for (Element e : list) {
map.put(e.getName(), e.getText());// 遍历list对象,并将结果保存到集合中
}
is.close();
return map;
}
/**
*
* 将文本消息对象转化成XML格式
*
* @param message 文本消息对象
*
* @return 返回转换后的XML格式
*
*/
public static String objectToXml(TestMessage message) {
XStream xs = new XStream();
// 由于转换后xml根节点默认为class类,需转化为<xml>
xs.alias("xml", message.getClass());
return xs.toXML(message);
}
}
开发步骤小结:
1、开启接入模式,后台配置相关参数
2、根据业务需求,查看官方开发文档
3、在post方法中对传来的request 进行xml解析做出业务处理,在将处理结果转化为xml形式,做出响应结果。
ps:可以申请测试账号,进行开发测试学习。