微信公众平台现在推出自动回复消息接口,但是由于是接口内容用的是PHP语言写的,很多地方操作起来让本人这个对java比较熟悉的小伙很别扭,所以仿照PHP的接口代码做了一套jsp语言编写的接口。

首先先把整个接口代码贴出来做下比较,然后我们再分析代码:

PHP:

<?php
/*** wechat php test*///define your token
define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();
$wechatObj->valid();class wechatCallbackapiTest
{public function valid(){$echoStr = $_GET["echostr"];//valid signature , optionif($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 dataif (!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:

<%@page import="java.util.Date"%>
<%@page import="org.dom4j.Element"%>
<%@page import="org.dom4j.DocumentHelper"%>
<%@page import="org.dom4j.Document"%>
<%@page import="java.io.IOException"%>
<%@page import="java.io.InputStreamReader"%>
<%@page import="java.io.BufferedReader"%>
<%@page import="java.io.Reader"%>
<%@page import="java.security.MessageDigest"%>
<%@page import="java.util.Arrays"%>
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%//WeiXinHandler为内部类不能使用非final类型的对象final String TOKEN="weixin";final HttpServletRequest final_request=request; final HttpServletResponse final_response=response;
%>
<%
class WeiXinHandler{public void valid(){String echostr=final_request.getParameter("echostr");if(null==echostr||echostr.isEmpty()){responseMsg();}else{if(this.checkSignature()){this.print(echostr);}else{this.print("error");                                                                                                                                                                                                                                                                                                                                         }}}//自动回复内容public void responseMsg(){String postStr=null;try{postStr=this.readStreamParameter(final_request.getInputStream());}catch(Exception e){e.printStackTrace();}//System.out.println(postStr);if (null!=postStr&&!postStr.isEmpty()){Document document=null;try{document = DocumentHelper.parseText(postStr);}catch(Exception e){e.printStackTrace();}if(null==document){this.print("");return;}Element root=document.getRootElement();String fromUsername = root.elementText("FromUserName");String toUsername = root.elementText("ToUserName");String keyword = root.elementTextTrim("Content");String time = new Date().getTime()+"";String textTpl = "<xml>"+"<ToUserName><![CDATA[%1$s]]></ToUserName>"+"<FromUserName><![CDATA[%2$s]]></FromUserName>"+"<CreateTime>%3$s</CreateTime>"+"<MsgType><![CDATA[%4$s]]></MsgType>"+"<Content><![CDATA[%5$s]]></Content>"+"<FuncFlag>0</FuncFlag>"+"</xml>";             if(null!=keyword&&!keyword.equals("")){String msgType = "text";String contentStr = "Welcome to wechat world!";String resultStr = textTpl.format(textTpl, fromUsername, toUsername, time, msgType, contentStr);this.print(resultStr);}else{this.print("Input something...");}}else {this.print("");}}//微信接口验证public boolean checkSignature(){String signature = final_request.getParameter("signature");String timestamp = final_request.getParameter("timestamp");String nonce = final_request.getParameter("nonce");String token=TOKEN;String[] tmpArr={token,timestamp,nonce};Arrays.sort(tmpArr);String tmpStr=this.ArrayToString(tmpArr);tmpStr=this.SHA1Encode(tmpStr);if(tmpStr.equalsIgnoreCase(signature)){return true;}else{return false;}}//向请求端发送返回数据public void print(String content){try{final_response.getWriter().print(content);final_response.getWriter().flush();final_response.getWriter().close();}catch(Exception e){}}//数组转字符串public String ArrayToString(String [] arr){StringBuffer bf = new StringBuffer();for(int i = 0; i < arr.length; i++){bf.append(arr[i]);}return bf.toString();}//sha1加密public String SHA1Encode(String sourceString) {String resultString = null;try {resultString = new String(sourceString);MessageDigest md = MessageDigest.getInstance("SHA-1");resultString = byte2hexString(md.digest(resultString.getBytes()));} catch (Exception ex) {}return resultString;}public final String byte2hexString(byte[] bytes) {StringBuffer buf = new StringBuffer(bytes.length * 2);for (int i = 0; i < bytes.length; i++) {if (((int) bytes[i] & 0xff) < 0x10) {buf.append("0");}buf.append(Long.toString((int) bytes[i] & 0xff, 16));}return buf.toString().toUpperCase();}//从输入流读取post参数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();}
}
%>
<%WeiXinHandler handler=new WeiXinHandler();handler.valid();
%>

以上就是PHP接口和JSP接口的所有代码,现在我们来对一些需要注意的地方做下分析:

首先的从总体看的话,jsp要比PHP繁琐一些,因为很多函数需要自己写,像sha1加密,解析xml字符串等都需要自己找第三方的库。

第一点,我们要获取微信公众平台给jsp发送的post或get参数,正常情况下都是用request.getParameter就可以获取到,但是在写的过程中发现PHP是这样获取

$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

这时通过查询一些资料知道这样获取的是无法通过$_GET或$_POST函数得到的” 未识别 MIME 类型的数据“,原始的 POST 数据

(参考:http://blog.csdn.net/china_skag/article/details/7284227)

所以这里使用获取原始数据流的方式来解析post的xml数据

String postStr=null;try{postStr=this.readStreamParameter(final_request.getInputStream());}catch(Exception e){e.printStackTrace();}
//从输入流读取post参数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的代码写法

echo "";
exit;

猜想可能需要有个刷新的操作才能把消息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的格式和消息的发送方式等。

微信公众平台消息接口-java-jsp版相关推荐

  1. php对接微信提醒,PHP对接微信公众平台消息接口开发流程教程

    PHP对接微信公众平台消息接口开发流程教程 发布于 2015-02-15 08:54:13 | 157 次阅读 | 评论: 1 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hyperte ...

  2. php网站怎么对接微信群,PHP对接微信公众平台消息接口开发流程教程

    PHP(外文名:PHP: Hypertext Preprocessor,中文名:"超文本预处理器")是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点,利于学习,使 ...

  3. php微信公众号怎么开发_PHP对接微信公众平台消息接口开发流程详解及实例

    这篇文章主要介绍了PHP对接微信公众平台消息接口开发流程,如何使用PHP版接口操作公众平台消息,需要的朋友可以参考下 一.写好接口程序 在你的服务器上上传好一个接口程序文件内容如下: 代码如下:< ...

  4. 微信公众平台消息接口星标功能

    [微信公众平台星标功能接口被撤销]微信公众平台消息接口中的星标功能,被悄悄的去掉了. 原因应该是有的账号在程序中大量使用星标功能,造成微信服务器存储记录过于宠大. 现在要继续使用星标功能,只能在后台手 ...

  5. 微信公众平台消息接口开发(13)多语种互译

    微信公众平台消息接口 微信公众平台API 微信开发模式 多语种翻译 多语言互译 Microsoft Translator 方倍工作室 Paraphrase API 10 out of 11 rated ...

  6. 微信公众平台消息接口API指南

    下述文档已过期,更加完整及详细的请访问  http://www.cnblogs.com/txw1958/p/wechat-tutorial.html 简介 微信公众平台消息接口为开发者提供了一种新的消 ...

  7. 微信公众平台消息接口开发(2)-封装weixin.class.php

    微信公众平台消息接口开发(2)-封装weixin.class.php 一.封装weixin.class.php 由于微信公众平台的通信使用的是特定格式的XML数据,每次接受和回复都要去做一大堆的数据处 ...

  8. 微信公众平台消息接口开发(34)微信墙之表白墙/婚礼墙/晚会墙/会议墙/晒单墙/照片墙/历史墙...

    微信公众平台开发模式 微信 公众平台 消息接口 开发模式 企业微信公众平台 微信墙 婚礼墙/晚会墙/会议墙/晒单墙/照片墙/历史墙 历史上的今天 作者:方倍工作室   原文: http://www.c ...

  9. 微信公众平台消息接口开发(1)

    原文链接 现在微信很热,微信公众平台的应用也很热,其实微信公众平台消息接口开发并不难,只要有接口调用就OK了. 要开发微信公众平台上的应用,得准备什么呢? 至少要有一个公众账号.服务器.域名这三样东西 ...

  10. 微信公众平台消息接口使用指南

    >>微信公众平台接口申请地址 最近微信开发这个东西炒的很猛,于是dApps考虑提供一些资源. 一 .微信公众平台消息接口简介 公众平台消息接口为开发者提供了一种新的消息处理方式. 二 . ...

最新文章

  1. Linux 普通用户之间免密登陆
  2. RSA加密算法详解以及RSA在laravel中的应用
  3. Go 语言web 框架 Gin 练习6
  4. ms SQL Server表自增字段重置
  5. 《我也能做CTO之.程序员职业规划》 水准之上,期望以下
  6. Java并发编程实战~StampedLock
  7. testng连接MySQL_Selenium+TestNG实战-8-连接数据库方法去验证文章是否发布
  8. 打击犯罪(信息学奥赛一本通-T1386)
  9. header()函数使用说明
  10. c++ 2条中线焦点_三角形的中线为何交于一点
  11. c语言图书馆管理系统源码,C语言图书馆管理系统源代码
  12. 【MapGIS精品教程】001:MapGIS K9完整图文安装教程
  13. excel文件修复工具_免费的PDF转Word软件有哪些?各种文件格式转换工具推荐
  14. SQL项目实战练习:淘宝用户行为数据分析实战
  15. ubuntu创建桌面快捷方式
  16. 基于DCT变换的JPEG图像压缩原理
  17. java处理 mysql中json类型
  18. 怎么把腾讯视频的qlv文件转成mp3格式 【已解决】
  19. 导出微信群头像并将图片命名为[微信昵称.jpg]
  20. 如何在cad中导入谷歌地图_如何在Google地图中设置出发和到达时间

热门文章

  1. 计算机专业 日语n2,「高考日语知识」高考考日语可以选计算机专业吗
  2. 同步github上的项目到gitcafe
  3. Linux下permission denied
  4. 【代码随想录刷题记录】 232.用栈实现队列 、225. 用队列实现栈
  5. HCIP---第十七天笔记
  6. 笔记本外接显示器后没有声音 (windows 10)
  7. 用ftp上传到服务器视频文件夹,ftp 上传文件夹到服务器
  8. 1-2、数据结构线性表之顺序表的基本操作插入、删除、遍历、初始化
  9. 数据传输服务DTS的应用场景(阿里巴巴)
  10. [FAQ21281]android P分区表中odmdtbo与dtbo分区的说明