//最基礎的servlet 進行接收package com.cq.wechat;import java.io.IOException;import java.io.PRintWriter;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.List;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.dom4j.io.SAXReader;import java.io.InputStream;import java.util.HashMap;import java.util.Map;import org.dom4j.Document;import org.dom4j.Element;/** * Servlet implementation class weChat */@WebServlet("/weChat")public class weChat extends HttpServlet { private static final long serialVersionUID = 1L; private String jsonString; // 用于存放json數據 /** * Default constructor. */ public weChat() { // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse * response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.print("------------------------------------"); String echostr=""; echostr = request.getParameter("echostr"); //驗證消息是否來自微信,是的話,把該字符串返回給微信 if (echostr!=null) { valid(request); PrintWriter out = response.getWriter(); out.println(jsonString); out.close(); System.out.print(jsonString); } //接受微信的推送(關注和取消關注等) try { //解析微信返回的xml Map<String, String> map = parseXml(request); //測試查看返回的消息 System.out.println(map.size()); for (String key : map.keySet()) { System.out.println("key= "+ key + " and value= " + map.get(key)); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse * response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } /** * 驗證微信消息 * @param request */ public void valid(HttpServletRequest request) { String encryptStr = ""; List<String> list = new ArrayList<String>(); list.add(request.getParameter("nonce")); list.add(request.getParameter("timestamp")); list.add("cqtoken");//自己的token Collections.sort(list, new SpellComparator()); for (String s : list) { encryptStr += s; } String encrypt = SHA1.hex_sha1(encryptStr); if (encrypt.equals(request.getParameter("signature"))) { jsonString = request.getParameter("echostr"); } } /** * 漢字拼音排序比較器 */ @SuppressWarnings("rawtypes") class SpellComparator implements Comparator { public int compare(Object o1, Object o2) { try { // 取得比較對象的漢字編碼,并將其轉換成字符串 String s1 = new String(o1.toString().getBytes("GB2312"), "UTF-8"); String s2 = new String(o2.toString().getBytes("GB2312"), "UTF-8"); // 運用String類的 compareTo()方法對兩對象進行比較 return s1.compareTo(s2); } catch (Exception e) { e.printStackTrace(); } return 0; } } /** * * 解析微信發來的請求(XML) * * * * @param request * * @return * * @throws Exception * */ public Map<String, String> parseXml(HttpServletRequest request) throws Exception { // 將解析結果存儲在HashMap中 Map<String, String> map = new HashMap<String, String>(); // 從request中取得輸入流 InputStream inputStream = request.getInputStream(); // 讀取輸入流 SAXReader reader = new SAXReader(); Document document = reader.read(inputStream); String requestXml = document.asXML(); String subXml = requestXml.split(">")[0] + ">"; requestXml = requestXml.substring(subXml.length()); // 得到xml根元素 Element root = document.getRootElement(); // 得到根元素的全部子節點 List<Element> elementList = root.elements(); // 遍歷全部子節點 for (Element e : elementList) { map.put(e.getName(), e.getText()); } map.put("requestXml", requestXml); // 釋放資源 inputStream.close(); inputStream = null; return map; }}
新聞熱點
疑難解答