微信公众号开发:如何实现公众号的token验证和signature校验

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

一、微信公众号开发环境说明:

开发工具:Eclipse

JDK版本:JDK1.8

Servlet容器:Tomcat8.5

内网穿透工具:NATAPP

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

二、微信公众号开发账号接口配置

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

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

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

四、构建微信公众号后台服务工程

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

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 {
  //定义微信接口配置的token,同微信账号页面中配置的token值保持一致
  public static final String token = "bifengmiaozhuan";
  //实现对回传参数的hash,然后同回传参数signature比对
  public static boolean checkSignature(String signature,String timestamp,String nonce){
    ArrayList<String> list = new ArrayList<String>();
    list.add(token);
    list.add(timestamp);
    list.add(nonce);
    //对参数进行升序排列
    Collections.sort(list);
    StringBuilder content = new StringBuilder();
    for(String str:list){
      content.append(str);
    }
    //调用hash算法,对相关参数hash
    return signature.equals(HashUtil.hash(content.toString(),"SHA1"));
  }
}

HashUtil的源码如下:

public class HashUtil {
  //根据指定的hash算法,对传入的内容进行hash
  public 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:

<!-- 配置校验signature的servlet 开始 -->
 <servlet>
   <servlet-name>weixinServlet</servlet-name>
   <servlet-class>weixinService.servlet.WeixinServlet</servlet-class>
 </servlet>
 <servlet-mapping>
   <servlet-name>weixinServlet</servlet-name>
   <url-pattern>/weixin</url-pattern>
 </servlet-mapping>
 <!-- 配置校验signature的servlet 结束 -->

4、启动内网映射工具

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

5、配置接口参数并验证

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超哥同学

赠人玫瑰 手留余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值