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);//配置异常处理

token存储

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")));
    }

}

api增强

针对微信接口调用,提供了前后置处理,分别是ApiPreProcessorApiAfterProcessor,对应了方法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);
}

目前支持api

基础功能

获取access_token

菜单模块

创建自定义菜单

查询自定义菜单

删除自定义菜单

用户模块

获取用户详情

获取关注者openid

模板消息模块

获取所有模板信息

删除模板

发送模板消息

后续开发

增加api

由于时间有限,目前只完成了一部分接口的支持,如果后续需要使用没有适配的接口,可以按照如下步骤完成接口配置:

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中增加相应的类型即可。

⚠️ **GitHub.com Fallback** ⚠️