Java微信二次开发(二)

第二天,做微信文本消息接口请求与发送

需要导入库:dom4j-1.6.1.jar,xstream-1.3.1.jar

第一步:新建包com.wtz.message.response,新建类BaseMessage.java

 package com.wtz.message.response;

 /**
* @author wangtianze QQ:864620012
* @date 2017年4月19日 下午3:12:40
* <p>version:1.0</p>
* <p>description:基础消息类</p>
*/
public class BaseMessage {
//接收方
private String ToUserName;
//发送方
private String FromUserName;
//消息的创建时间
private long CreateTime;
//消息类型
private String MsgType; public String getToUserName() {
return ToUserName;
}
public void setToUserName(String toUserName) {
ToUserName = toUserName;
}
public String getFromUserName() {
return FromUserName;
}
public void setFromUserName(String fromUserName) {
FromUserName = fromUserName;
}
public long getCreateTime() {
return CreateTime;
}
public void setCreateTime(long createTime) {
CreateTime = createTime;
}
public String getMsgType() {
return MsgType;
}
public void setMsgType(String msgType) {
MsgType = msgType;
}
}

第二步:找到包com.wtz.message.response,新建类TextMessage.java

 package com.wtz.message.response;

 /**
* @author wangtianze QQ:864620012
* @date 2017年4月19日 下午3:22:33
* <p>version:1.0</p>
* <p>description:文本消息类</p>
*/
public class TextMessage extends BaseMessage{
//消息内容
private String Content; public String getContent() {
return Content;
}
public void setContent(String content) {
Content = content;
}
}

第三步:找到包com.wtz.util,新建类MessageUtil.java

 package com.wtz.util;

 import java.io.IOException;
import java.io.InputStream;
import java.io.Writer;
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;
import com.thoughtworks.xstream.core.util.QuickWriter;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.io.xml.PrettyPrintWriter;
import com.thoughtworks.xstream.io.xml.XppDriver;
import com.wtz.message.response.TextMessage; /**
* @author wangtianze QQ:864620012
* @date 2017年4月19日 下午3:29:58
* <p>version:1.0</p>
* <p>description:消息处理工具类</p>
*/
public class MessageUtil {
//定义了消息类型(常量:文本类型)
public static final String RESP_MESSAGE_TYPE_TEXT = "text"; //从流中解析出每个节点的内容
public static Map<String,String> parseXml(HttpServletRequest request) throws IOException{
Map<String,String> map = new HashMap<String,String>(); //从输入流中获取流对象
InputStream in = request.getInputStream(); //构建SAX阅读器对象
SAXReader reader = new SAXReader();
try {
//从流中获得文档对象
Document doc = reader.read(in); //获得根节点
Element root = doc.getRootElement(); //获取根节点下的所有子节点
List<Element> children = root.elements(); for(Element e:children){
//遍历每一个节点,并按照节点名--节点值放入map中
map.put(e.getName(), e.getText());
System.out.println("用户发送的消息XML解析为:" + e.getName() + e.getText());
} //关闭流
in.close();
in = null;
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} return map;
} /**
* 用于扩展节点数据按照<ToUserName><![CDATA[toUser]]></ToUserName>,中间加了CDATA段
*/
private static XStream xstream = new XStream(new XppDriver(){
public HierarchicalStreamWriter createWriter(Writer out){
return new PrettyPrintWriter(out){
boolean cdata = true;
public void startNode(String name,Class clazz){
super.startNode(name,clazz);
} protected void writeText(QuickWriter writer,String text){
if(cdata){
writer.write("<![CDATA[");
writer.write(text);
writer.write("]]>");
}else{
writer.write(text);
}
}
};
}
}); /**
* 将文本消息转换成XML格式
*/
public static String messageToXml(TextMessage textMessage){
xstream.alias("xml",textMessage.getClass());
String xml = xstream.toXML(textMessage);
System.out.println("响应所转换的XML:"+xml);
return xml;
}
}

第四步:找到包com.wtz.service,新建类ProcessService.java

 package com.wtz.util;

 import java.io.IOException;
import java.util.Date;
import java.util.Map; import javax.servlet.http.HttpServletRequest; import com.wtz.message.response.TextMessage; /**
* @author wangtianze QQ:864620012
* @date 2017年4月19日 下午8:04:14
* <p>version:1.0</p>
* <p>description:核心服务类</p>
*/
public class ProcessService {
public static String dealRequest(HttpServletRequest request) throws IOException{
//响应的XML串
String respXml = ""; //要响应的文本内容
String respContent = "未知的消息类型";
Map<String,String> requestMap = MessageUtil.parseXml(request);
String fromUserName = requestMap.get("FromUserName");
String toUserName = requestMap.get("ToUserName");
String MsgType = requestMap.get("MsgType");
String Content = requestMap.get("Content"); System.out.println("用户给公众号发的消息为:" + Content); //构建一条文本消息
TextMessage textMessage = new TextMessage();
textMessage.setToUserName(fromUserName);
textMessage.setFromUserName(toUserName);
textMessage.setCreateTime(new Date().getTime());
textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT); if(MsgType.equals(MessageUtil.RESP_MESSAGE_TYPE_TEXT)){
respContent = "王天泽的公众号收到了您的一条文本消息:" + Content + ",时间戳是:" + (new Date().getTime());
}
textMessage.setContent(respContent);
respXml = MessageUtil.messageToXml(textMessage); System.out.println("respXml:"+respXml); return respXml;
}
}

第五步:找到包com.wtz.service下的LoginServlet类,重写doPost方法

 package com.wtz.service;

 import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import com.wtz.util.MessageUtil;
import com.wtz.util.ProcessService;
import com.wtz.util.ValidationUtil; /**
* @author wangtianze QQ:864620012
* @date 2017年4月17日 下午8:11:32
* <p>version:1.0</p>
* <p>description:微信请求验证类</p>
*/
public class LoginServlet extends HttpServlet { @Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("get请求。。。。。。"); //1.获得微信签名的加密字符串
String signature = request.getParameter("signature"); //2.获得时间戳信息
String timestamp = request.getParameter("timestamp"); //3.获得随机数
String nonce = request.getParameter("nonce"); //4.获得随机字符串
String echostr = request.getParameter("echostr"); System.out.println("获得微信签名的加密字符串:"+signature);
System.out.println("获得时间戳信息:"+timestamp);
System.out.println("获得随机数:"+nonce);
System.out.println("获得随机字符串:"+echostr); PrintWriter out = response.getWriter(); //验证请求确认成功原样返回echostr参数内容,则接入生效,成为开发者成功,否则失败
if(ValidationUtil.checkSignature(signature, timestamp, nonce)){
out.print(echostr);
} out.close();
out = null;
} /**
* 接受微信服务器发过来的XML数据包(通过post请求发送过来的)
*/
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8"); //获取微信加密的签名字符串
String signature = request.getParameter("signature"); //获取时间戳
String timestamp = request.getParameter("timestamp"); //获取随机数
String nonce = request.getParameter("nonce"); PrintWriter out = response.getWriter(); if(ValidationUtil.checkSignature(signature,timestamp,nonce)){
String respXml = "";
try {
respXml = ProcessService.dealRequest(request);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
out.print(respXml);
}
out.close();
out = null;
}
}

完成微信文本消息接口请求与发送。

上一篇:css绝对底部的实现方法


下一篇:PAT (Basic Level) Practise:1002. 写出这个数