开发IDE:MyEclipse或Eclipse或IDEA都可以,我现在用的是MyEclipse。
请求校验流程分析
上一篇中我们讲了微信开发环境的搭建,下面就来写请求校验程序的开发,目的是是为了验证消息的确来自微信服务器。
开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数如下表所示:
开发者通过检验signature对请求进行校验,若确认此次GET请求来自微信服务器,原样返回echostr参数内容,则接入生效,否则接入失败。加密/校验流程如下:
- 将token、timestamp、nonce三个参数进行字典排序;
- 将三个参数字符串拼接成一个字符串进行sha1加密;
- 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。
注意:微信公众号接口必须以
http://
或https://
开头,分别支持80端口和443端口。
请求校验程序的实现
SignUtil类封装请求校验流程
新建一个名为wechat_read的web项目,在项目的src下新建一个工具类SignUtil,该类对请求校验流程的实现进行了封装,方便在Servlet中调用。SignUtil类的代码如下【参考书籍《微信公众平台应用开发》——柳峰】:
package com.zrxjuly.read.util;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
/**
* 描述:请求校验工具类.
* @author zrxJuly
* @createDate 2017-12-9
* @since 1.0
*
*/
public class SignUtil {
// 与开发模式接口配置信息中的Token保持一致.
private static String token = "weixinCourse";
/**
* 校验签名
* @param signature 微信加密签名.
* @param timestamp 时间戳.
* @param nonce 随机数.
* @return
*/
public static boolean checkSignature(String signature, String timestamp, String nonce) {
// 对token、timestamp、和nonce按字典排序.
String[] paramArr = new String[] {token, timestamp, nonce};
Arrays.sort(paramArr);
// 将排序后的结果拼接成一个字符串.
String content = paramArr[0].concat(paramArr[1]).concat(paramArr[<