第一次测试用测试号链接微信服务器时,需要配置接口信息
url就是自己的服务器中项目的地址
token是开发者自定义的验证信息
开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数如下表所示:
参数 | 描述 |
---|---|
signature | 微信加密签名signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。 |
timestamp | 时间戳 |
nonce | 随机数 |
echostr | 随机字符串 |
开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:
1)将token、timestamp、nonce三个参数进行字典序排序
2)将三个参数字符串拼接成一个字符串进行sha1加密
3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
1)sevlet获取验证数据
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//System.out.println("get");
/*
* 获取微信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");
wxTest wx = new wxTest();
Boolean res = wx.Check(signature, timestamp, nonce);
if(res) {
PrintWriter out = response.getWriter();
out.write(echostr);
}else {
System.out.println("配置失败");
}
}
2)wxTest验证接收到的数据
// token就是用户配置接口时填写的自定义token
private final String TOKEN = "happypower";
public Boolean Check(String signature,String timestamp,String nonce) {
// 1)将token、timestamp、nonce三个参数进行字典序排序
String[] strArr = {TOKEN,timestamp,nonce};
Arrays.sort(strArr);
// 2)将三个参数字符串拼接成一个字符串进行sha1加密
String strSha1 = strArr[0]+strArr[1]+strArr[2];
String result = this.Sha1(strSha1);
System.out.println(signature);
System.out.println(result);
// 3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
if(signature.equalsIgnoreCase(result)) {
return true;
}else {
return false;
}
}
3)sha1加密实现
public String Sha1(String str) {
try {
// 创建一个十六进制字符数组
char[] ch = "0123456789abcdef".toCharArray();
// 获取一个Sha1加密对象
MessageDigest md = MessageDigest.getInstance("Sha1");
byte[] strBit = md.digest(str.getBytes());
StringBuilder sb = new StringBuilder();
for (byte b : strBit) {
sb.append(ch[b >>> 4 & 15]);
sb.append(ch[b & 15]);
}
return sb.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}