Java微信二次开发(二) Java微信文本消息接口请求与发送

网友投稿 229 2023-05-20


Java微信二次开发(二) 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

*

version:1.0

*

description:基础消息类

*/

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

*

version:1.0

*

description:文本消息类

*/

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.dom4http://j.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

*

*

description:消息处理工具类

*/

public class MessageUtil {

//定义了消息类型(常量:文本类型)

public static final String RESP_MESSAGE_TYPE_TEXT = "text";

//从流中解析出每个节点的内容

public static Map parseXml(HttpServletRequest request) throws IOException{

Map map = new HashMap();

//从输入流中获取流对象

InputStream in = request.getInputStream();

//构建SAX阅读器对象

SAXReader reader = new SAXReader();

try {

//从流中获得文档对象

Document doc = reader.read(in);

//获得根节点

Element root = doc.getRootElement();

//获取根节点下的所有子节点

List 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;

}

/**

* 用于扩展节点数据按照<![CDATA[toUser]]>,中间加了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

*

version:1.0

*

description:核心服务类

*/

public class ProcessService {

public static String dealRequest(HttpServletRequest request) throws IOException{

//响应的XML串

String respXml = "";

//要响应的文本内容

String respContent = "未知的消息类型";

Map requestMap = MessageUtil.parseXml(request);

String fromUserName = requestMap.get("FromUserName");

String toUserName = requestMap.get("ToUserName");

String MsgType = requestMap.get("MsgType");

String Content = requestMap.get("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)){

}

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 20OFzVEaOU17年4月17日 下午8:11:32

*

version:1.0

*

description:微信请求验证类

*/

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;

}

}

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:spring boot整合RabbitMQ实例详解(Fanout模式)
下一篇:Java中Properties类的操作实例详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~