微信公众平台如今推出自动回复消息接口,可是因为是接口内容用的是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/