国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Java與微信不得不說的故事——實現微信公眾平臺與sae服務器的對接

2019-11-15 00:35:21
字體:
來源:轉載
供稿:網友
java與微信不得不說的故事——實現微信公眾平臺與sae服務器的對接

  又頹廢了些日子,說好認真來半年的,那就接著來啊,公司的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>

微信公眾平臺的配置截圖:

微信平臺提示接入成功。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 东乡| 沁水县| 平潭县| 新邵县| 兴业县| 威海市| 永兴县| 高唐县| 泸定县| 嘉荫县| 谢通门县| 枣强县| 鄂伦春自治旗| 海丰县| 平顺县| 乌兰浩特市| 大埔区| 香格里拉县| 寿阳县| 城口县| 尤溪县| 武冈市| 南和县| 莫力| 鄱阳县| 冀州市| 高碑店市| 怀宁县| 丰城市| 永清县| 松潘县| 昔阳县| 五原县| 曲沃县| 福海县| 长垣县| 吕梁市| 库伦旗| 淅川县| 宣威市| 威远县|