-
Notifications
You must be signed in to change notification settings - Fork 17
Home
-
wechat-framework
是一个Java
开发的微信公众平台框架,基于wechat4j
框架的基础之上进行开发,将wechat4j
框架的底层代码全部替换改造。 -
wechat-framework
是一个帮助开发者简化开发微信公众号的一套轻量级的Java
应用框架。目前已经将应用与微信服务器之间的消息接收与返回完全封装完成:接收到的消息封装成WechatRequest
对象,返回的消息封装成WechatResponse
对象,微信公众号的消息加解密方式可以任选,安全模式的加解密同样不需要开发者操心,开发者完全不用关注太细节的问题,开发者只需要关注业务代码。
wechat-core
:
wechat-framework
核心组件,该组件封装有微信接入验证
工具、消息接收与返回服务、消息处理中心、access_token
管理、jsapi_token
管理、http(https)
工具、安全模式加解密
等核心功能。
wechat-api
:
wechat-framework
的API交互组件,该组件封装与微信服务器做api请求交互的功能。该组件依赖wechat-core
组件。
wechat-web
:
wechat-framework
提供的轻量级web组件,该组件已经封装好一个默认的微信服务器消息入口,以及提供一个默认的消息处理器.该组件是一个简易的Servlet
组件。开发者也可以采用其他web框架,只要提供微信服务器消息入口即可。
wechat-framework
源码中提供示例wechatframework-demo
工程,该demo为一个S
pringMVC搭建好的可运行的
maven``项目,可在其基础之上修改即可,其中wechat-framework在web.xml中的重要的配置均有说明。如果你要自己搭建,那么请按照如下步骤进行。
- 注:以下项目指标准maven结构的项目
- 创建一个web工程,导入jdk和wechat-framework的jar包。可以使用已经打包编译好的jar包,下载地址wechat-framework
创建wechat4j配置文件,命名为“wechat4j.properties”,在src/java/resources目录下(即classpath路径下)。你可以在
wechat-core.jar
包的根目录下找到wechat4j.properties.sample文件,复制到src/java/resources目录下修改名称即可。主要参数内容如下:
#公众号的Token(令牌)
wechat.token=token
#公众号的AppID(应用ID)
wechat.appid=appid
#公众号的AppSecret(应用密钥)
wechat.appsecret=secret
#公众号的EncodingAESKey(消息加解密密钥)
wechat.encodingaeskey=encodingaeskey
wechat4j.properties配置文件的配置项意义参见wechat4j配置文件解读。
- 配置
web.xml
- 1 配置消息接收入口Servlet
<servlet>
<servlet-name>WechatframeworkServlet</servlet-name>
<!-- 用户可自定义消息请求入口,不一定要采用Servlet的访问路径,例如可以在SpringMVC的Controller中配置访问入口,只要将WechatDefaultDispatcherServlet中的doGet和doPost的方法移植出来即可。 -->
<servlet-class>com.itfvck.wechatframework.web.servlet.WechatDefaultDispatcherServlet</servlet-class>
<!-- 用户可自定义消息处理中心MyService extends WechatSupport 即可,然后将此类配置在init-param中,参数名必须为wechatService。如果使用spring,则可以将MyService交给spring注入。此处若不配置,则会采用默认的示例消息处理中心WechatDefaultService -->
<!-- <init-param> -->
<!-- <param-name>wechatService</param-name> -->
<!-- <param-value>com.itfvck.wechatframework.service.MyService</param-value> -->
<!-- </init-param> -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>WechatframeworkServlet</servlet-name>
<url-pattern>/wechat/dispacther</url-pattern>
</servlet-mapping>
该配置文件在wechatframework-demo
项目中
- 重写消息处理器
WechatSupport
,创建新的类继承WechatSupport
,重写其中的各个消息、事件的处理方法。
package com.itfvck.wechatframework.service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.itfvck.wechatframework.core.common.MsgType;
import com.itfvck.wechatframework.core.msg.Image;
import com.itfvck.wechatframework.core.requestMsg.WechatRequest;
import com.itfvck.wechatframework.core.responseMsg.WechatResponse;
import com.itfvck.wechatframework.core.support.WechatSupport;
/**
* 用户自定义消息处理中心,若要该类起作用,则需配置在wem.xml中
*
* @author
*
*/
public class MyService extends WechatSupport {
static Logger logger = LoggerFactory.getLogger(MyService.class);
/**
* 文本消息处理Msgtype=text
*
* @param wechatRequest
* 请求对象
* @return
* @throws Exception
*/
@Override
protected String onText(WechatRequest wechatRequest) throws Exception {
String xml = null;
if (wechatRequest.getContent().indexOf("收到不支持的消息类型") > 0) {
xml = onUnknown(wechatRequest);
} else {
logger.info("wechatRequest:", wechatRequest.toString());
String content = wechatRequest.getContent().trim();
// TODO 这里写具体的业务
// 返回的消息对象,任何返回消息都构造为WechatResponse
WechatResponse wechatResponse = new WechatResponse();
wechatResponse.setContent("文本回复:" + content);
wechatResponse.setMsgType(MsgType.text.name());
// 消息对象构造完成之后,调用formatWechatResponse方法即可
// formatWechatResponse方法会自动对ToUserName,FromUserName,CreateTime赋值
xml = formatWechatResponse(wechatRequest, wechatResponse);
logger.info("WechatResponse:", wechatResponse.toString());
logger.info("onText Xml:", xml);
}
return xml;
}
/**
* 图片消息处理Msgtype=image
*
* @param wechatRequest
* @return
* @throws Exception
*/
@Override
protected String onImage(WechatRequest wechatRequest) throws Exception {
String xml = null;
logger.info("wechatRequest:", wechatRequest.toString());
WechatResponse wechatResponse = new WechatResponse();
wechatResponse.setMsgType(MsgType.image.name());
wechatResponse.setImage(new Image(wechatRequest.getMediaId()));
xml = formatWechatResponse(wechatRequest, wechatResponse);
logger.info("WechatResponse:", wechatResponse.toString());
logger.info("onImage Xml:", xml);
return xml;
}
}
上面代码中的onText()
是WechatSupport的父类消息转发器WechatDispatcher中的抽象方法,需要你自己的类来实现,表示对文本消息的处理,示例中是接收到用户的消息之后,返回给用户“文本回复:原句返回”文本消息。
onImage()
则是示例原图返回的消息。
注:该消息中心处理类开发完成之后,必须将类的全路径配置在web.xml的用户自定义消息处理中心
,详细请参照以上步骤的web.xml
配置。
继承了WechatSupport
类之后,你可以通过wechatRequest.getFromUserName()
类似的方法来得到微信服务器请求的参数。详细信息请阅读微信请求参数
继承了WechatSupport
类之后,你可以通过wechatResponse.setFromUserName(fromUser)
类似的方法来设置给微信服务器的响应参数。详细信息请阅读响应微信服务器参数
以文本信息为例,响应文本信息只需要在你的onText
方法中使用formatWechatResponse(wechatRequest, wechatResponse)
即可(参见上面的代码例子)
如果你有好的demo项目,请邮件或者修改本文件然后pull request给我,我会列在上面。
- it技术交流QQ群 286548895
- 支持邮件 345280563@qq.com
- 如果你觉得本项目不错,希望你能够点击一下右上角的star
- 如果你希望参与改进本项目,那么请点击右上角的
fork
,修改之后pull request
即可。如果你的贡献不错,你就会收到加入wechat-framework开源社区的邀请。 - 如果你发现了一个bug,请你创建一个issue来报告。 非常非常欢迎你能够参与本项目的建设,每人做出一点点贡献,对整个项目来说就是一个非常大的贡献,希望集合众人的力量,让项目走的更好,能够为更多的人服务。