java微信平台,发源码
最近写了一个微信平台的架构,采用servlet + spring3.0 + hibernate4.1。整体架构由我负责建设,我尽可能的把业务模块分出来。趁着刚搭好的框架,留着这版。代码是大部份都由其他成熟框架直接 copy过来整合,去掉了一些没用的配置。部分我加入的设计也都是自己经过长时间项目提炼出来的,所有代码稳定性大可放心,并且难度不大。源码我也贴网上,希望有人帮我一起完善一下!不足处也请批评指正。
贴出部分代码,用到了部分设计模式,代码可读性比较好。没什么技术含量,里面有一些涉及微信平台的业务代码可能会有点难懂,如果您认为还不错,那就点个赞。如果认为还值得改进,那也麻烦提出来,我也近期慢慢改进。
代码贴在这里,如果有人愿意一同学习进步,后期就放到github上面去,现阶段我将持续改进。
下载地址
http://pan.baidu.com/s/1i320J3n
spring部分代码:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd "> <!-- 扫描注解Bean --> <context:component-scan base-package="com.cpic"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:resources.properties</value> </list> </property> </bean> <bean id="dataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource"> <property name="alias" value="proxoolDataSource"/> <property name="driver" value="${connection.driver_class}" /> <property name="driverUrl" value="${connection.url}" /> <property name="user" value="${connection.username}" /> <property name="password" value="${connection.password}" /> <property name="maximumConnectionCount" value="${proxool.maximum.connection.count}"/> <property name="minimumConnectionCount" value="${proxool.minimum.connection.count}" /> <property name="statistics" value="${proxool.statistics}" /> <property name="simultaneousBuildThrottle" value="${proxool.simultaneous.build.throttle}"/> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" > <property name="dataSource" ref="dataSource"/> <property name="packagesToScan"> <list> <value>com.cpic</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">${hibernate.dialect}</prop> <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> <prop key="hibernate.format_sql">true</prop> <prop key="hibernate.query.substitutions">${hibernate.query.substitutions}</prop> <prop key="hibernate.default_batch_fetch_size">${hibernate.default_batch_fetch_size}</prop> <prop key="hibernate.max_fetch_depth">${hibernate.max_fetch_depth}</prop> <prop key="hibernate.generate_statistics">${hibernate.generate_statistics}</prop> <prop key="hibernate.bytecode.use_reflection_optimizer">${hibernate.bytecode.use_reflection_optimizer}</prop> <prop key="hibernate.cache.use_second_level_cache">${hibernate.cache.use_second_level_cache}</prop> <prop key="hibernate.cache.use_query_cache">${hibernate.cache.use_query_cache}</prop> <prop key="hibernate.cache.region.factory_class">${hibernate.cache.region.factory_class}</prop> <prop key="net.sf.ehcache.configurationResourceName">${net.sf.ehcache.configurationResourceName}</prop> <prop key="hibernate.cache.use_structured_entries">${hibernate.cache.use_structured_entries}</prop> <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop> <!-- <prop key="hibernate.connection.datasource">${hibernate.connection.datasource}</prop> <prop key="hibernate.connection.provider_class">${hibernate.connection.provider_class}</prop> <prop key="hibernate.jndi.class">${hibernate.jndi.class}</prop> --> </props> </property> </bean> <!-- 开启AOP监听 只对当前配置文件有效 --> <aop:aspectj-autoproxy expose-proxy="true"/> <!-- 开启注解事务 只对当前配置文件有效 --> <tx:annotation-driven transaction-manager="txManager"/> <bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> </bean> <tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <tx:method name="save*" propagation="REQUIRED" /> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="create*" propagation="REQUIRED" /> <tx:method name="insert*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="merge*" propagation="REQUIRED" /> <tx:method name="del*" propagation="REQUIRED" /> <tx:method name="remove*" propagation="REQUIRED" /> <tx:method name="put*" propagation="REQUIRED" /> <tx:method name="use*" propagation="REQUIRED"/> <tx:method name="send*" propagation="REQUIRED" /> <!--hibernate4必须配置为开启事务 否则 getCurrentSession()获取不到--> <tx:method name="get*" propagation="REQUIRED" read-only="true" /> <tx:method name="count*" propagation="REQUIRED" read-only="true" /> <tx:method name="find*" propagation="REQUIRED" read-only="true" /> <tx:method name="list*" propagation="REQUIRED" read-only="true" /> <tx:method name="*" read-only="true" /> </tx:attributes> </tx:advice> <aop:config expose-proxy="true"> <!-- 只对业务逻辑层实施事务 --> <aop:pointcut id="txPointcut" expression="execution(* com.cpic..service.*.*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/> </aop:config> <!-- spring启动时加载spring工具类 --> <bean id="springUtils" class="com.cpic.common.util.SpringContextUtil"></bean> </beans>
部分业务 spring配置:
<bean id="textReceviService" class="com.cpic.basemsg.service.impl.TextReceviService"></bean> <bean id="eventReceviService" class="com.cpic.basemsg.service.impl.EventReceviService"></bean> <!-- 在线咨询 --> <bean id="onlineAskEventImpl" class="com.cpic.basemsg.service.event.impl.OnlineAskEventImpl"></bean> <!-- 卡单激活 --> <bean id="activeCareEventImpl" class="com.cpic.basemsg.service.event.impl.ActiveCareEventImpl"></bean> <!-- 客户回访 --> <bean id="custReVisEventImpl" class="com.cpic.basemsg.service.event.impl.CustReVisEventImpl"></bean> <!-- 道路救援 --> <bean id="roadHelpEventImpl" class="com.cpic.basemsg.service.event.impl.RoadHelpEventImpl"></bean> <!-- 自助报案 --> <bean id="selfPoliceEventImpl" class="com.cpic.basemsg.service.event.impl.SelfPoliceEventImpl"></bean> <bean id="wechatMng" class="com.cpic.basemsg.service.WeChatMng"> <property name="map"> <map> <entry key="text"> <ref local="textReceviService"/> </entry> <entry key="event"> <ref local="eventReceviService"/> </entry> </map> </property> <property name="baseMap"> <map> <entry key="btn13"> <ref local="onlineAskEventImpl"/> </entry> <entry key="btn21"> <ref local="roadHelpEventImpl"/> </entry> <entry key="btn22"> <ref local="selfPoliceEventImpl"/> </entry> <entry key="btn23"> <ref local="custReVisEventImpl"/> </entry> <entry key="btn24"> <ref local="activeCareEventImpl"/> </entry> </map> </property> </bean>
业务解耦类
package com.cpic.basemsg.service; import java.util.Map; /** * 设计这个类,主要是为了解耦,可实现对逻辑层的配置,将业务更细化 * 将一些共同特性统一处理 * @author wuxw * */ public class WeChatMng { static Logger logger = Logger.getLogger(WeChatMng.class); @SuppressWarnings("unchecked") public WeChatService weChatService; @SuppressWarnings("unchecked") private Map<String,WeChatService> map; private Map<String,BaseEventService> baseMap; /** 点击事件*/ public BaseEventService baseEventService; public void setMap(Map<String, WeChatService> map) { this.map = map; } public void setBaseMap(Map<String, BaseEventService> baseMap) { this.baseMap = baseMap; } /** * 对不同消息类型的控制转发 * @param msgType * @param wxMsgXml * @return */ public String process(String msgType,String wxMsgXml) throws BaseMsgException{ if(msgType == null || msgType == ""){ logger.error("请求消息:" + msgType); throw new BaseMsgException("请求消息为空!"); } weChatService = map.get(msgType); if(null == weChatService){ throw new BaseMsgException("不支持的接口类型:" + msgType); } return weChatService.process(wxMsgXml); } /** * 对不同事件的控制转发 * @parama clickKey 按钮编号 * @return * @throws BaseMsgException 业务异常 */ public String processEvent(String click,EventMsgModel model) throws BaseMsgException{ if(click == null){ throw new BaseMsgException("不存在的点击事件:" + click); } if(model == null){ throw new BaseMsgException("传入的事件消息为null!" ); } baseEventService = baseMap.get(click); if(baseEventService == null){ throw new BaseMsgException("暂时不支持的点击参数:" + click); } return baseEventService.process(model); } }
部分类的核心设计
/** * 抽象出功能模块 * 信息的处理流程分三步依次进行: * 1. 接收信息 * 2. 处理信息 * 3. 返回信息 * 并且这个顺序不能变,强制使用处理信息的流程 * 我们只需要关心业务处理的方式 * @author wuxw * */ public abstract class WeChatServiceAbs<T extends BaseMsgModel> extends CommonHibernateDao implements WeChatService<BaseMsgModel> { /** * 处理消息,用模版的形式对各模块独立 * @param xmlMsg 传入消息 * @return 返回处理后的消息 * @throws WeChatException */ public String process(String xmlMsg) throws BaseMsgException{ MsgModel msg = reviceMsg(xmlMsg); return processMsg(msg).toString(); } }
java微信平台,发源码的更多相关文章
- 沐雪多用户微信公众平台开发源码,商城小程序源码(2018年最新的asp.net C# 微信源码,小程序源码)
现售价5400元,就可以搭建自己的微信平台啦 购买地址:https://item.taobao.com/item.htm?id=539102325336 该系统是由[上海沐雪网络]独家授权销售,其他地 ...
- Java微信公众平台开发_07_JSSDK图片上传
一.本节要点 1.获取jsapi_ticket //2.获取getJsapiTicket的接口地址,有效期为7200秒 private static final String GET_JSAPITIC ...
- JAVA微信扫码支付模式二功能实现完整例子
概述 本例子实现微信扫码支付模式二的支付功能,应用场景是,web网站微信扫码支付.实现从点击付费按钮.到弹出二维码.到用户用手机微信扫码支付.到手机上用户付费成功.web网页再自动调整到支付成功后的页 ...
- Java微信公众平台开发--番外篇,对GlobalConstants文件的补充
转自:http://www.cuiyongzhi.com/post/63.html 之前发过一个[微信开发]系列性的文章,也引来了不少朋友观看和点评交流,可能我在写文章时有所疏忽,对部分文件给出的不是 ...
- Java微信公众平台开发_03_消息管理之被动回复消息
GitHub源码:https://github.com/shirayner/weixin_gz 一.本节要点 1.回调url 上一节,我们启用服务器配置的时候,填写了一个服务器地址(url),如下图, ...
- java微信扫码支付Native(模式二)
官方开发文档模式二的地址:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5 pom文件的依赖: <?xml versio ...
- Java之微信支付(扫码支付模式二)案例实战
摘要:最近的一个项目中涉及到了支付业务,其中用到了微信支付和支付宝支付,在做的过程中也遇到些问题,所以现在总结梳理一下,分享给有需要的人,也为自己以后回顾留个思路. 一:微信支付接入准备工作: 首先, ...
- Java中的微信支付(2):API V3 微信平台证书的获取与刷新
1. 前言 在Java中的微信支付(1):API V3版本签名详解一文中胖哥讲解了微信支付V3版本API的签名,当我方(你自己的服务器)请求微信支付服务器时需要根据我方的API证书对参数进行加签,微信 ...
- java 微信公众服务平台 下发 模板消息
java 微信公众服务平台 下发 模板消息 (一).部分截图 (二).部分代码 (一).部分截图: (二).部分代码: //此处 给用户微信发消息... Map<String,String> ...
随机推荐
- 通俗易懂地解决中文乱码问题(2) --- 分析解决Mysql插入移动端表情符报错 ‘incorrect string value: '\xF0...
原文:[原创]通俗易懂地解决中文乱码问题(2) --- 分析解决Mysql插入移动端表情符报错 'incorrect string value: '\xF0... 这篇blog重点在解决问题,如果你对 ...
- 砸金蛋:jQuery+PHP实现的砸金蛋中奖程序
原文 砸金蛋:jQuery+PHP实现的砸金蛋中奖程序 砸金蛋被广泛应用于庆典活动.商家促销.电视娱乐等场合,它的趣味.悬念能迅速活跃现场气氛.同样,我们也可以将砸金蛋应用到WEB网站上,用于开展线上 ...
- SSH深度历险记(两) Jboss+EJB一审
学习感悟:每次学习新知识.通过初审会从小事做起,获得成就感.经典Hello Workd我们成功的例子奠定了门哈,呢.非常好的理解了.Ejb的核心. 今天主要以这个小实例,来学习EJB的分布式,我们能够 ...
- Web API-属性路由
路由(Routing)就是Web API如何将一个URI匹配到一个action的过程.Web API 2 支持一个新的路由方式-属性路由(attribute routing).顾名思义,属性路由使用标 ...
- ASP.NET MVC基于标注特性的Model验证:将ValidationAttribute应用到参数上
原文:ASP.NET MVC基于标注特性的Model验证:将ValidationAttribute应用到参数上 ASP.NET MVC默认采用基于标准特性的Model验证机制,但是只有应用在Model ...
- Introduction to gaussian filter 高斯滤波器
Introduction to gaussian filter 我尝试尽可能低门槛的介绍这些好玩的东东-这里只须要正态分布函数作为基础就可以開始玩图像的高斯滤波了. Don't panic ! 在通常 ...
- 深入了解 Java HelloWorld
Java 的 Hello World 代码 public class HelloWorld { /** * * @param args */ public static void main(Strin ...
- Wijmo 5 + Ionic Framework之:Hello World!
Wijmo 5 + Ionic Framework之:Hello World! 本教程中,我们用Wijmo 5 和 Ionic Framework实现一个Mobile的工程:Hello World. ...
- Sql Server 主键由字母数字组成并按照数字自动增长
在SQL SERVER 中如果我们想要使主键按照一定规则自动增长我们可以这样做: 这里我们新建一张研究表,里面有研究ID,研究人员姓名和研究医院. 我们使SicentificId 设为主键 并且从1开 ...
- 读书笔记—CLR via C#字符串及文本
前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...