java servlet处理微信企业号回调模式

package cn.com.lewis.wx.servlet;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.ParserConfigurationException;

import org.xml.sax.SAXException;

import cn.com.lewis.wx.bean.AppInfo;
import cn.com.lewis.wx.common.WeiXinConfiger;
import cn.com.lewis.wx.service.RequestHandler;

import com.qq.weixin.mp.aes.AesException;
import com.qq.weixin.mp.aes.WXBizMsgCrypt;

/**
 * 微信企业号被动接口监听程序
 * 
 */
public class WeixinQYHPassiveServlet extends HttpServlet {
	
	/**
	 * 自动生成的序列号
	 */
	private static final long serialVersionUID = 2690553754896029178L;
	
    /**
     * 校验Token
	 * @param request
	 * @param response
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    		throws ServletException, IOException {
    	
    	String sVerifyEchoStr = request.getParameter("echostr");
    	String sEchoStr=null; //需要返回的明文
		try {
			AppInfo app = WeiXinConfiger.getAppConfig(request);
			WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(app.getToken(), app.getAesKey(), app.getCorpCode());
			String sVerifyMsgSig = request.getParameter("msg_signature");
			String sVerifyTimeStamp = request.getParameter("timestamp");
			String sVerifyNonce = request.getParameter("nonce");
	        
			sEchoStr = wxcpt.VerifyURL(sVerifyMsgSig, sVerifyTimeStamp,
					sVerifyNonce, sVerifyEchoStr);
		} catch (AesException e1) {
			sEchoStr="ERR: "+e1.getCode()+ "\n\n";
			e1.printStackTrace();		
		}
		
		response.getWriter().print(sEchoStr);
		response.getWriter().flush();
		//将校验写入日志
		String strBackUrl = "http://" + request.getServerName() //服务器地址
                + ":" 
                + request.getServerPort()           //端口号
                + request.getContextPath()      //项目名称
                + request.getServletPath()      //请求页面或其他地址
    	    + "?" + (request.getQueryString()); //参数
		RequestHandler.logInfo("完整的校验url为 "+strBackUrl);
    }
    
    /**
     * 解析post提交的数据,并转交给处理程序
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    		throws ServletException, IOException {
    	//获得请求参数
		String sReqMsgSig =  request.getParameter("msg_signature");
		String sReqTimeStamp = request.getParameter("timestamp");
		String sReqNonce = request.getParameter("nonce");
		//获得post提交的数据
		BufferedReader br=new BufferedReader(new InputStreamReader(request.getInputStream()));
		StringBuilder sbuff=new StringBuilder();
		String tmp=null;	
		while((tmp=br.readLine())!=null){
			sbuff.append(tmp);
		}
		String sReqData = sbuff.toString();
		String sEchoStr=null;
		try {
			AppInfo app = WeiXinConfiger.getAppConfig(request);
			WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(app.getToken(), app.getAesKey(), app.getCorpCode());
			String sMsg = wxcpt.DecryptMsg(sReqMsgSig, sReqTimeStamp, sReqNonce, sReqData);	
			
			sEchoStr=RequestHandler.doHandle(sMsg,app);
					
			sEchoStr = wxcpt.EncryptMsg(sEchoStr, sReqTimeStamp, sReqNonce);
		} catch (AesException e1) {
			sEchoStr="ERR: "+e1.getCode()+ "\n\n";
			e1.printStackTrace();
		} catch (ParserConfigurationException e) {
			sEchoStr="ERR: "+AesException.ParseXmlError+ "\n\n";
			e.printStackTrace();
		} catch (SAXException e) {
			sEchoStr="ERR: "+AesException.ParseXmlError+ "\n\n";
			e.printStackTrace();
		}
		response.getWriter().print(sEchoStr);

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值