转自:http://www.liutime.com/javainfo/1432/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Date;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
import org.apache.struts2.ServletActionContext;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
@Controller("WeiXinAction")
@Scope("prototype")
public class wWeiXinAction {
/**
*
*/
private static final long serialVersionUID = 756754074696664021L;
//自定义的TOken
public static final String Token = "liutimeweixintoken";
/**
* Convenience method to get the request
*
* @return current request
*/
protected HttpServletRequest getRequest() {
return ServletActionContext.getRequest();
}
/**
* Convenience method to get the response
*
* @return current response
*/
protected HttpServletResponse getResponse() {
return ServletActionContext.getResponse();
}
/**
* Function:微信服务
* @author JLC
* @return
*/
public String weixinService(){
try{
//微信加密签名
String signature = getRequest().getParameter("signature");
//时间戳
String timestamp = getRequest().getParameter("timestamp");
//随机数
String nonce = getRequest().getParameter("nonce");
//随机字符串
String echostr = getRequest().getParameter("echostr");
if (StringUtils.isNotEmpty(echostr)) {
echostr = checkAuthentication(signature,timestamp,nonce,echostr);
//验证通过返回随即字串
getResponse().getWriter().write(echostr);
getResponse().getWriter().flush();
}else{
String postStr = readStreamParameter(getRequest().getInputStream()) ;
if (null!=postStr&&!postStr.isEmpty()){
Document document=null;
try{
document = DocumentHelper.parseText(postStr);
}catch(Exception e){
e.printStackTrace();
}
if(null==document){
getResponse().getWriter().write("nothing");
return null;
}
Element root=document.getRootElement();
String fromUsername = root.elementText("FromUserName"); //取得发送者
String toUsername = root.elementText("ToUserName"); //取得接收者
String userMsgType = root.elementText("MsgType");
String userMsgEvent = root.elementText("Event");
String keyword =new String(root.elementTextTrim("Content").getBytes(), "UTF-8");
String time = new Date().getTime()+"";
String textTpl = "<xml>"+
"<ToUserName><![CDATA[%1$s]]></ToUserName>"+
"<FromUserName><![CDATA[%2$s]]></FromUserName>"+
"<CreateTime>%3$s</CreateTime>"+
"<MsgType><![CDATA[%4$s]]></MsgType>"+
"<Content><![CDATA[%5$s]]></Content>"+
"<FuncFlag>0</FuncFlag>"+
"</xml>";
String msgType = "text";
//当回复内容为 深圳文字 的指令时
if(null!=keyword&&keyword.equals("深圳文字")) {
String contentStr = "欢迎来到微信公众平台!";
String resultStr = textTpl.format(textTpl, fromUsername, toUsername, time, msgType, contentStr);
getResponse().getWriter().write(resultStr);
}else if(null!=keyword&&keyword.equals("深圳图片")) {
textTpl = "<xml>"+
"<ToUserName><![CDATA[%1$s]]></ToUserName>"+
"<FromUserName><![CDATA[%2$s]]></FromUserName>"+
"<CreateTime>%3$s</CreateTime>"+
"<MsgType><![CDATA[news]]></MsgType>"+
"<ArticleCount>2</ArticleCount>"+
"<Articles>"+
"<item>"+
"<Title><![CDATA[title1]]></Title> "+
"<Description><![CDATA[图片一logo]]></Description>"+
"<PicUrl><![CDATA[http://www.**.com/images/logo.png]]></PicUrl>"+
"<Url><![CDATA[url]]></Url>"+
"</item>"+
"<item>"+
"<Title><![CDATA[title]]></Title>"+
"<Description><![CDATA[description]]></Description>"+
"<PicUrl><![CDATA[图片二]]></PicUrl>"+
"<Url><![CDATA[http://www.**.com/images/111.jpg]]></Url>"+
"</item>"+
"</Articles>"+
"<FuncFlag>1</FuncFlag>"+
"</xml>";
String resultStr = textTpl.format(textTpl, fromUsername, toUsername, time);
getResponse().getWriter().write(resultStr);
}else if(null!=keyword&&keyword.equals("Hello2BizUser")){
// 这是新用户关注时默认发的一条信息。可以做一个欢迎处理。 4.5之前版本
String contentStr = "欢迎来到微信公众平台!";
String resultStr = textTpl.format(textTpl, fromUsername, toUsername, time, msgType, contentStr);
getResponse().getWriter().write(resultStr);
}else{
String contentStr = "欢迎来到微信公众平台!";
String resultStr = textTpl.format(textTpl, fromUsername, toUsername, time, msgType, contentStr);
getResponse().getWriter().write(resultStr);
}
}else {
getResponse().getWriter().write("test");
}
}
}catch(Exception e){
}
return null;
}
//从输入流读取post参数
public String readStreamParameter(ServletInputStream in){
StringBuilder buffer = new StringBuilder();
BufferedReader reader=null;
try{
reader = new BufferedReader(new InputStreamReader(in));
String line=null;
while((line = reader.readLine())!=null){
buffer.append(line);
}
}catch(Exception e){
e.printStackTrace();
}finally{
if(null!=reader){
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return buffer.toString();
}
/**
* Function:微信验证方法
* @author JLC
* @param signature 微信加密签名
* @param timestamp 时间戳
* @param nonce 随机数
* @param echostr 随机字符串
* @return
*/
private String checkAuthentication(String signature,String timestamp,String nonce,String echostr) {
String result ="";
// 将获取到的参数放入数组
String[] ArrTmp = { Token, timestamp, nonce };
// 按微信提供的方法,对数据内容进行排序
Arrays.sort(ArrTmp);
StringBuffer sb = new StringBuffer();
for (int i = 0; i < ArrTmp.length; i++) {
sb.append(ArrTmp[i]);
}
// 对排序后的字符串进行SHA-1加密
String pwd = Encrypt(sb.toString());
if (pwd.equals(signature)) {
try {
System.out.println("微信平台签名消息验证成功!");
result = echostr;
} catch (Exception e) {
e.printStackTrace();
}
} else {
System.out.println("微信平台签名消息验证失败!");
}
return result;
}
/**
* 用SHA-1算法加密字符串并返回16进制串
*
* @param strSrc
* @return
*/
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());
} catch (NoSuchAlgorithmException e) {
System.out.println("错误");
return null;
}
return strDes;
}
private 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;
}
}