天天看點

一:驗證微信的Token

前言:申請到微信公衆号的同學,可能會挺感興趣的,畢竟微信公衆号,确實是一個好東西,它提供了一個很好的平台,而且它自帶有一套管理模闆,對于微信公衆号可以很好的管理。

       但是也僅僅是很好的管理,因為作為開發者來說,很多功能需要更加人性的自定化,就需要由自己寫程式來提供服務,而微信恰恰就提供了這些接口,可以友善的我們去調用微信的功能。

  于是我們去開啟開發者模式

  

  點選“基本配置”,然後需要輸入url,輸入token,輸入EncodingAESKey(這個可以随機生成),最後點選送出。

  問題:?

  奇怪的是微信這方面的文檔對于這部分好像是沒有任何說明(我不知道是不是我沒有找到還是怎麼的),我輸入我個人的域名,然後輸入随便輸入了32位的token,然後點選随機生成EncodingAESKey,最後選擇加密模式,然後點選送出,最後發現微信提示token驗證失敗,試過好多次,也從微信官方文檔查詢token這是個什麼東西,最後卻隻得到token是一個随機的字元串,可以自由輸入,結果卻可想而知。

  原因!

  百度之後得到,之前輸入的url,微信會對這個url發出一個http請求,而這個url,需要正确的對于這個微信的請求作出正确的響應,這樣才算驗證成功,這下總算弄明白了

  由于我已經有了公網的域名,也有了自己的伺服器(沒有伺服器,沒有域名的,隻要申請一個空間,就可以了,空間會送一個三級域名),是以就開始寫代碼,這裡是一個servlet,你們隻要把這個servlet拷貝過去,就可以驗證了,下面列出代碼:

  

import java.io.IOException;
import java.util.Arrays;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.codec.digest.DigestUtils;

@WebServlet("/validateWeiXin.do")
public class ValidateWeiXin extends HttpServlet {
    private static final long serialVersionUID = 1L;
    
    private String TOKEN = "這裡随便填入32位以内的數字英文,也就是token";
       

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/plain;charset=utf-8");
        // 微信加密簽名
        String signature = request.getParameter("signature");
        // 随機字元串
        String echostr = request.getParameter("echostr");
        // 時間戳
        String timestamp = request.getParameter("timestamp");
        // 随機數
        String nonce = request.getParameter("nonce");

        String[] str = { TOKEN, timestamp, nonce };
        Arrays.sort(str); // 字典序排序
        String bigStr = str[0] + str[1] + str[2];
        // SHA1加密,我這裡用的是common-codec的jar包,你們也可以用java自帶的消息消息摘要來寫,隻不過要多寫幾行代碼,但結果都一樣的
        DigestUtils.sha1Hex(bigStr);
        String digest = DigestUtils.sha1Hex(bigStr);

        // 确認請求來至微信
        if (digest.equals(signature)) {
            response.getWriter().print(echostr);
        }
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }      

  有自己伺服器的,就可以驗證成功了