微信公眾號開發系列二:實現微信公眾號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後臺服務

以上我們完成了整個接口參數的配置,在通過驗證後,我們就可以調用其開放的響應接口進行進一步開發了。


關注我 免費獲取更多編程知識~


分享到:


相關文章: