(微信公众号)解析公众号用户发送的消息

https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140453

1.解析普通信息.

代码

package servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import utils.WxUtils;

/**
 * Servlet implementation class Wx
 */
public class Wx extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Wx() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		/*开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数如下表所示:
		参数	描述
		signature	微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
		timestamp	时间戳
		nonce	随机数
		echostr	随机字符串*/
		String signature = request.getParameter("signature");
		String timestamp = request.getParameter("timestamp");
		String nonce = request.getParameter("nonce");
		String echostr = request.getParameter("echostr");
		System.out.println(signature);
		System.out.println(timestamp);
		System.out.println(nonce);
		System.out.println(echostr);
		boolean checkSignature = WxUtils.CheckSignature(signature,timestamp,nonce);
		if (checkSignature) {
			System.out.println("success");
			//
			PrintWriter writer = response.getWriter();
			writer.print(echostr);
			writer.flush();
			writer.close();
		}else {
			System.out.println("failed");
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("post");
		//解析接收的消息
		HashMap<String, String> hashMap=WxUtils.parseRequest(request.getInputStream());
		System.out.println(hashMap);
	}

}

 

package utils;

import java.security.MessageDigest;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

import javax.servlet.ServletInputStream;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class WxUtils {

	private static final  String Token="shxx";
	private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5',  
            '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};  
	public static boolean CheckSignature(String signature, String timestamp, String nonce) {
		
//		1)将token、timestamp、nonce三个参数进行字典序排序 
//		2)将三个参数字符串拼接成一个字符串进行sha1加密 
//		3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
		String[] strs=new String[]{Token,timestamp,nonce};
		
		Arrays.sort(strs);
		
		String str=strs[0]+strs[1]+strs[2];
		
		String mysignature=sha1(str);
		return mysignature.equals(signature);
	}
	
	private static String sha1(String str) {
		
		  
        if (str == null) {  
            return null;  
        }  
        try {  
            MessageDigest messageDigest = MessageDigest.getInstance("SHA1"); 
            messageDigest.update(str.getBytes());  
            return getFormattedText(messageDigest.digest());  
        } catch (Exception e) {  
            throw new RuntimeException(e);  
        } 
	}

	private static String getFormattedText(byte[] bytes) {
		  
        int len = bytes.length;  
        StringBuilder buf = new StringBuilder(len * 2);  
        // 把密文转换成十六进制的字符串形式  
        for (int j = 0; j < len; j++) {  
            buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]);  
            buf.append(HEX_DIGITS[bytes[j] & 0x0f]);  
        }  
        return buf.toString(); 
	}

	public static HashMap<String, String> parseRequest(ServletInputStream inputStream)  {
		/*参数	描述
		ToUserName	开发者微信号
		FromUserName	发送方帐号(一个OpenID)
		CreateTime	消息创建时间 (整型)
		MsgType	消息类型,文本为text
		Content	文本消息内容
		MsgId	消息id,64位整型*/
		SAXReader saxReader = new SAXReader();
		HashMap<String, String> map = new HashMap<>();
		 try {
			Document document = saxReader.read(inputStream);
			Element root = document.getRootElement();
			List<Element> elements = root.elements();
			for (Element element : elements) {
				map.put(element.getName(), element.getStringValue());
			}
			return map;
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return map;
	}

		
}

 

2.扫描关注公众号

 

发送消息

解析消息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值