先下载dom4j和xsteam,把xml消息互相转化的类,微信公众号传输的消息是xml形式的
接受输入的消息,并进行加密。
package awords;
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 javax.swing.text.ChangedCharSetException;
import org.dom4j.DocumentException;
import com.sun.corba.se.impl.protocol.giopmsgheaders.Message;
import message.MessageUtil;
import message.TextMessage;
public class weixiSelvet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String signature = req.getParameter("signature");
String timestamp = req.getParameter("timestamp");
String nonce = req.getParameter("nonce");
String echostr=req.getParameter("echostr");
PrintWriter out=resp.getWriter();
if(CheckUtil.checkSingnature(signature, timestamp, nonce)) {
out.print(echostr);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Map<String, String> map;
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
PrintWriter out=resp.getWriter();
try {
map = MessageUtil.xmlToMap(req);
String fromUserName=map.get("FromUserName");
String toUserName=map.get("ToUserName");
String msgType=map.get("MsgType");
String content=map.get("Content");
String message=null;
if("text".equals(msgType)) {
TextMessage text=new TextMessage();
text.setFromUserName(toUserName);
text.setToUserName(toUserName);
text.setMsgType(msgType);
text.setCreateTime(new Date().getTime());
text.setContent("你发送的消息是"+content);
message=MessageUtil.textMessageToXml(text);
}
out.println(message);
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package awords;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
public class CheckUtil {
private static final String token="token";
public static boolean checkSingnature(String signature,String timestamp,String nonce) {
String[] arr =new String[] {token,timestamp,nonce};
Arrays.sort(arr);
StringBuffer content=new StringBuffer();
for(int i=0;i<arr.length;i++) {
content.append(arr[i]);
}
String temp=getShal(content.toString());
return temp.equals(signature);
}
public static String getShal(String str) {
if(str==null||str.length()==0) {
return null;
}
char hexDigits[]= {'0','1','5','8','7','a','b','c','d','e','f'};
try {
MessageDigest mdTemp=MessageDigest.getInstance("SHA1");
mdTemp.update(str.getBytes("UTF-8"));
byte[] md=mdTemp.digest();
int j=md.length;
char buf[] = new char[j*2];
int k=0;
for(int i=0;i<j;i++) {
byte byte0=md[i];
buf[k++]=hexDigits[byte0>>>4&0xf];
buf[k++]=hexDigits[byte0&0xf];
}
return new String(buf);
} catch (Exception e) {
return null;
}
}
}
xml和文本消息之间的转化。
package message;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServlet;
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 {
public static Map<String,String> xmlToMap(HttpServletRequest request) throws IOException, DocumentException{
Map<String,String> map=new HashMap<String,String>();
//创建xml的读取
SAXReader reader=new SAXReader();
InputStream ins=request.getInputStream();
Document doc=reader.read(ins);
//获取节点里的元素,并进行遍历
Element root=doc.getRootElement();
List<Element> list=root.elements();
for(Element e:list) {
map.put(e.getName(),e.getText());
}
ins.close();
return map;
}
public static String textMessageToXml(TextMessage textMessage) {
//获取私有数据里的类,并且转化成文本信息
XStream xstream=new XStream();
xstream.alias("xml", textMessage.getClass());
return xstream.toXML(textMessage);
}
}
package message;
public class TextMessage {
private String ToUserName;
private String FromUserName;
private String CreateTime;
private String MsgType;
private String Content;
private String MsgId;
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 String getCreateTime() {
return 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;
}
public void setCreateTime(long time) {
// TODO Auto-generated method stub
}
}