您的位置:首页 > 移动开发 > 微信开发

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

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、示例

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐