微信返回消息模板类MessageTemplateApi:
package com.sise.demo;
import java.util.Date;
/**
* project_name:
* class_Description : 微信公众号消息模板
* @author CJF
* @data 2018年3月27日 下午6:16:57
*/
public class MessageTemplateApi {
/**
* 说明:不需要颠倒fromUsername和toUserName;方法里面的位置已经修改了
* @param fromUserName 用户的username
* @param toUserName 公众号的username
* @param content 要发送给用户的信息
* @return 返回的信息,直接out.print(message);
*/
public String createRevertText(String fromUserName,String toUserName,String content) {
StringBuffer revert = new StringBuffer();
revert.append("<xml>");
revert.append("<ToUserName><![CDATA[" + fromUserName + "]]></ToUserName>");
revert.append("<FromUserName><![CDATA[" + toUserName+ "]]></FromUserName>");
revert.append("<CreateTime>" + new Date().getTime() + "</CreateTime>");
revert.append("<MsgType><![CDATA[text]]></MsgType>");
revert.append("<Content><![CDATA[" + content + "]]></Content>");
revert.append("</xml>");
String message =revert.toString();
return message;
}
}
和微信服务器对接的servlet:WeixinServlet
package com.sise.wechat.servlet;
/**
* @author CJF
*
*/
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Map;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.dom4j.DocumentException;
import net.sf.json.JSONObject;
import net.sf.json.xml.XMLSerializer;
/**
* @author cjf
* @since jdk1.7
* @version 1.0
*/
public class WeixinServlet extends HttpServlet{
private Logger log =Logger.getLogger(this.getClass().getName());
private static final long serialVersionUID = 1L;
private String Token;
private String echostr;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
connect(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
message(request,response);
}
/**
*@author cjf
*@return
*@exception
*@param
*
* <p>接入连接生效验证</p>
*/
private void connect(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{
log.info("RemoteAddr: "+ request.getRemoteAddr());
log.info("QueryString: "+ request.getQueryString());
if(!accessing(request, response)){
log.info("服务器接入失败.......");
System.out.println("服务器接入失败.......");
return ;
}
String echostr=getEchostr();
if(echostr!=null && !"".equals(echostr)){
log.info("服务器接入生效..........");
System.out.println("服务器接入生效.......");
response.getWriter().print(echostr);//完成相互认证
}
}
/**
* @author cjf
* Date 2013-05-29
* @return boolean
* @exception ServletException, IOException
* @param
*
*<p>用来接收微信公众平台的验证</p>
*/
private boolean accessing(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");
if( isEmpty(signature)){
return false;
}
if(isEmpty(timestamp)){
return false;
}
if(isEmpty(nonce)){
return false;
}
if(isEmpty(echostr)){
return false;
}
String[] ArrTmp = { Token, timestamp, nonce };
Arrays.sort(ArrTmp);
StringBuffer sb = new StringBuffer();
for (int i = 0; i < ArrTmp.length; i++) {
sb.append(ArrTmp[i]);
}
String pwd = Encrypt(sb.toString());
log.info("signature:"+signature+"timestamp:"+timestamp+"nonce:"+nonce+"pwd:"+pwd+"echostr:"+echostr);
if(trim(pwd).equals(trim(signature))){
this.echostr =echostr;
return true;
}else{
return false;
}
}
private String Encrypt(String strSrc) {
MessageDigest md = null;
String strDes = null;
byte[] bt = strSrc.getBytes();
try {
md = MessageDigest.getInstance("SHA-1");
md.update(bt);
strDes = bytes2Hex(md.digest()); //to HexString
} catch (NoSuchAlgorithmException e) {
System.out.println("Invalid algorithm.");
return null;
}
return strDes;
}
public String bytes2Hex(byte[] bts) {
String des = "";
String tmp = null;
for (int i = 0; i < bts.length; i++) {
tmp = (Integer.toHexString(bts[i] & 0xFF));
if (tmp.length() == 1) {
des += "0";
}
des += tmp;
}
return des;
}
public String getEchostr(){
return echostr;
}
/**
*@author haibing.xiao
*@return
*@exception ServletException, IOException
*@param
*
* <p>XML组装组件</p>
*/
private void message(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");
String msgType = map.get("MsgType");
String content = map.get("Content");
String message = null;
if ("text".equals(msgType)) { // 对文本消息进行处理
MessageTemplateApi text = new MessageTemplateApi();
message=text.createRevertText(fromUserName, toUserName, content);
System.out.println(message);
}
out.print(message); // 将消息发送给微信服务器,则此消息会返回给用户
} catch (DocumentException e) {
e.printStackTrace();
} finally{
out.close();
}
}
/**
* @author
* @return
* @exception ServletException, IOException
* @param
*
* <p>业务转发组件</p>
*
*/
private void manageMessage(String requestStr,HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
String responseStr;
try {
XMLSerializer xmlSerializer=new XMLSerializer();
JSONObject jsonObject =(JSONObject) xmlSerializer.read(requestStr);
String event =jsonObject.getString("Event");
String msgtype =jsonObject.getString("MsgType");
if("CLICK".equals(event) && "event".equals(msgtype)){ //菜单click事件
String eventkey =jsonObject.getString("EventKey");
if("hytd_001".equals(eventkey)){ // hytd_001 这是菜单按钮的标志值
jsonObject.put("Content", "欢迎使用菜单click按钮.");
}
}
responseStr =creatRevertText(jsonObject);//创建XML
log.info("responseStr:"+responseStr);
OutputStream os =response.getOutputStream();
os.write(responseStr.getBytes("UTF-8"));
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void init() throws ServletException {
Token="heima07";
}
private boolean isEmpty(String str){
return null ==str || "".equals(str) ? true :false;
}
private String trim(String str){
return null !=str ? str.trim() : str;
}
}
servlet的协助类:将xml转成map集合:MessageUtil
/**
*
*/
package com.sise.demo;
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;
/**
* @author CJF
*
*/
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(); // 获取根元素
@SuppressWarnings("unchecked")
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;
}
}
web.xml配置:
<servlet>
<servlet-name>weixinServlet</servlet-name>
<servlet-class>com.sise.wechat.servlet.WeixinServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>weixinServlet</servlet-name>
<url-pattern>/weixinServlet</url-pattern>
</servlet-mapping>
即可使用:http://ip:端口/项目名/weixinServlet对接腾讯公众号服务器url