java 微信接收消息_Java后台与微信公众号交互----接收并处理微信客户端发送的请求...

还是一样,理论就不说了,直接上代码!

在进行这个操作之前,必须得与微信客户端进行比对成功才行,具体可参考上一篇博客。

doGet()是上一篇博客已经说了的,在这里就不详细说了。

public class WeChatServlet extends HttpServlet {

/**

* 接收微信服务器发送的4个参数并返回echostr

*/

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

System.out.println("进入...");

// 接收微信服务器以Get请求发送的4个参数

String signature = request.getParameter("signature");

String timestamp = request.getParameter("timestamp");

String nonce = request.getParameter("nonce");

String echostr = request.getParameter("echostr");

PrintWriter out = response.getWriter();

if (CheckUtil.checkSignature(signature, timestamp, nonce)) {

out.print(echostr); // 校验通过,原样返回echostr参数内容

}

}

/**

* 接收并处理微信客户端发送的请求

*/

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

System.out.println("进入。。。");

//设置utf-8

request.setCharacterEncoding("utf-8");

response.setContentType("text/xml;charset=utf-8");

WeiXinService weiXinService = new WeiXinService ();

PrintWriter out = response.getWriter();

try {

// 拿到微信客户端发来的请求并通过工具类解析为map格式

Map map = Message.xmlToMap(request);

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

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

String msgType = map.get("MsgType");

String content = map.get("Content");

// String openid = map.get("openid");

TextMeaasge text = new TextMeaasge();

// 将信息封装到实体类中

text.setFromUserName(toUserName); // 发送和回复是反向的

text.setToUserName(fromUserName);

text.setCreateTime(new Date().getTime());

if (msgType.equals("text") || msgType.equals("image") || msgType.equals("voice") ||

msgType.equals("video") || msgType.equals("shortvideo") || msgType.equals("location") ||

msgType.equals("link")) {

// 对文字、图片、语音、视频、短视频等一系列信息进行统一回复

System.out.println(content.toCharArray());

// 设置回复的消息内容

text.setContent("谢谢您的建议,祝您使用愉快。[愉快]");

// 设置消息的响应类型

text.setMsgType("text");

} else if (msgType.equals("event")) {

// 对事件消息进行处理

// 获取到事件类型

String event = map.get("Event");

// 获取事件的key

String eventKey = map.get("EventKey");

if (event.equals("subscribe")) {

// 关注事件

text.setContent("欢迎关注![愉快]\n");

// 设置消息的响应类型

text.setMsgType("text");

} else if (event.equals("CLICK")) {

// 点击事件

// 在此进行点击事件处理

//。。。。。。。。//

// 处理点击事件结束

// 设置消息的响应类型

text.setMsgType("text");

// 设置回复的消息内容

text.setContent("点击事件。。");

} else {

System.out.println("关注和点击事件之外。。");

}

} else {

System.out.println("发送消息和事件之外。。");

}

String message = null;

// 将实体类通过工具类转换为xml

message = Message.textMessageToXML(text);

System.out.println(message);

out.print(message); // 将回应发送给微信服务器

} catch (DocumentException e) {

e.printStackTrace();

} catch (Exception e) {

e.printStackTrace();

} finally {

out.close();

}

}

}

消息实体类:

/**

* 消息实体类

*

* @author win7

*

*/

public class TextMeaasge {

private String ToUserName;

private String FromUserName;

private long CreateTime;

private String MsgType;

private String Content;

private String MsgId;

// get、set已省略

}

/**

* 实现消息的格式转换(Map类型和XML的互转)

*/

public class Message {

/**

* 将XML转换成Map集合

*/

public static Map xmlToMap(HttpServletRequest request)

throws IOException, DocumentException {

Map map = new HashMap();

SAXReader reader = new SAXReader(); // 使用dom4j解析xml

InputStream is= request.getInputStream(); // 从request中获取输入流

Document doc = reader.read(is);

Element root = doc.getRootElement(); // 获取根元素

List list = root.elements(); // 获取所有节点

for (Element e : list) {

map.put(e.getName(), e.getText());

System.out.println(e.getName() + "--->" + e.getText());

}

is.close();

return map;

}

/**

* 将文本消息对象转换成XML

*/

public static String textMessageToXML(TextMeaasge textMessage) {

System.out.println("进入textMessageToXML");

System.out.println(textMessage.getMsgType());

System.out.println(textMessage.getContent());

XStream xstream = new XStream(); // 使用XStream将实体类的实例转换成xml格式

System.out.println(",,,,,,,,,,");

xstream.alias("xml", textMessage.getClass()); // 将xml的默认根节点替换成“xml”

System.out.println("......");

return xstream.toXML(textMessage);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值