Home - shuchuan999/wechat-mp-tools GitHub Wiki
ConfigAdapter 配置启动类
用于项目启动时完成相关配置
使用:新建配置类继承ConfigAdapter
,加上@Component
注解。重写config()
方法,方法中调用WeChatRegistry
中的配置方法。
使用样例:
@Component
public class WeChatConfig extends ConfigAdapter {
@Autowired
private TextHandler textHandler;
@Autowired
private EventHandler eventHandler;
@Override
public void config(){
WeChatContext.config()
.configMsgHandler()
.setHandler(textHandler, MsgType.TEXT)
.setHandler(eventHandler, MsgType.EVENT);
}
}
WeChatRegistry 配置中心
用于微信功能配置,可以在运行时动态更改配置,但是不建议这么做。
完整配置样例:
WeChatContext//核心容器
.config()//进行配置操作
.configCommon()//基础配置
.setAppID(appid)//开发者id
.setSecret(secret)//开发者密码
.setToken(token)//token令牌
.setEncodingAESKey(EncodingAESKey)//密钥
.setTokenLastMinutes(TokenLastMinutes)//token持续时间
.setTokenRepository(myRepository)//token存储方式
.and()//继续进行其他配置
.configApi()//微信接口相关配置
.setAfterProcessor(afterProcessor)//接口前置处理
.setPreProcessor(preProcessor)//接口后置处理
.and()//继续进行其他配置
.configMsgHandler()//消息接收配置
.setHandler(imgHanler,MsgType.IMAGE)//配置图像接收处理方法
.setHandler(textHandler,MsgType.TEXT)//配置文字接收处理方法
.setExceptionHandler(exHandler,ExHandler.class);//配置异常处理
TokenRepository token仓库
get()
:从仓库中获取access_token
store(AccessToken accessToken)
:将access_token存储至仓库
若需自定义仓库,继承并实现这两个方法,并完成token仓库配置。
jdbc存储样例:
@Component
public class JDBCRepository implements TokenRepository {
@Autowired
private WeChatDao weChatDao;
@Override
public AccessToken get() {
return weChatDao.queryAccessToken();
}
@Override
public void store(AccessToken accessToken) {
weChatDao.updateAccessToken(accessToken.getAccessToken(),accessToken.getExpireTime().toLocalDateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
}
}
针对微信接口调用,提供了前后置处理,分别是ApiPreProcessor
和ApiAfterProcessor
,对应了方法void doProcessor(URLBuilder builder)
和void doProcessor(URLBuilder builder, APIResult result)
。目前并没有做微信接口的异常处理,因为一般这里只有http请求的异常。
现在默认使用的前置处理不做任何事情。默认使用的后置处理是AutoRefreshProcessor
。当识别到接口调用失败,且为access_token相关错误时,会自动去调用获取access_token的接口,并完成token刷新。建议自定义后置增强时,继承AutoRefreshProcessor
并在void process(URLBuilder builder,APIResult result)
中实现自定义后置处理方法。
DefaultHandler 默认消息处理器
默认处理逻辑:
default void doHandler(ReceiveMsg msg, HttpServletResponse response){
SendMsg sendMsg=new SendMsg(msg);
sendMsg.setMsgType(MsgType.TEXT.getType());
sendMsg.setContent("服务开发中~请耐心等候哦~");
XMLUtil.writeXmlToResponse(sendMsg,SendMsg.class,response);//转xml格式并写入实体
}
若要自定义处理逻辑请继承并实现doHandler
方法,并完成配置,注意配置时要指明消息类型(MsgType)。
由于微信要求返回格式为XML类型,所以要注意将实体写入response时要转为xml格式。
自定义文字类型消息处理:
public class TextHandler implements DefaultHandler {
@Override
public void doHandler(ReceiveMsg msg, HttpServletResponse response) {
SendMsg sendMsg=new SendMsg(msg);
sendMsg.setContent("您好,欢迎关注本公众号!");
sendMsg.setMsgType(MsgType.TEXT.getType());
XMLUtil.writeXmlToResponse(sendMsg,SendMsg.class,response);
}
}
DefaultEventHandler 默认事件处理器
事件消息也是消息类型的一种,因为事件比较多且固定,所以事件类型单独拎出来处理。
根据想要处理的类型重写相应的方法(doSubscribe,doUnsubscribe...),并完成配置即可。
注意事件处理的doHandler方法是做方法转发用的,一般不进行重写。
DefaultExceptionHandler 默认异常处理器
public interface DefaultExceptionHandler {
default void handleException(ReceiveMsg msg, HttpServletResponse response, Exception ex){
SendMsg sendMsg=new SendMsg(msg);
sendMsg.setMsgType(MsgType.TEXT.getType());
sendMsg.setContent("微信公众号异常,请稍后再试");
XMLUtil.writeXmlToResponse(sendMsg,SendMsg.class,response);
}
}
由于消息处理用户自定义逻辑会比较多,所以做了异常处理。
自定义异常处理步骤:
1.自定义微信异常(也可以直接使用现有异常)
public class WeChatException extends Exception {
public WeChatException() {
}
public WeChatException(String message) {
super(message);
}
public WeChatException(String message, Throwable cause) {
super(message, cause);
}
public WeChatException(Throwable cause) {
super(cause);
}
}
2.在消息处理其中抛出异常
public class MyHandler implements DefaultHandler {
@Override
public void doHandler(ReceiveMsg msg, HttpServletResponse response) throws Exception{
throw new WeChatException();
}
}
3.自定义异常处理
public class MyExceptionHandler implements DefaultExceptionHandler {
@Override
public void handleException(ReceiveMsg msg, HttpServletResponse response, Exception ex) {
SendMsg sendMsg=new SendMsg(msg);
sendMsg.setMsgType(MsgType.TEXT.getType());
sendMsg.setContent("微信公众号出了自定义异常,请稍后重试");
XMLUtil.writeXmlToResponse(sendMsg,SendMsg.class,response);
}
}
4.在ConfigAdapter
中完成配置
@Override
public void config(){
WeChatContext.config()
.configMsgHandler()
.setHandler(new MyHandler(), MsgType.TEXT)
.setExceptionHandler(new MyExceptionHandler(), WeChatException.class);
}
获取access_token
创建自定义菜单
查询自定义菜单
删除自定义菜单
获取用户详情
获取关注者openid
获取所有模板信息
删除模板
发送模板消息
由于时间有限,目前只完成了一部分接口的支持,如果后续需要使用没有适配的接口,可以按照如下步骤完成接口配置:
1.在WeChatAPI
中完成api的基础配置
ACCESS_TOKEN("https://api.weixin.qq.com/cgi-bin/token?grant_type=%s&appid=%s&secret=%s",WeChatConstant.GET,"基础功能","ACCESS_TOKEN","grant_type&appid&secret", TokenJson.class);
//枚举变量(接口调用地址(参数记得换成%s),请求类型,所属模块,接口唯一标识(自定义,具有唯一性即可),参数集(使用&拼接),成功返回时的类)
2.在ApiExecuteCenter
中定义相应的方法
public <T> APIResult<T> accessToken(){
URLBuilder builder=new URLBuilder(WeChatAPI.ACCESS_TOKEN);//使用枚举变量创建URLBuilder
builder.setParam("grant_type","client_credential");//设置请求参数(access_token,secret,appid已经默认配,不需要额外设置)
//builder.setPostData(template,SendTemplate.class);//若为post请求,使用该方法设置请求体内容
return executor.executeProxy(builder,WeChatAPI.ACCESS_TOKEN.getResultClass());//调用请求方法 (URLBuilder,接口返回成功类)
}
两步操作即可完成一个简单get或post请求的配置
3.对于一些复杂请求,如需要传文件内容的接口,现在系统并没有做这样的处理,如果有这样的需求,最好也使用URLBuilder
做处理,方便集中处理。
若更改源码
1.在WeChatConstant.EventType
中添加相应的事件类型
2.在doHandler
中添加相应的支线
case WeChatConstant.EventType.TEMPLATESENDJOBFINISH:doTemplateSendFinish(msg, response);break;
3.添加相应的处理方法doXXX(ReceiveMsg msg, HttpServletResponse response)
4.在继承的类中完成方法实现
若不更改源码,则重写doHandler
方法,在doHandler
中添加相应的支线,这里直接使用字符串匹配。然后在加上对应方法即可。
在MsgType
中增加相应的类型即可。