(微信公众号)验证消息的确来自微信服务器

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

 

 

1. 开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数如下表所示:

参数 描述
signature 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
timestamp 时间戳
nonce 随机数
echostr 随机字符串

 

2.

开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:

1)将token、timestamp、nonce三个参数进行字典序排序

2)将三个参数字符串拼接成一个字符串进行sha1加密

3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

java代码

1.创建servlet 

2.验证代码

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

 WxUtils代码

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

		
}

 

3.在测试公众号中进行配置

(微信公众号)验证消息的确来自微信服务器_第1张图片

你可能感兴趣的:(WeChat)