Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >jfinal-weixin是如何支持多公众号配置的

jfinal-weixin是如何支持多公众号配置的

原创
作者头像
Java旅途
修改于 2020-07-08 02:05:07
修改于 2020-07-08 02:05:07
8950
举报
文章被收录于专栏:Java旅途Java旅途

spring-boot-starter-weixin是jfinal-weixin的spring boot版本,以前一直在用jfinal-weixin做为开发工具包,也一直没有尝试过支持多公众号,最近正好有需求要求支持多公众号,就来研究一番它是如何支持多公众号的。

找到源码,打开后发现有个拦截器,我们看看拦截器做了什么。

微信后台如何配置来支持多公众号

在preHandle中有比较重要的几行代码,我们拿出来单独分析一下。

代码语言:txt
AI代码解释
复制
String appId = request.getParameter(weixinProperties.getAppIdKey());
代码语言:txt
AI代码解释
复制
// weixinProperties类
private String appIdKey = "appId"; 

这一行代码重要是获取参数的,也就是在我们微信后台配置开发者url的时候添加的参数,参数名是appId。

代码语言:txt
AI代码解释
复制
// 判断是否多公众号,将 appId 与当前线程绑定,以便在后续操作中方便获取ApiConfig对象:
Object bean = handlerMethod.getBean();
boolean isWx = bean instanceof MsgController;
String token;
if (isWx) {
    if (StringUtils.hasText(appId)) {
        ApiConfigKit.setThreadLocalAppId(appId);
        token = ApiConfigKit.getApiConfig(appId).getToken();
    } else {
        token = ApiConfigKit.getApiConfig().getToken();
    }
} else {
    token = WxaConfigKit.getWxaConfig().getToken();
}

这一段代码主要是根据微信后台传过来的appId来获取对应微信公众号的token,来跟微信后台传过来的token进行匹配。

公众号后台配置如下:

如何支持多公众号

在MsgInterceptor中有用到ApiConfigKit.getApiConfig(),我们打开这个类看一下,他具体做了什么工作。

代码语言:txt
AI代码解释
复制
public static ApiConfig getApiConfig(String appId) {
    log.debug("appId: " + appId);
    ApiConfig cfg = (ApiConfig)CFG_MAP.get(appId);
    if (cfg == null) {
        throw new IllegalStateException("需事先调用 ApiConfigKit.putApiConfig(apiConfig) 将 			  
             appId对应的 ApiConfig 对象存入,如JFinalConfig.afterJFinalStart()中调用, 才可以使用 			
             ApiConfigKit.getApiConfig() 系列方法");
    } else {
        return cfg;
    }
}

根据自定义的异常信息,我们知道如果想要使用getApiConfig(String appId),则必须先调用putApiConfig(apiConfig),将公众号信息存入。

代码语言:txt
AI代码解释
复制
@Configuration
@AllArgsConstructor
public class WeixinAppConfig implements SmartInitializingSingleton {
	private final DreamWeixinProperties weixinProperties;
	private final SpringAccessTokenCache accessTokenCache;

	@Override
	public void afterSingletonsInstantiated() {
		boolean isdev = weixinProperties.isDevMode();
		ApiConfigKit.setDevMode(isdev);
		ApiConfigKit.setAccessTokenCache(accessTokenCache);
		List<DreamWeixinProperties.ApiConfig> list = weixinProperties.getWxConfigs();
		for (DreamWeixinProperties.ApiConfig apiConfig : list) {
			ApiConfig config = new ApiConfig();
			if (StrKit.notBlank(apiConfig.getAppId())) {
				config.setAppId(apiConfig.getAppId());
			}
			if (StrKit.notBlank(apiConfig.getAppSecret())) {
				config.setAppSecret(apiConfig.getAppSecret());
			}
			if (StrKit.notBlank(apiConfig.getToken())) {
				config.setToken(apiConfig.getToken());
			}
			if (StrKit.notBlank(apiConfig.getEncodingAesKey())) {
				config.setEncodingAesKey(apiConfig.getEncodingAesKey());
			}
			config.setEncryptMessage(apiConfig.isMessageEncrypt());
			ApiConfigKit.putApiConfig(config);
		}
		// 省略小程序配置
	}
}
  • afterSingletonsInstantiated:当所有单例 bean 都初始化完成以后, 容器会回调该接口的方法

这个类的目的就是在项目启动后将配置文件中的微信公众号配置取出来,循环放入ApiConfigKit。

DreamWeixinProperties部分配置如下:

代码语言:txt
AI代码解释
复制
@Getter
@Setter
@ConfigurationProperties("dream.weixin")
public class DreamWeixinProperties {

	/**
	 * 拦截的路由,默认:/weixin/*
	 */
	private String urlPatterns = "/weixin/*";
	/**	
	 * 是否开发模式,默认:false
	 */
	private boolean devMode = false;
	/**
	 * 多公众号url挂参,默认:appId
	 */
	private String appIdKey = "appId";
	/**
	 * 多公众号配置
	 */
	private List<ApiConfig> wxConfigs = new ArrayList<>();

	@Getter
	@Setter
	public static class ApiConfig {
		private String token;
		private String appId;
		private String appSecret;
		private String encodingAesKey;
		// 消息加密与否
		private boolean messageEncrypt = false;
	}
}

数据库获取多公众号配置

我们一般需要来在平台管理公众号,因此从数据库获取公众号配置要远比配置文件获取更加方便,我们只需要实现SmartInitializingSingleton接口,将公众号配置改为从数据库获取就可以了。

代码语言:txt
AI代码解释
复制
@Configuration
@AllArgsConstructor
public class WxConfig implements SmartInitializingSingleton {

    private final SpringAccessTokenCache accessTokenCache;

    @Autowired
    private WexinNoDao wexinNoDao;
    @Override
    public void afterSingletonsInstantiated() {
        ApiConfigKit.setDevMode(true);
        ApiConfigKit.setAccessTokenCache(accessTokenCache);
        /**
         * 数据库查询
         */
        List<WeixinNoBean> list = wexinNoDao.wxNoList();
        for (WeixinNoBean apiConfig : list) {
            ApiConfig config = new ApiConfig();
            if (StrKit.notBlank(apiConfig.getAppid())) {
                config.setAppId(apiConfig.getAppid());
            }
            if (StrKit.notBlank(apiConfig.getAppKey())) {
                config.setAppSecret(apiConfig.getAppKey());
            }
            if (StrKit.notBlank(apiConfig.getToken())) {
                config.setToken(apiConfig.getToken());
            }
            if (StrKit.notBlank(apiConfig.getAeskey())) {
                config.setEncodingAesKey(apiConfig.getAeskey());
            }
            config.setEncryptMessage(false);
            ApiConfigKit.putApiConfig(config);
        }
    }
}

这样,当项目启动以后,就会调用我们自定义的WxConfig来完成多公众号的配置。数据库读取公众号配置比配置文件直接读取更加灵活。因此,我也是比较推荐直接从数据库来读取公众号配置的。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
jfinal-weixin自定义配置支持多公众号
spring-boot-starter-weixin是jfinal-weixin的spring boot版本,以前一直在用jfinal-weixin做为开发工具包,也一直没有尝试过支持多公众号,最近正好有需求要求支持多公众号,就来研究一番它是如何支持多公众号的。
Java旅途
2020/07/17
6560
jfinal-weixin自定义配置支持多公众号
微信公众号开发之如何使用JSSDK
使用JSSDK主要包括 1、判断当前客户端版本是否支持指定JS接口、 2、分享接口(微信认证) 3、图像接口 4、音频接口 5、智能接口(识别语音并返回结果) 6、设备信息(获取网络状态) 7、地理位置 8、界面操作 9、微信扫一扫 10、微信小店(服务号必须通过微信认证) 11、微信卡券 (微信认证) 12、微信支付(服务号必须通过微信认证)
Javen
2018/08/21
4.7K0
微信公众号开发之如何使用JSSDK
Java微信公众号开发框架-fastweixin
提供了基于springmvc以及基于servlet框架的控制器,集成了微信服务器绑定、监听所有类型消息的方法
4xx.me
2022/06/09
7100
牛掰!我是这么把博客粉丝转到公众号的
纯洁的微笑推荐了一篇文章,题目没有任何特色,叫做《我是怎么把博客粉丝转到公众号的》,但读完后,我震惊了——原来还有这种骚操作啊!
沉默王二
2019/09/24
4560
牛掰!我是这么把博客粉丝转到公众号的
spring-boot-route(二十三)开发微信公众号
在讲微信公众号开发之前,先来大概了解一下微信公众号。微信公众号大体上可以分为服务号和订阅号,订阅号和服务号的区别如下:
Java旅途
2020/10/23
6730
微信公众号开发之授权获取用户信息
测试号:找到 网页授权获取用户基本信息>点击修改>设置域名 服务号:找到 开发>接口权限>网页授权获取用户基本信息>>点击修改>设置域名
Javen
2018/08/21
3.7K1
微信公众号开发之授权获取用户信息
微信公众号开发之如何一键导出微信所有用户信息到Excel
在getOpenIds(Stirng next_openid) 方法中迭代(一次拉取调用最多拉取10000个关注者的OpenID)获取所有的openId并返回一个List集合
Javen
2018/08/21
4.9K0
微信公众号开发之如何一键导出微信所有用户信息到Excel
微信公众号开发之自定义菜单
在Jfinal-weixin中有封装菜单的创建、查询、删除、以及个性化菜单的创建、查询、删除、测试个性化菜单匹配结果
Javen
2018/08/21
1.7K0
微信公众号开发之自定义菜单
微信一次性订阅消息
一次性订阅消息官方文档:消息管理>发送一次性订阅消息 开发者可以通过一次性订阅消息授权让微信用户授权第三方移动应用(接入说明)或公众号,获得发送一次订阅消息给到授权微信用户的机会。授权微信用户可以不
Javen
2018/08/21
1.3K0
微信一次性订阅消息
微信公众号开发之现金红包
在使用现金红包之前,请前往开通现金红包功能。操作路径:【登录微信支付商户平台——>产品中心——>现金红包——>开通】。
Javen
2018/08/21
4.1K0
微信公众号开发之现金红包
WxJava | weixin-java-mp组件核心源码剖析+access_token管理的最佳实践
在微信公众号管理平台建设中,主要涉及两个场景: 1、调微信API执行相关操作 2、接收微信的回调并执行相关操作。
烟雨平生
2023/11/07
4.8K0
WxJava | weixin-java-mp组件核心源码剖析+access_token管理的最佳实践
微信公众号发送模板消息 Java实现。
本博文是测试公众号调用模板接口测试。请不要完全复制我的代码。里面的测试代码中有本人测试号的微信模板id。麻烦替换成自己的可以吗? 第一步:创建模板信息 第二步:准备模板代码实体类用到的属性自行加入就行
小帅丶
2018/02/08
6K0
微信公众号发送模板消息 Java实现。
如何给网站添加微信扫描二维码登录功能
4、服务器1台。推荐:腾讯云服务器。如果不会建站,可参考《如何用云服务器搭建一个https的网站?》
云上云
2019/08/29
9.9K0
如何给网站添加微信扫描二维码登录功能
【公众号开发】java获取微信用户openId、基本资料全教程
准备工作: 配置微信公众号的appId及secret maven引入binarywang的微信开发包,利用开源代码 weixin-java-tools来开发效率很高,免去了很多繁琐的代码开发量; ---- appId及secret配置 weixin: appId: ************* secret: ***************** @Data @ConfigurationProperties(prefix = "weixin") public class WxPayProperti
Cheng_Blog
2022/02/25
2.8K0
公众号开发:获取用户消息和回复消息
最近在看微信公众号的开发文档,觉得很有意思,可以自定义开发一些功能,比如有人关注了公众号之后,你可以做出稍微复杂点的回复(简单的回复在公众号后台配置就好啦);比如关注者发送了「学习」消息,你可以给他推送一些文章,发送「天气」的消息,你可以回复当前的天气状况;还可以进行素材的管理,用户的管理等等。
Java技术编程
2020/06/10
5.9K0
公众号开发:获取用户消息和回复消息
微信公众号开发-自定义菜单接口
本文是 微信开发-素材/消息管理接口 的后续,主要介绍微信公众平台的自定义菜单接口开发。由于个人的订阅号是没有大多数接口的权限的,所以我们需要使用微信官方提供的测试号来进行开发。测试号的申请可参考下文:
端碗吹水
2020/09/23
2.7K0
微信公众号开发-自定义菜单接口
PC 微信扫码登陆
网站应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统。进一步了解OAuth2.0-----理解OAuth2.0 官方介绍资料
Javen
2018/08/21
4.8K0
PC 微信扫码登陆
微信公众号开发-素材/消息管理接口
本文是 微信公众号开发者模式介绍及接入 的后续,如没看过前文的话,可能看本文会有些懵逼。本文主要介绍微信公众平台的素材、消息管理接口的开发。由于个人的订阅号是没有大多数接口的权限的,所以我们需要使用微信官方提供的测试号来进行开发。测试号的申请可参考下文:
端碗吹水
2020/09/23
2.6K0
微信公众号开发-素材/消息管理接口
uniapp中实现h5扫码功能(优化版)
但是由于业务原因,需要将小程序转换成H5的方式,发现 uni.scanCode 方法不好用了。
taixingyiji
2022/09/21
3.4K0
uniapp中实现h5扫码功能(优化版)
TNW-授权获取用户信息
TNW: TypeScript(The) + Node.js(Next) + WeChat 微信公众号开发脚手架,支持任何 Node.js 的服务端框架(Express、Nest、egg 等)
Javen
2019/07/30
1.3K0
相关推荐
jfinal-weixin自定义配置支持多公众号
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档