clazz=Class.forName(handler);MessageProcessingHandlerprocessingHandler=(MessageProcessingHandler)clazz.newInstance();//取得消息类型Stringtype=msg.getMsgType();Methodmt=clazz.getMethod(type"TypeMsg",InMessage.class);oms=(OutMessage)mt.invoke(processingHandler,msg);if(oms==null){oms=newTextOutMessage();((TextOutMessage)oms).setContent("系统错误!");}setMsgInfo(oms,msg);}catch(Exceptione){logger.error(e);oms=newTextOutMessage();((TextOutMessage)oms).setContent("系统错误!");try{setMsgInfo(oms,msg);}catch(Exceptione1){logger.error(e);}}//把发送发送对象转换为xml输出xs=XStreamFactory.init(true);xs.alias("xml",oms.getClass());xs.alias("item",Articles.class);Stringxml=xs.toXML(oms);logger.debug("输出消息:["xml"]");response.getWriter().write(xml);}privatevoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException{Stringsignature=request.getParameter("signature");//微信加密签名Stringtimestamp=request.getParameter("timestamp");//时间戳Stringnonce=request.getParameter("nonce");//随机数Stringechostr=request.getParameter("echostr");////验证if(Tools.checkSignature(_token,signature,timestamp,nonce)){response.getWriter().write(echostr);}}privatevoidsetMsgInfo(OutMessageoms,InMessagemsg)throwsException{//设置发送信息Class>outMsg=oms.getClass().getSuperclass();FieldCreateTime=outMsg.getDeclaredField("CreateTime");FieldToUserName=outMsg.getDeclaredField("ToUserName");FieldFromUserName=outMsg.getDeclaredField("FromUserName");ToUserName.setAccessible(true);CreateTime.setAccessible(true);FromUserName.setAccessible(true);CreateTime.set(oms,newDate().getTime());ToUserName.set(oms,msg.getFromUserName());FromUserName.set(oms,msg.getToUserName());}/***启动的时候加载wechat.properties配置可以在过滤器配置wechat.properties路径*/@Overridepublicvoidinit(FilterConfigconfig)throwsServletException{Stringcf=config.getInitParameter("conf");if(cf!=null){conf=cf;}StringclassPath=this.getClass().getResource("/").getPath().replaceAll("%20","");conf=conf.replace("classPath:",classPath);p=newProperties();Filepfile=newFile(conf);if(pfile.exists()){try{p.load(newFileInputStream(pfile));}catch(FileNotFoundExceptione){logger.error("未找到wechat.properties",e);}catch(IOExceptione){logger.error("wechat.properties读取异常",e);}}logger.info("WeChatFilter已经启动!");}}-IMDN开发者社群-imdn.cn">
clazz=Class.forName(handler);MessageProcessingHandlerprocessingHandler=(MessageProcessingHandler)clazz.newInstance();//取得消息类型Stringtype=msg.getMsgType();Methodmt=clazz.getMethod(type"TypeMsg",InMessage.class);oms=(OutMessage)mt.invoke(processingHandler,msg);if(oms==null){oms=newTextOutMessage();((TextOutMessage)oms).setContent("系统错误!");}setMsgInfo(oms,msg);}catch(Exceptione){logger.error(e);oms=newTextOutMessage();((TextOutMessage)oms).setContent("系统错误!");try{setMsgInfo(oms,msg);}catch(Exceptione1){logger.error(e);}}//把发送发送对象转换为xml输出xs=XStreamFactory.init(true);xs.alias("xml",oms.getClass());xs.alias("item",Articles.class);Stringxml=xs.toXML(oms);logger.debug("输出消息:["xml"]");response.getWriter().write(xml);}privatevoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException{Stringsignature=request.getParameter("signature");//微信加密签名Stringtimestamp=request.getParameter("timestamp");//时间戳Stringnonce=request.getParameter("nonce");//随机数Stringechostr=request.getParameter("echostr");////验证if(Tools.checkSignature(_token,signature,timestamp,nonce)){response.getWriter().write(echostr);}}privatevoidsetMsgInfo(OutMessageoms,InMessagemsg)throwsException{//设置发送信息Class>outMsg=oms.getClass().getSuperclass();FieldCreateTime=outMsg.getDeclaredField("CreateTime");FieldToUserName=outMsg.getDeclaredField("ToUserName");FieldFromUserName=outMsg.getDeclaredField("FromUserName");ToUserName.setAccessible(true);CreateTime.setAccessible(true);FromUserName.setAccessible(true);CreateTime.set(oms,newDate().getTime());ToUserName.set(oms,msg.getFromUserName());FromUserName.set(oms,msg.getToUserName());}/***启动的时候加载wechat.properties配置可以在过滤器配置wechat.properties路径*/@Overridepublicvoidinit(FilterConfigconfig)throwsServletException{Stringcf=config.getInitParameter("conf");if(cf!=null){conf=cf;}StringclassPath=this.getClass().getResource("/").getPath().replaceAll("%20","");conf=conf.replace("classPath:",classPath);p=newProperties();Filepfile=newFile(conf);if(pfile.exists()){try{p.load(newFileInputStream(pfile));}catch(FileNotFoundExceptione){logger.error("未找到wechat.properties",e);}catch(IOExceptione){logger.error("wechat.properties读取异常",e);}}logger.info("WeChatFilter已经启动!");}} - IMDN开发者社群-imdn.cn">
首页 »
Java »
微信公众平台开发模式(JAVA) SDK/微信app
于 2014-01-21 发布
0 107
【核心代码】package com.gson;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.util.Date;import java.util.Properties;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletInputStream;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.log4j.Logger;import com.gson.bean.Articles;import com.gson.bean.InMessage;import com.gson.bean.OutMessage;import com.gson.bean.TextOutMessage;import com.gson.inf.MessageProcessingHandler;import com.gson.util.Tools;import com.gson.util.XStreamFactory;import com.thoughtworks.xstream.XStream;/** * 请求拦截 * * @author GodSon * */public class WeChatFilter implements Filter { private final Logger logger = Logger.getLogger(WeChatFilter.class); private String _token; private String conf = "classPath:wechat.properties"; private String defaultHandler = "com.gson.inf.DefaultMessageProcessingHandlerImpl"; private Properties p; @Override public void destroy() { logger.info("WeChatFilter已经销毁"); } @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; Boolean isGet = request.getMethod().equals("GET"); String path = request.getServletPath(); String pathInfo = path.substring(path.lastIndexOf("/")); if (pathInfo == null) { response.getWriter().write("error"); } else { _token = pathInfo.substring(1); if (isGet) { doGet(request, response); } else { doPost(request, response); } } } private void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setCharacterEncoding("UTF-8"); response.setContentType("text/xml"); OutMessage oms = new OutMessage(); ServletInputStream in = request.getInputStream(); // 转换微信post过来的xml内容 XStream xs = XStreamFactory.init(false); xs.alias("xml", InMessage.class); String xmlMsg = Tools.inputStream2String(in); logger.debug("输入消息:[" xmlMsg "]"); InMessage msg = (InMessage) xs.fromXML(xmlMsg); // 获取自定消息处理器,如果自定义处理器则使用默认处理器。 String handler = p.getProperty("MessageProcessingHandlerImpl"); if (handler == null) handler = defaultHandler; try { // 加载处理器 Class clazz = Class.forName(handler); MessageProcessingHandler processingHandler = (MessageProcessingHandler) clazz.newInstance(); // 取得消息类型 String type = msg.getMsgType(); Method mt = clazz.getMethod(type "TypeMsg", InMessage.class); oms = (OutMessage) mt.invoke(processingHandler, msg); if (oms == null) { oms = new TextOutMessage(); ((TextOutMessage) oms).setContent("系统错误!"); } setMsgInfo(oms,msg); } catch (Exception e) { logger.error(e); oms = new TextOutMessage(); ((TextOutMessage) oms).setContent("系统错误!"); try { setMsgInfo(oms,msg); } catch (Exception e1) { logger.error(e); } } // 把发送发送对象转换为xml输出 xs = XStreamFactory.init(true); xs.alias("xml", oms.getClass()); xs.alias("item", Articles.class); String xml = xs.toXML(oms); logger.debug("输出消息:[" xml "]"); response.getWriter().write(xml); } private void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { String signature = request.getParameter("signature");// 微信加密签名 String timestamp = request.getParameter("timestamp");// 时间戳 String nonce = request.getParameter("nonce");// 随机数 String echostr = request.getParameter("echostr");// // 验证 if (Tools.checkSignature(_token, signature, timestamp, nonce)) { response.getWriter().write(echostr); } } private void setMsgInfo(OutMessage oms,InMessage msg) throws Exception { // 设置发送信息 Class outMsg = oms.getClass().getSuperclass(); Field CreateTime = outMsg.getDeclaredField("CreateTime"); Field ToUserName = outMsg.getDeclaredField("ToUserName"); Field FromUserName = outMsg.getDeclaredField("FromUserName"); ToUserName.setAccessible(true); CreateTime.setAccessible(true); FromUserName.setAccessible(true); CreateTime.set(oms, new Date().getTime()); ToUserName.set(oms, msg.getFromUserName()); FromUserName.set(oms, msg.getToUserName()); } /** * 启动的时候加载wechat.properties配置 可以在过滤器配置wechat.properties路径 */ @Override public void init(FilterConfig config) throws ServletException { String cf = config.getInitParameter("conf"); if (cf != null) { conf = cf; } String classPath = this.getClass().getResource("/").getPath().replaceAll("%20", " "); conf = conf.replace("classPath:", classPath); p = new Properties(); File pfile = new File(conf); if (pfile.exists()) { try { p.load(new FileInputStream(pfile)); } catch (FileNotFoundException e) { logger.error("未找到wechat.properties", e); } catch (IOException e) { logger.error("wechat.properties读取异常", e); } } logger.info("WeChatFilter已经启动!"); }}
下载说明:请别用迅雷下载,失败请重下,重下不扣分!
-
基于JBox2D的 android 游戏开发源码例子(完整版下载)
基于JBox2D的 android 游戏开发源码例子(完整版下载)
- 2014-09-19下载
- 积分:1
-
android aidl跨进程调用 完整源码下载(含客户端和服务端源码)
这两天在学习aidl跨进程调用,研究了一天终于写出了个helloword。。做下记录吧。根据官方提供的指南,开发aidl跨进程调用,主要分以下步骤:1. 创建.aidl文件-该文件(YourInterface.aidl)定义了客户端可用的方法和数据的接口。2. 在makefile文件中加入.aidl文件-(Eclipse中的ADT插件提供管理功能)Android包括名为AIDL的编译器,位于tools/文件夹。3. 实现接口-AIDL编译器从AIDL接口文件中利用Java语言创建接口,该接口有一个继承的命名为Stub的内部抽象类(并且实现了一些IPC调用的附加方法),要做的就是创建一个继承YourInterface.Stub的类并且实现在.aidl文件中声明的方法。4. 向客户端公开接口-如果是编写服务,应该继承Service并且重载Service.onBind(Intent) 以返回实现了接口的对象实例上面的东西真的很官方。。下面结合我的例子做一下学习总结:先开发服务器端1.创建一个aidl文件,可以看提供的源码。创建完成后,eclipse插件自动在gen目录下生成同名字的java文件。里面包含一个Stub抽象类,这个类继承自android.os.Binder,这个类是实现整个远程调用的核心。2.然后创建一个类来继承上面说到的那个Stub抽象类,实现里面的抽象方法。(这些抽象方法是根据aidl文件自动生成的)。3.创建一个自定义Service继承自Service,实现其onBind方法,注意此onBind方法必须返回第二步创建的那个Stub类的子类。然后在xml中声明此service,注意此service的声明必须包含一个action,此action也用于客户端的调用使用。(在下面的客户端开发中会有介绍)。4.创建一个activity,此activity只要实现把service启动了即可。这样服务器端就开发完毕,运行后启动了一个可供远程调用的service。关键还是通过onBind暴露一个Binder给客户端。Binder哪来呢?就是通过aidl文件adt会自动生成一个抽象类Stub继承自Binder,只需要创建一个类实现这个Stub的抽象方法即可。然后开发客户端:1.客户端也需要一个aidl文件,注意客户端的aidl文件的包名必须和服务器端的aidl包名一致,名字也相同。创建完后同样会在gen下生成一个接口。2.创建一个Activity,包含变量ServiceConnection con,实现其onServiceConnected和onServiceDisconnected方法,onServiceConnected方法生成第一步那个接口的实现类的对象。con对象用于在onCreate中绑定service,这个service的action必须为服务器端声明的那个service的配置action。绑定中用到con会执行onServiceConnected方法生成aidl对象iPerson。然后就可以通过iPerson来调用aidl里的任意方法返回服务器的东西。客户端开发完毕。关键点是创建aidl文件自动生成了一个接口,在activity中必须绑定服务程序开启的service,在绑定过程中初始化aidl对象。然后就可用aidl对象调用任意方法了。OK,可以运行看效果了。过程真的很繁琐。。但是好像也只能这样了。最主要的还是服务端onBind暴露,然后客户端bindService得到aidl对象。
- 2020-12-01 17:29:26下载
- 积分:1
-
android 百度地图应用实例源码下载
android 百度地图应用实例源码下载
- 2015-02-25下载
- 积分:1
-
miniTwitter登录界面
miniTwitter登录界面
- 2014-02-12下载
- 积分:1
-
android 时间轴 TimeLine例子
android 时间轴 TimeLine例子
- 2014-12-04下载
- 积分:1
-
android Gallery控件学习示例源码
android Gallery控件学习示例源码
- 2014-05-29下载
- 积分:1
-
某500强android学习资料
某500强android学习资料
- 2015-01-28下载
- 积分:1
-
android 侧滑菜单例子源码下载
android 侧滑菜单例子源码下载
- 2015-05-14下载
- 积分:1
-
实现进度条效果
实现进度条效果
- 2014-05-16下载
- 积分:1
-
Android 万年历源码
Android 万年历源码
- 2015-03-13下载
- 积分:1