又頹廢了些日子,說好認真來半年的,那就接著來啊,公司的easyUI平臺慢慢開始明白了,可是最近bug太多了,只能找時間在研究了,平時無聊看見了了java微信平臺開發,感覺有點意思呀,自己也來試試,不過又得求教博客園里面的大神們了,現在開始研究。
一開始無聊的時候,自己在新浪云服務器注冊了一個賬號,可以建立一些應用在上面,微信平臺也是可以的。于是自己照著微信官方的例子,建立了微信公眾平臺與新浪云服務器的接口,成功了。不過官方是用php語言寫的(也許PHP是世界上最好的語言)??墒亲鳛橐粋€Javaer,當然要學會怎么寫Java了。先貼把這個例子貼一下吧。
<?php/** * wechat php test *///define your tokendefine("TOKEN", "haojiahongxihuanliyuan");$wechatObj = new wechatCallbackapiTest();$wechatObj->valid();class wechatCallbackapiTest{ public function valid() { $echoStr = $_GET["echostr"]; //valid signature , option if($this->checkSignature()){ echo $echoStr; exit; } } public function responseMsg() { //get post data, May be due to the different environments $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; //extract post data if (!empty($postStr)){ /* libxml_disable_entity_loader is to PRevent XML eXternal Entity Injection, the best way is to check the validity of xml by yourself */ libxml_disable_entity_loader(true); $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); $fromUsername = $postObj->FromUserName; $toUsername = $postObj->ToUserName; $keyWord = trim($postObj->Content); $time = time(); $textTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <Content><![CDATA[%s]]></Content> <FuncFlag>0</FuncFlag> </xml>"; if(!empty( $keyword )) { $msgType = "text"; $contentStr = "Welcome to wechat world!"; $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr); echo $resultStr; }else{ echo "Input something..."; } }else { echo ""; exit; } } private function checkSignature() { // you must define TOKEN by yourself if (!defined("TOKEN")) { throw new Exception('TOKEN is not defined!'); } $signature = $_GET["signature"]; $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; $token = TOKEN; $tmpArr = array($token, $timestamp, $nonce); // use SORT_STRING rule sort($tmpArr, SORT_STRING); $tmpStr = implode( $tmpArr ); $tmpStr = sha1( $tmpStr ); if( $tmpStr == $signature ){ return true; }else{ return false; } }}?>這個是官方提過的接口程序。
下面開始研究Java接口程序。
當用戶通過微信客服端發送消息到微信服務后,微信服務器會將此消息轉發給我們的公網服務器,也就是上面所說sae新浪云服務器。具體的業務邏輯就在sae上完成,處理完后再將結果發回微信服務器,微信服務器再發給用戶。
讓兩個完全不沾邊的服務器(微信服務器和sae)對接是有風險,因此必須有驗證機制的存在。具體的驗證過程是

代碼如下:
微信公眾平臺去請求sae中的coreServlet。
package org.liufeng.course.servlet;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.liufeng.course.service.CoreService;import org.liufeng.course.util.SignUtil;/** * 請求處理的核心類 * * @author liufeng * @date 2013-09-29 */public class CoreServlet extends HttpServlet { private static final long serialVersionUID = 4440739483644821986L; /** * 請求校驗(確認請求來自微信服務器) */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 微信加密簽名 String signature = request.getParameter("signature"); // 時間戳 String timestamp = request.getParameter("timestamp"); // 隨機數 String nonce = request.getParameter("nonce"); // 隨機字符串 String echostr = request.getParameter("echostr"); PrintWriter out = response.getWriter(); // 請求校驗,若校驗成功則原樣返回echostr,表示接入成功,否則接入失敗 if (SignUtil.checkSignature(signature, timestamp, nonce)) { out.print(echostr); } out.close(); out = null; } /** * 處理微信服務器發來的消息 */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 將請求、響應的編碼均設置為UTF-8(防止中文亂碼) request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); // 調用核心業務類接收消息、處理消息 String respXml = CoreService.processRequest(request); // 響應消息 PrintWriter out = response.getWriter(); out.print(respXml); out.close(); }}消息處理類:
package org.liufeng.course.util;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.util.Arrays;/** * 請求校驗工具類 * * @author liufeng * @date 2013-09-01 */public class SignUtil { // 與開發模式接口配置信息中的Token保持一致 private static String token = "weixinCourse"; /** * 校驗簽名 * * @param signature 微信加密簽名 * @param timestamp 時間戳 * @param nonce 隨機數 * @return */ public static boolean checkSignature(String signature, String timestamp, String nonce) { // 對token、timestamp和nonce按字典排序 String[] paramArr = new String[] { token, timestamp, nonce }; Arrays.sort(paramArr); // 將排序后的結果拼接成一個字符串 String content = paramArr[0].concat(paramArr[1]).concat(paramArr[2]); String ciphertext = null; try { MessageDigest md = MessageDigest.getInstance("SHA-1"); // 對接后的字符串進行sha1加密 byte[] digest = md.digest(content.toString().getBytes()); ciphertext = byteToStr(digest); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } // 將sha1加密后的字符串與signature進行對比 return ciphertext != null ? ciphertext.equals(signature.toUpperCase()) : false; } /** * 將字節數組轉換為十六進制字符串 * * @param byteArray * @return */ private static String byteToStr(byte[] byteArray) { String strDigest = ""; for (int i = 0; i < byteArray.length; i++) { strDigest += byteToHexStr(byteArray[i]); } return strDigest; } /** * 將字節轉換為十六進制字符串 * * @param mByte * @return */ 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; }}web.xml中配置了coreServlet:
<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet> <servlet-name>coreServlet</servlet-name> <servlet-class> org.liufeng.course.servlet.CoreServlet </servlet-class> </servlet> <!-- /coreServlet用于指定該Servlet的訪問路徑 --> <servlet-mapping> <servlet-name>coreServlet</servlet-name> <url-pattern>/coreServlet</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list></web-app>
微信公眾平臺的配置截圖:

微信平臺提示接入成功。
新聞熱點
疑難解答