前言:申請到微信公眾號的同學,可能會挺感興趣的,畢竟微信公眾號,確實是一個好東西,它提供了一個很好的平台,而且它自帶有一套管理模板,對於微信公眾號可以很好的管理。
但是也僅僅是很好的管理,因為作為開發者來說,很多功能需要更加人性的自定化,就需要由自己寫程序來提供服務,而微信恰恰就提供了這些接口,可以方便的我們去調用微信的功能。
於是我們去開啟開發者模式
點擊“基本配置”,然后需要輸入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); }
有自己服務器的,就可以驗證成功了