packagecom.wx.servlet;importjava.io.IOException;importjava.io.InputStream;importjava.io.OutputStream;importjava.security.MessageDigest;importjava.security.NoSuchAlgorithmException;importjava.util.Arrays;importjava.util.logging.Logger;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importnet.sf.json.JSONObject;importnet.sf.json.xml.XMLSerializer;/***@authorhaibing.xiao
*@sincejdk1.6
*@version1.0*/
public class WeixinServlet extendsHttpServlet{private Logger log =Logger.getLogger(this.getClass().getName());private static final long serialVersionUID = 1L;privateString Token;privateString echostr;
@Overrideprotected voiddoGet(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {
connect(request,response);
}
@Overrideprotected voiddoPost(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {
message(request,response);
}/***@authorhaibing.xiao
*@return*@exception*@param*
*
接入连接生效验证
*/private void connect(HttpServletRequest request,HttpServletResponse response) throwsServletException, IOException{
log.info("RemoteAddr: "+request.getRemoteAddr());
log.info("QueryString: "+request.getQueryString());if(!accessing(request, response)){
log.info("服务器接入失败.......");return;
}
String echostr=getEchostr();if(echostr!=null && !"".equals(echostr)){
log.info("服务器接入生效..........");
response.getWriter().print(echostr);//完成相互认证
}
}/***@authorhaibing.xiao
* Date 2013-05-29
*@returnboolean
*@exceptionServletException, IOException
*@param*
*
用来接收微信公众平台的验证
*/private boolean accessing(HttpServletRequest request, HttpServletResponse response)throwsServletException, 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= newStringBuffer();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;
}
}privateString 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;
}returnstrDes;
}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;
}returndes;
}publicString getEchostr(){returnechostr;
}/***@authorhaibing.xiao
*@return*@exceptionServletException, IOException
*@param*
*
XML组装组件
*/private void message(HttpServletRequest request,HttpServletResponse response) throwsServletException, IOException{
InputStream is=request.getInputStream();//取HTTP请求流长度
int size =request.getContentLength();//用于缓存每次读取的数据
byte[] buffer = new byte[size];//用于存放结果的数组
byte[] xmldataByte = new byte[size];int count = 0;int rbyte = 0;//循环读取
while (count
rbyte =is.read(buffer);for(int i=0;i
xmldataByte[count+ i] =buffer[i];
}
count+=rbyte;
}
is.close();
String requestStr= new String(xmldataByte, "UTF-8");try{
manageMessage(requestStr,request,response);
}catch(Exception e){
e.printStackTrace();
}
}/***@authorhaibing.xiao
*@return*@exceptionServletException, IOException
*@param*
*
业务转发组件
**/
private void manageMessage(String requestStr,HttpServletRequest request,HttpServletResponse response)throwsServletException,IOException{
String responseStr;try{
XMLSerializer xmlSerializer=newXMLSerializer();
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();
}
}privateString creatRevertText(JSONObject jsonObject){
StringBuffer revert=newStringBuffer();
revert.append("");
revert.append("");
revert.append("");
revert.append(""+jsonObject.get("CreateTime")+"");
revert.append("");
revert.append("");
revert.append("0");
revert.append("");returnrevert.toString();
}
@Overridepublic void init() throwsServletException {
Token="test123";
}private booleanisEmpty(String str){return null ==str || "".equals(str) ? true :false;
}privateString trim(String str){return null !=str ?str.trim() : str;
}
}