微信公衆平臺如今推出自動回覆消息接口,可是因爲是接口內容用的是PHP語言寫的,不少地方操做起來讓本人這個對java比較熟悉的小夥很彆扭,因此仿照PHP的接口代碼作了一套jsp語言編寫的接口。php
首先先把整個接口代碼貼出來作下比較,而後咱們再分析代碼:html
PHP:java
- <?php
-
- define("TOKEN", "weixin");
- $wechatObj = new wechatCallbackapiTest();
- $wechatObj->valid();
-
- class wechatCallbackapiTest
- {
- public function valid()
- {
- $echoStr = $_GET["echostr"];
-
-
- if($this->checkSignature()){
- echo $echoStr;
- exit;
- }
- }
-
- public function responseMsg()
- {
-
- $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
-
-
- if (!empty($postStr)){
-
- $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()
- {
- $signature = $_GET["signature"];
- $timestamp = $_GET["timestamp"];
- $nonce = $_GET["nonce"];
-
- $token = TOKEN;
- $tmpArr = array($token, $timestamp, $nonce);
- sort($tmpArr);
- $tmpStr = implode( $tmpArr );
- $tmpStr = sha1( $tmpStr );
-
- if( $tmpStr == $signature ){
- return true;
- }else{
- return false;
- }
- }
- }
-
- ?>
JAVA:apache
以上就是PHP接口和JSP接口的全部代碼,如今咱們來對一些須要注意的地方作下分析:api
首先的從整體看的話,jsp要比PHP繁瑣一些,由於不少函數須要本身寫,像sha1加密,解析xml字符串等都須要本身找第三方的庫。數組
第一點,咱們要獲取微信公衆平臺給jsp發送的post或get參數,正常狀況下都是用request.getParameter就能夠獲取到,可是在寫的過程當中發現PHP是這樣獲取tomcat
- $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
這時經過查詢一些資料知道這樣獲取的是沒法經過$_GET或$_POST函數獲得的」未識別 MIME 類型的數據「,原始的 POST 數據服務器
(參考:http://blog.csdn.net/china_skag/article/details/7284227)微信
因此這裏使用獲取原始數據流的方式來解析post的xml數據app
- String postStr=null;
- try{
- postStr=this.readStreamParameter(final_request.getInputStream());
- }catch(Exception e){
- e.printStackTrace();
- }
- public String readStreamParameter(ServletInputStream in){
- StringBuilder buffer = new StringBuilder();
- BufferedReader reader=null;
- try{
- reader = new BufferedReader(new InputStreamReader(in));
- String line=null;
- while((line = reader.readLine())!=null){
- buffer.append(line);
- }
- }catch(Exception e){
- e.printStackTrace();
- }finally{
- if(null!=reader){
- try {
- reader.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- return buffer.toString();
- }
第二個,是response消息返回給微信平臺,我嘗試的用最通常的out.print去作,可是發現沒反應,觀察PHP的代碼寫法
猜測可能須要有個刷新的操做才能把消息response回去,因而找了下response內的一些函數作出如下嘗試
- public void print(String content){
- try{
- final_response.getWriter().print(content);
- final_response.getWriter().flush();
- final_response.getWriter().close();
- }catch(Exception e){
-
- }
- }
發現以上作法是能夠在微信發送端獲得消息的;
第三個,接口描述上說目前只支持80端口的服務端地址,因此我這裏的作法是用apache服務器路由到tomcat的jsp上
關於微信公衆平臺的消息接口的詳細介紹,能夠參看微信公衆平臺的官方文檔,裏面介紹了消息的xml的格式和消息的發送方式等。
轉載地址:http://blog.csdn.net/wangqianjiao/article/details/8469780/