微信公众号开发系列二:实现微信公众号token验证和signature校验

上文中描述了开发公众号所需要的准备工作,本文讲解如何搭建工程,如何实现账号的接口配置。

开发工具:Eclipse

JDK版本:JDK1.8

Servlet容器:Tomcat8.5

内网穿透工具:NATAPP

本教程基于Servlet来做请求响应,不使用相关框架,旨在说明微信公众号开发的相关流程。

要进行公众号开发需要登录公众号开启开发模式,配置开发接口。本教程采用测试账号来进行开发,故登录测试账号,配置接口。

首先要配置的就是微信服务请求响应的URL,用来确定本公众号的服务响应来源,另外还要设置一个token字段,此字段内容值可自行定义,当保存配置的时候会把这个token发送到微信平台,然后微信平台会请求此URL调用开发的微信服务,验证服务的可用性和合法性。此URL是使用域名表示的完整路径,如:http://rdzqcm.natappfree.cc/weixinService/weixin。因此,要想配置成功,必然要求我们的服务是开启的,并且有可用的域名可以使用,所以在配置前要先完成下面步骤后进行此项配置。

微信公众号开发系列二:实现微信公众号token验证和signature校验

三、微信公众号基于Token的验证的流程

微信公众号开发系列二:实现微信公众号token验证和signature校验

微信公众号开发之token验证流程图

1、在Eclipse中新建一个WEB工程,取名:weixinService。

微信公众号开发系列二:实现微信公众号token验证和signature校验

2、新建一个Servlet,用来响应微信服务器发来的请求。取名:weixinServlet。

接口配置的时候,微信服务平台会调用我们配置的URL,并且是以get的方式请求的,所以我们在weixinServlet的doGet()方法中实现上述流程的验证配置过程。

先获取请求传来的相关参数,然后根据参数和配置的token使用写好的hash算法得到hashcode,返回同传来的signature的对比结果。

WeixinServlet的源码如下:

public class WeixinServlet extends HttpServlet{

private static final long serialVersionUID = 1L;

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//获取微信服务器传来的相关参数
String signature = req.getParameter("signature");
String timestamp = req.getParameter("timestamp");
String nonce = req.getParameter("nonce");
String echostr = req.getParameter("echostr");
PrintWriter out = resp.getWriter();
//调用比对signature的方法,实现对token和传入的参数进行hash算法后的结果比对
if(CheckSignatureUtil.checkSignature(signature, timestamp, nonce)){
out.print(echostr);
}
}
}

CheckSignatureUtil的源码如下:

public class CheckSignatureUtil {
\t//定义微信接口配置的token,同微信账号页面中配置的token值保持一致
\tpublic static final String token = "bifengmiaozhuan";
\t//实现对回传参数的hash,然后同回传参数signature比对
\tpublic static boolean checkSignature(String signature,String timestamp,String nonce){
\t\tArrayList<string> list = new ArrayList<string>();
\t\tlist.add(token);
\t\tlist.add(timestamp);
\t\tlist.add(nonce);

\t\t//对参数进行升序排列
\t\tCollections.sort(list);
\t\tStringBuilder content = new StringBuilder();
\t\tfor(String str:list){
\t\t\tcontent.append(str);
\t\t}
\t\t//调用hash算法,对相关参数hash
\t\treturn signature.equals(HashUtil.hash(content.toString(),"SHA1"));
\t}
}
/<string>/<string>

HashUtil的源码如下:

public class HashUtil {
\t//根据指定的hash算法,对传入的内容进行hash
\tpublic static String hash(String content, String algorithm) {
if (content.isEmpty()) {
return "";
}
MessageDigest hash = null;
try {
hash = MessageDigest.getInstance(algorithm);
byte[] bytes = hash.digest(content.getBytes("UTF-8"));
String result = "";
for (byte b : bytes) {
String temp = Integer.toHexString(b & 0xff);
if (temp.length() == 1) {
temp = "0" + temp;
}
result += temp;
}
return result;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return "";
}
}

至此,整个根据token验证微信服务的Servlet程序就开发完毕。

3、配置Servlet

在工程的Web.xml中配置Servlet:


<servlet>
\t<servlet-name>weixinServlet/<servlet-name>
\t<servlet-class>weixinService.servlet.WeixinServlet/<servlet-class>
/<servlet>
<servlet-mapping>
\t<servlet-name>weixinServlet/<servlet-name>
\t<url-pattern>/weixin/<url-pattern>
/<servlet-mapping>

4、启动内网映射工具

进入cmd命令窗口,切换到之前NATAPP安装好的目录下,参考NATAPP使用的相关命令,启动NATAPP,命令:natapp -authtoken=“根据申请时分配的值填写”。启动后如图:

微信公众号开发系列二:实现微信公众号token验证和signature校验

基于natapp完成内网穿透

5、配置接口参数并验证

使用NATAPP启动后生成的域名,结合我们工程的路径,配置接口参数并保存,成功后,页面弹出提示信息。

微信公众号开发系列二:实现微信公众号token验证和signature校验

配置微信公众号测试号连通java后台服务

以上我们完成了整个接口参数的配置,在通过验证后,我们就可以调用其开放的响应接口进行进一步开发了。


关注我 免费获取更多编程知识~


分享到:


相關文章: