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);

    }

}

發佈了37 篇原創文章 · 獲贊 57 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章