本文介绍了,微信公众号在开发者模式下通过微信服务器验证的设置
准备工作:
- 申请到应用引擎,用于部署自己的应用,笔者用的是新浪云
- 在微信公众平台上面点击基本配置—->服务器配置—–>修改配置
填上URL,以及Token,如图
URL:http://1.*************applinzi.com/WeixinServlet(微信服务器通过像这个地址发送请求,完成验证)
Token:token(可随意填写,微信服务器通过token加上timestamp以及nonce生成signature即微信加密签名)
验证过程及原理:
(在此之前必须已经把自己的应用部署的服务器上,能够通过登记的URL进行访问)
- 微信服务器根据填写的URL 发送一个get请求
参数 | 描述 |
---|---|
echostr | 随机字符串(用于返回表通过应用验证) |
nonce | 随机数(参与生成加密签名) |
timestamp | 时间戳(参与生成加密签名) |
signature | 加密签名(通过token、nonce、timestamp生成) |
###应用接收到请求,处理并反馈(验证是来自微信服务器的请求返回echostr)
那么如何处理微信服务器发送过来的请求呢
很简单!判断signature是否是微信服务器发过来的就成
我们要做的工作就是
首先,拿到timestamp,nonce加上我们自己设置的token,对这三个参数按字典序排序后拼接成一个字符串。
然后,对这个字符串进行SHA-1加密
最后,加密过后的字符串如果与微信服务器发送过来的signature一样,那么就通过了我方应用的验证。
具体实现代码如下:
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String token = "token"; //此处token是在微信工作平台上填写的Token
String endstr = "";
// 获取相关参数
String timestamp = req.getParameter("timestamp");// 时间戳
String signature = req.getParameter("signature");// 加密签名(结合了token、timestamp以及nonce)
String nonce = req.getParameter("nonce");// 随机数
String echostr = req.getParameter("echostr");// 随机字符串,验证通过返回
// 开始验证
// 对token、timestamp以及nonce 按字典序排序
String arrays[] = new String[] { token, timestamp, nonce };
Arrays.sort(arrays);
// 将排序后的三个参数按顺序拼接成一个字符串,并对其进行sha1加密
String result = "";
for (String str : arrays) {
result += str;
}
try {
MessageDigest md = MessageDigest.getInstance("SHA-1");
byte[] hash = md.digest(result.getBytes());
Formatter formatter = new Formatter();
for (byte b : hash) {
formatter.format("%02x", b);
}
endstr = formatter.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
// 将加密后的字符串与signature比较,相同则验证通过返回随机字符串
if (endstr.equals(signature)) {
PrintWriter pw = resp.getWriter();
pw.print(echostr);
pw.close();
} else {
}
}
验证通过后的处理
通过后,只需原样返回微信服务器发送过来的随机字符串(echostr)即可,服务器在收到返回的echostr后,整个验证过程就算处理完毕了。
**相关说明:
在微信公众号中设置URL 不要只写一个域名,要写能够处理这个请求的地址,可以是JSP也可以是servlet
本文域名后面跟着的WeixinServlet是一个servlet