java开发微信公众平台(一)-- 服务器配置
微信公眾平臺開發(fā)好像已經(jīng)火了很長一段時間,我好像有點后知后覺。但只從了解它后便有點不可收拾之勢,腦袋里總想著開發(fā)一個自己的公眾號,雖然不知道具體做什么。
下面就說說自己這段時間對公眾號的學習。
欲善其事,必先利其器。在開發(fā)之前先要申請一個公眾號,公眾號有三種,個人比較容易申請的是訂閱號,服務(wù)號還要審核,稍微麻煩一點,對于個人開發(fā)我建議申請服務(wù)號,
因為后面會做自定義菜單的功能。再就是我們需要有一個公網(wǎng)的服務(wù)器,這個可以申請sina的sae和百度的bae,個人比較喜歡sina的一點,比較容易上手。這里不講公眾號的申請
和sae服務(wù)器的申請和配置。
再做完這兩件事后我們就可以開始公眾號的開發(fā)了。首先我們需要了解微信公眾號的工作流程,對其有個整體的把握,要不今后就會換挺多簡單錯誤。在啟用開發(fā)者模式情況下
(下面內(nèi)容都是在此模式下)當用戶通過微信客服端發(fā)送消息到微信服務(wù)后,微信服務(wù)器會將此消息轉(zhuǎn)發(fā)給我們的公網(wǎng)服務(wù)器,如上面所說sae和bae(以下內(nèi)容也均是在sae下完成)
。具體的業(yè)務(wù)邏輯就在sae上完成,處理完后再將結(jié)果發(fā)回微信服務(wù)器,微信服務(wù)器再發(fā)給用戶。
申請到公眾號后,登陸公眾品臺,可以看到微信已經(jīng)幫我們準備好了許多功能,我們不需要編寫任何代碼就可以完成一個具有基本的公眾號,但這不是本文的目的,我們是要
用自己的代碼實現(xiàn)一些功能,因此我們要進入開發(fā)者中心去配置服務(wù)器接口。
下面就是本文核心內(nèi)容:
試想一下讓兩個完全不沾邊的服務(wù)器(微信服務(wù)器和sae)對接的風險,因此必須有什么驗證機制的存在。具體的驗證過程是
1、微信服務(wù)器會以get方式調(diào)用我們部署在sae服務(wù)器上的servlet,并傳signature、timestamp、nonce、echostr四個參數(shù)。其中signature是微信加密簽名;timestamp
是時間戳,防止即使有別有用心之人獲得另外的參數(shù)而因時間戳的不一致無法完成驗證;nonce是隨機數(shù);echostr是隨機字符串,用于返回給微信服務(wù)器作比較。
2、servlet接收到以上數(shù)據(jù)后,會將token(在servlet中寫好且要用公眾平臺上開發(fā)者中心的token相同)timestamp、nonce按字典方式排序,再拼接成字符串進行sha1加密
將加密后的字符串與signature比較,如果相同就返回echostr。
3、微信服務(wù)器接收到返回的echostr,與發(fā)過去的echostr相比較,如果相同,就接入成功,否則失敗。
package com.java.Action;import java.io.IOException; import java.io.PrintWriter;import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;/*** Servlet implementation class CrazyServlet*/ @WebServlet("/CrazyServlet") public class CrazyServlet extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public CrazyServlet() {super();// TODO Auto-generated constructor stub}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 微信加密簽名String signature = request.getParameter("signature");// 時間戳String timestamp = request.getParameter("timestamp");// 隨機數(shù)String nonce = request.getParameter("nonce");// 隨機字符串String echostr = request.getParameter("echostr");PrintWriter out = response.getWriter();// 通過檢驗signature對請求進行校驗,若校驗成功則原樣返回echostr,表示接入成功,否則接入失敗if (SignUtil.checkSignature(signature, timestamp, nonce)) {out.print(echostr);}out.close();out = null;}} servlet中的doGet() package com.java.Action;import java.security.MessageDigest; import java.security.NoSuchAlgorithmException;public class SignUtil {// 與接口配置信息中的Token要一致private static String token = "TCB2011";public static boolean checkSignature(String signature, String timestamp,String nonce) {//從請求中(也就是微信服務(wù)器傳過來的)拿到的token, timestamp, nonceString[] arr = new String[] { token, timestamp, nonce };// 將token、timestamp、nonce三個參數(shù)進行字典序排序sort(arr);StringBuilder content = new StringBuilder();for (int i = 0; i < arr.length; i++) {content.append(arr[i]);}MessageDigest md = null;String tmpStr = null;try {md = MessageDigest.getInstance("SHA-1");// 將三個參數(shù)字符串拼接成一個字符串進行sha1加密byte[] digest = md.digest(content.toString().getBytes());//將字節(jié)數(shù)組轉(zhuǎn)成字符串tmpStr = byteToStr(digest);} catch (NoSuchAlgorithmException e) {e.printStackTrace();}content = null;// 將sha1加密后的字符串可與signature對比,標識該請求來源于微信return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;}//將加密后的字節(jié)數(shù)組變成字符串private static String byteToStr(byte[] byteArray) {String strDigest = "";for (int i = 0; i < byteArray.length; i++) {strDigest += byteToHexStr(byteArray[i]);}return strDigest;}private static String byteToHexStr(byte mByte) {char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A','B', 'C', 'D', 'E', 'F' };char[] tempArr = new char[2];tempArr[0] = Digit[(mByte >>> 4) & 0X0F];tempArr[1] = Digit[mByte & 0X0F];String s = new String(tempArr);return s;}//用于字典排序public static void sort(String a[]) {for (int i = 0; i < a.length - 1; i++) {for (int j = i + 1; j < a.length; j++) {if (a[j].compareTo(a[i]) < 0) {String temp = a[i];a[i] = a[j];a[j] = temp;}}}}}
再sae上配置好后,點擊開發(fā)者中心,首先啟用服務(wù)器配置。填寫url和token(和Java代碼中的一樣)、EncodingAESKey是隨機生成,消息加解密方式選擇明文模式。
這里的url就是你在sae中創(chuàng)建應(yīng)用的地址,我們已經(jīng)將寫好的java代碼上傳到這個地址。token是微信服務(wù)器和sae服務(wù)器進行對接驗證是用到的(必須保持一致),消息
加密暫時選擇明文模式,如果選擇加密模式需要編寫加密代碼,以后會再轉(zhuǎn)到加密或兼容模式,這里先用明文模式。這樣我們就完成了,點擊提交(記得sae服務(wù)器要打開),
如果現(xiàn)實成功就說明接入完成,我們可以接著做下面的工作了。
總結(jié)
以上是生活随笔為你收集整理的java开发微信公众平台(一)-- 服务器配置的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring框架分为哪七大模块以及各模块
- 下一篇: java序列化和反序列化以及序列化ID的