java 微信公众号开发之简单的实现文字回复的操作
2018-02-06 09:37
525 查看
1、首先看一下整体代码架构
首先需要3个jar包,主要是用来封装xml数据的
MapUtil.java
package com.xcc.tools;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Map工具类
*/
public class MapUtil {
/** 记录日志 */
private static Logger logger = LoggerFactory.getLogger(MapUtil.class);
public static Map<String, Object> formSerializeToMap(String args){
Map<String, Object> map = new HashMap<String, Object>();
if(args == null || args.length() == 0){
return map;
}
String[] kvs = args.split("&"); //先尝试用&分割
if(kvs.length <= 1){
kvs = args.split("#"); //先尝试用#分割
}
for(String kv : kvs){
if(kv == null || kv.length() == 0){
continue;
}
String[] kvAry = kv.split("=");
if(kvAry.length == 2){
if(map.containsKey(kvAry[0])){
map.put(kvAry[0],map.get(kvAry[0])+","+kvAry[1]);
}else{
map.put(kvAry[0], kvAry[1]);
}
}
}
return map;
}
/**
* 将request请求参数解析为Map<String,Object>,数组传递的参数将用英文逗号进行分割
* @param request
* @return Map<String,Object>
*/
public static Map<String,Object> requestParam2MapString(HttpServletRequest request){
Map<String,Object> map = new HashMap<String, Object>();
Enumeration<?> enumeration=request.getParameterNames();
while(enumeration.hasMoreElements()){
String paraName=(String)enumeration.nextElement();
String[] values = request.getParameterValues(paraName);
String value = "";
if(values.length>0){
for(int i=0;i<values.length;i++){
value += values[i] + ",";
}
value = value.substring(0, value.length()-1);
}else{
value="";
}
map.put(paraName, value);
}
return map;
}
/**
* 将request请求参数解析为Map<String,Object>,数组传递的参数将用英文逗号进行分割
* @param request
* @return Map<String,Object>
*/
public static Map<String,Object> requestParam2MapString(HttpServletRequest request,boolean isArray){
Map<String,Object> map = new HashMap<String, Object>();
Enumeration<?> enumeration=request.getParameterNames();
while(enumeration.hasMoreElements()){
String paraName=(String)enumeration.nextElement();
String[] values = request.getParameterValues(paraName);
if(isArray){
if(values.length>1){
map.put(paraName, values);
}else if(values.length==1){
map.put(paraName, values[0]);
}else{
map.put(paraName, "");
}
}else{
String value = "";
if(values.length>0){
for(int i=0;i<values.length;i++){
value += values[i] + ",";
}
value = value.substring(0, value.length()-1);
}else{
value="";
}
map.put(paraName, value);
}
}
return map;
}
/**
* 将request请求参数解析为Map<String,Object[]>
* @param request
* @return Map<String,Object[]>
*/
public static Map<String,Object[]> requestParam2MapArray(HttpServletRequest request){
Map<String,Object[]> map = new HashMap<String, Object[]>();
Enumeration<?> enumeration=request.getParameterNames();
while(enumeration.hasMoreElements()){
String paraName=(String)enumeration.nextElement();
map.put(paraName, request.getParameterValues(paraName));
}
return map;
}
public static void main(String[] args) {
String arg = "a=1&b=2&c=";
Map<String, Object> map = formSerializeToMap(arg);
logger.debug(map.toString());
logger.debug(String.valueOf(map.containsKey("a")));
}
}
MessageUtil.java
package com.xcc.tools;
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;
public class MessageUtil {
/**
* 将XML转换成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解析xml
InputStream ins = request.getInputStream(); // 从request中获取输入流
Document doc = reader.read(ins);
Element root = doc.getRootElement(); // 获取根元素
List<Element> list = root.elements(); // 获取所有节点
for (Element e : list) {
map.put(e.getName(), e.getText());
System.out.println(e.getName() + "--->" + e.getText());
}
ins.close();
return map;
}
/**
* 将文本消息对象转换成XML
*/
public static String textMessageToXML(TextMeaasge textMessage){
XStream xstream = new XStream(); // 使用XStream将实体类的实例转换成xml格式
xstream.alias("xml", textMessage.getClass()); // 将xml的默认根节点替换成“xml”
return xstream.toXML(textMessage);
}
}
TextMessage.java
2、servlet实现
3、web.xml配置
4、之后公众号中配置url及token就可以了,如何只是测试,所以没有对token进行验证
5、示例
首先需要3个jar包,主要是用来封装xml数据的
MapUtil.java
package com.xcc.tools;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Map工具类
*/
public class MapUtil {
/** 记录日志 */
private static Logger logger = LoggerFactory.getLogger(MapUtil.class);
public static Map<String, Object> formSerializeToMap(String args){
Map<String, Object> map = new HashMap<String, Object>();
if(args == null || args.length() == 0){
return map;
}
String[] kvs = args.split("&"); //先尝试用&分割
if(kvs.length <= 1){
kvs = args.split("#"); //先尝试用#分割
}
for(String kv : kvs){
if(kv == null || kv.length() == 0){
continue;
}
String[] kvAry = kv.split("=");
if(kvAry.length == 2){
if(map.containsKey(kvAry[0])){
map.put(kvAry[0],map.get(kvAry[0])+","+kvAry[1]);
}else{
map.put(kvAry[0], kvAry[1]);
}
}
}
return map;
}
/**
* 将request请求参数解析为Map<String,Object>,数组传递的参数将用英文逗号进行分割
* @param request
* @return Map<String,Object>
*/
public static Map<String,Object> requestParam2MapString(HttpServletRequest request){
Map<String,Object> map = new HashMap<String, Object>();
Enumeration<?> enumeration=request.getParameterNames();
while(enumeration.hasMoreElements()){
String paraName=(String)enumeration.nextElement();
String[] values = request.getParameterValues(paraName);
String value = "";
if(values.length>0){
for(int i=0;i<values.length;i++){
value += values[i] + ",";
}
value = value.substring(0, value.length()-1);
}else{
value="";
}
map.put(paraName, value);
}
return map;
}
/**
* 将request请求参数解析为Map<String,Object>,数组传递的参数将用英文逗号进行分割
* @param request
* @return Map<String,Object>
*/
public static Map<String,Object> requestParam2MapString(HttpServletRequest request,boolean isArray){
Map<String,Object> map = new HashMap<String, Object>();
Enumeration<?> enumeration=request.getParameterNames();
while(enumeration.hasMoreElements()){
String paraName=(String)enumeration.nextElement();
String[] values = request.getParameterValues(paraName);
if(isArray){
if(values.length>1){
map.put(paraName, values);
}else if(values.length==1){
map.put(paraName, values[0]);
}else{
map.put(paraName, "");
}
}else{
String value = "";
if(values.length>0){
for(int i=0;i<values.length;i++){
value += values[i] + ",";
}
value = value.substring(0, value.length()-1);
}else{
value="";
}
map.put(paraName, value);
}
}
return map;
}
/**
* 将request请求参数解析为Map<String,Object[]>
* @param request
* @return Map<String,Object[]>
*/
public static Map<String,Object[]> requestParam2MapArray(HttpServletRequest request){
Map<String,Object[]> map = new HashMap<String, Object[]>();
Enumeration<?> enumeration=request.getParameterNames();
while(enumeration.hasMoreElements()){
String paraName=(String)enumeration.nextElement();
map.put(paraName, request.getParameterValues(paraName));
}
return map;
}
public static void main(String[] args) {
String arg = "a=1&b=2&c=";
Map<String, Object> map = formSerializeToMap(arg);
logger.debug(map.toString());
logger.debug(String.valueOf(map.containsKey("a")));
}
}
MessageUtil.java
package com.xcc.tools;
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;
public class MessageUtil {
/**
* 将XML转换成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解析xml
InputStream ins = request.getInputStream(); // 从request中获取输入流
Document doc = reader.read(ins);
Element root = doc.getRootElement(); // 获取根元素
List<Element> list = root.elements(); // 获取所有节点
for (Element e : list) {
map.put(e.getName(), e.getText());
System.out.println(e.getName() + "--->" + e.getText());
}
ins.close();
return map;
}
/**
* 将文本消息对象转换成XML
*/
public static String textMessageToXML(TextMeaasge textMessage){
XStream xstream = new XStream(); // 使用XStream将实体类的实例转换成xml格式
xstream.alias("xml", textMessage.getClass()); // 将xml的默认根节点替换成“xml”
return xstream.toXML(textMessage);
}
}
TextMessage.java
package com.xcc.tools; public class TextMeaasge { private String ToUserName; private String FromUserName; private long CreateTime; private String MsgType; private String Content; private String MsgId; public TextMeaasge() { } 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; } public String getContent() { return Content; } public void setContent(String content) { Content = content; } public String getMsgId() { return MsgId; } public void setMsgId(String msgId) { MsgId = msgId; } }
2、servlet实现
import java.io.IOException; import java.io.PrintWriter; import java.util.Date; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.dom4j.DocumentException; import com.xcc.tools.MessageUtil; import com.xcc.tools.TextMeaasge; @SuppressWarnings("serial") public class WxServlet extends HttpServlet { /** * 接收微信服务器发送来的4个参数,进行验证 */ @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 微信加密签名 String signature = request.getParameter("signature"); // 时间戳 String timestamp = request.getParameter("timestamp"); // 随机数 String nonce = request.getParameter("nonce"); // 随机字符串 String echostr = request.getParameter("echostr"); PrintWriter out = response.getWriter(); // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败 out.print(echostr); System.out.println("微信服务验证成功!"); out.close(); out = null; } /** * 接收客户端发来的信息 */ @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/xml;charset=utf-8"); PrintWriter out = response.getWriter(); try { Map<String, String> map = MessageUtil.xmlToMap(request); String toUserName = map.get("ToUserName"); String fromUserName = map.get("FromUserName"); 4000 String msgType = map.get("MsgType"); String content = map.get("Content"); String message = null; if ("text".equals(msgType)) { // 对文本消息进行处理 TextMeaasge text = new TextMeaasge(); text.setFromUserName(toUserName); // 发送和回复是反向的 text.setToUserName(fromUserName); text.setMsgType("text"); text.setCreateTime(new Date().getTime()); text.setContent("你发送的消息是:" + content); message = MessageUtil.textMessageToXML(text); System.out.println(message); } out.print(message); // 将回应发送给微信服务器 } catch (DocumentException e) { e.printStackTrace(); }finally{ out.close(); } } }
3、web.xml配置
4、之后公众号中配置url及token就可以了,如何只是测试,所以没有对token进行验证
5、示例
相关文章推荐
- [.NET] 使用 Senparc.Weixin 接入微信公众号开发:简单实现自动回复
- 微信公众号开发《五》基于Java实现微信支付(公众号支付)简单教程
- 微信公众号后台java开发实现自动回复机器人
- 微信公众号后台java开发实现自动回复机器人
- java实现简单的异或操作(用于文件简单加密)
- java简单实现文字重复移动
- (转)【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!
- 16—【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能
- 【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!
- Java语言实现简单FTP软件------>连接管理模块的实现:主机与服务器之间的连接与关闭操作(八)
- 微信公众号开发第四课 实现自定义关键字回复
- Java程序操作Oracle两种方式之简单实现
- 和小猪一起搞微信公众号开发—回复简单文本
- 用java简单的实现单链表的基本操作
- java开发之读写txt文件操作的实现
- 【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!
- 【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!
- java中cookie的操作(通过cookie实现简单的单点登录)
- 【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!
- 【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!