Solon 插件 wx-java-mp-multi-solon-plugin 使用指南)
后端【免费下载链接】WxJava微信开发 Java SDK支持微信支付、开放平台、公众号、视频号、企业微信、小程序等的后端开发记得关注公众号及时接受版本更新信息以及加入微信群进行深入讨论项目地址https://gitcode.com/binary/WxJava点击查看免费下载导读本文围绕 WxJava 仓库中的 Solon 插件 wx-java-mp-multi-solon-plugin 展开讲解如何在一个 Solon 应用中同时接入多个微信公众号多租户/多账号并分别管理各自的WxMpService。读完本文你将掌握该插件的依赖引入、app.properties全量参数配置、WxMpMultiServices注入与按 tenantId 取用服务实例的完整流程并了解其底层基于 SolonConfiguration/Condition的自动装配原理与存储策略切换机制。一、插件定位与适用场景wx-java-mp-multi-solon-plugin是 WxJava 针对 Solon。与之相对的 wx-java-mp-solon-plugin 只支持单公众号配置wx.mp.app-id等扁平键而本插件将配置结构升级为wx.mp.apps.tenantId.*的分租户结构适合以下场景一个后端服务同时为多个公众号提供接口服务多租户 SaaS按租户隔离微信公众号的 AppID、Secret、Token、AESKey运行时按tenantId动态取用或移除某个公众号的WxMpService实例。从源码结构看mp_multi 目录插件内部由properties配置绑定、configuration/services存储与 Service 装配、service多实例容器、integrationSolon 插件入口四层组成。二、快速开始1. 引入 Maven 依赖在项目的pom.xml中加入版本号按你使用的 WxJava 版本填写当前仓库父工程版本为4.8.6.B见 pom.xmldependency groupIdcom.github.binarywang/groupId artifactIdwx-java-mp-multi-solon-plugin/artifactId version${version}/version /dependency2. 添加配置app.properties这是插件自动装配的唯一数据来源完整配置如下默认值以源码 WxMpMultiProperties.java 为准# 公众号配置 ## 应用 1 配置(必填) wx.mp.apps.tenantId1.app-idappId wx.mp.apps.tenantId1.app-secretsecret ## 选填 wx.mp.apps.tenantId1.tokentoken wx.mp.apps.tenantId1.aes-keyaesKey wx.mp.apps.tenantId1.use-stable-access-tokenuseStableAccessToken ## 应用 2 配置(必填) wx.mp.apps.tenantId2.app-idappId wx.mp.apps.tenantId2.app-secret secret ## 选填 wx.mp.apps.tenantId2.tokentoken wx.mp.apps.tenantId2.aes-keyaesKey wx.mp.apps.tenantId2.use-stable-access-tokenuseStableAccessToken # ConfigStorage 配置选填 ## 配置类型: memory(默认), jedis, redisson, redis_template wx.mp.config-storage.typememory ## 相关 redis 前缀配置: wx:mp:multi(默认) wx.mp.config-storage.key-prefixwx:mp:multi wx.mp.config-storage.redis.host127.0.0.1 wx.mp.config-storage.redis.port6379 ## 单机和 sentinel 同时存在时优先使用 sentinel 配置 # wx.mp.config-storage.redis.sentinel-ips127.0.0.1:16379,127.0.0.1:26379 # wx.mp.config-storage.redis.sentinel-namemymaster # http 客户端配置选填 ## http客户端类型: http_client(默认), ok_http, jodd_http wx.mp.config-storage.http-client-typehttp_client wx.mp.config-storage.http-proxy-host wx.mp.config-storage.http-proxy-port wx.mp.config-storage.http-proxy-username wx.mp.config-storage.http-proxy-password ## 最大重试次数默认5 次如果小于 0则为 0 wx.mp.config-storage.max-retry-times5 ## 重试时间间隔步进默认1000 毫秒如果小于 0则为 1000 wx.mp.config-storage.retry-sleep-millis1000 # 公众号地址 host 配置 # wx.mp.hosts.api-hosthttp://proxy.com/ # wx.mp.hosts.open-hosthttp://proxy.com/ # wx.mp.hosts.mp-hosthttp://proxy.com/3. 自动注入的类型插件启动后会自动注册WxMpMultiProperties及三个存储策略配置类见 WxMpMultiPluginImpl.java并向容器提供可注入的 BeanWxMpMultiServices。插件入口通过META-INF/solon/wx-java-mp-multi-solon-plugin.properties中的solon.plugin...WxMpMultiPluginImpl与solon.plugin.priority10被 Solon 自动发现。4. 使用样例import com.binarywang.solon.wxjava.mp_multi.service.WxMpMultiServices; import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.api.WxMpUserService; import org.noear.solon.annotation.Component; import org.noear.solon.annotation.Inject; Component public class DemoService { Inject private WxMpMultiServices wxMpMultiServices; public void test() { // 应用 1 的 WxMpService WxMpService wxMpService1 wxMpMultiServices.getWxMpService(tenantId1); WxMpUserService userService1 wxMpService1.getUserService(); userService1.userInfo(xxx); // todo ... // 应用 2 的 WxMpService WxMpService wxMpService2 wxMpMultiServices.getWxMpService(tenantId2); WxMpUserService userService2 wxMpService2.getUserService(); userService2.userInfo(xxx); // todo ... // 应用 3 的 WxMpService WxMpService wxMpService3 wxMpMultiServices.getWxMpService(tenantId3); // 判断是否为空 if (wxMpService3 null) { // todo wxMpService3 为空请先配置 tenantId3 微信公众号应用参数 return; } WxMpUserService userService3 wxMpService3.getUserService(); userService3.userInfo(xxx); // todo ... } }注意tenantId必须与配置中的wx.mp.apps.后的键一一对应未配置的tenantId调用getWxMpService会返回null使用前建议判空见 WxMpMultiServicesImpl.java。三、配置项详解1. 多账号apps配置每个租户对应WxMpSingleProperties见 WxMpSingleProperties.java字段与含义如下配置键必填说明wx.mp.apps.tenantId.app-id是公众号 AppIDwx.mp.apps.tenantId.app-secret是公众号 AppSecretwx.mp.apps.tenantId.token否服务器配置校验 Tokenwx.mp.apps.tenantId.aes-key否消息加解密 EncodingAESKeywx.mp.apps.tenantId.use-stable-access-token否是否使用稳定版 Access Token默认false一个关键约束来自装配逻辑当配置了多个应用时插件会校验所有appId必须唯一否则抛出RuntimeException(请确保微信公众号配置 appId 的唯一性)。这一校验的目的是避免使用 Redis 缓存 token、ticket 时因 appId 相同而产生错乱见 AbstractWxMpConfiguration.java。2. ConfigStorage 存储策略配置配置前缀wx.mp.config-storage.*对应WxMpMultiProperties.ConfigStorage内部类配置键默认值说明wx.mp.config-storage.typememory存储类型memory、jedis、redisson、redis_templatewx.mp.config-storage.key-prefixwx:mp:multiRedis 缓存 key 前缀wx.mp.config-storage.redis.host127.0.0.1Redis 主机wx.mp.config-storage.redis.port6379Redis 端口wx.mp.config-storage.redis.password空Redis 密码源码支持wx.mp.config-storage.redis.timeout2000连接超时毫秒源码默认wx.mp.config-storage.redis.database0Redis 数据库编号源码默认wx.mp.config-storage.redis.sentinel-ips空Sentinel 节点列表如127.0.0.1:16379,127.0.0.1:26379wx.mp.config-storage.redis.sentinel-name空Sentinel 主节点名如mymaster补充说明Redis 相关字段定义于 WxMpMultiRedisProperties.java除上述字段外还预留了maxActive、maxIdle、maxWaitMillis、minIdle等连接池参数在 jedis 策略下生效。文档中注释「单机和 sentinel 同时存在时优先使用 sentinel 配置」但当前仓库中该插件尚未实现 sentinel 分支的装配逻辑实际生效的策略为memory、jedis、redisson三种redis_template枚举已定义但仓库内未见对应配置类可推断为预留能力。3. HTTP 客户端配置配置键默认值说明wx.mp.config-storage.http-client-typehttp_client客户端类型http_client、ok_http、jodd_http枚举中另有http_componentswx.mp.config-storage.http-proxy-host空HTTP 代理主机wx.mp.config-storage.http-proxy-port空HTTP 代理端口wx.mp.config-storage.http-proxy-username空代理用户名wx.mp.config-storage.http-proxy-password空代理密码wx.mp.config-storage.max-retry-times5最大重试次数小于 0 按 0 处理wx.mp.config-storage.retry-sleep-millis1000重试间隔步进毫秒小于 0 按 1000 处理注意README 注释写「默认 http_client」源码 WxMpMultiProperties.java 中HttpClientType字段实际默认值为HTTP_COMPONENTS且其枚举包含http_client、ok_http、jodd_http、http_components四种switch中四个分支分别创建WxMpServiceHttpClientImpl、WxMpServiceOkHttpImpl、WxMpServiceJoddHttpImpl、WxMpServiceHttpComponentsImpl见 AbstractWxMpConfiguration.java。若需使用非默认实现请对应引入okhttp/jodd-http依赖pom.xml中均以provided方式声明。4. 公众号 host 配置用于自定义微信 API 域名常用于内网代理场景wx.mp.hosts.api-hosthttp://proxy.com/ wx.mp.hosts.open-hosthttp://proxy.com/ wx.mp.hosts.mp-hosthttp://proxy.com/分别对应https://api.weixin.qq.com、https://open.weixin.qq.com、https://mp.weixin.qq.com的替换地址见 WxMpMultiProperties.java装配时通过WxMpHostConfig写入每个WxMpDefaultConfigImpl。四、源码级原理多账号装配流程插件装配的入口与核心逻辑集中在AbstractWxMpConfiguration.wxMpMultiServices()见 AbstractWxMpConfiguration.java整体流程如下读取wx.mp.apps映射tenantId - WxMpSingleProperties若为空记录 warn 日志并返回空的WxMpMultiServicesImpl若应用数大于 1校验 appId 唯一性重复则抛异常遍历每个租户创建对应存储策略的WxMpDefaultConfigImplwxMpConfigStorage抽象方法决定依次调用configApp填充 appId/secret/token/aesKey/稳定 token 开关、configHttp代理、configHost自定义域名按http-client-type创建对应的WxMpService实现设置重试参数最后services.addWxMpService(tenantId, wxMpService)存入ConcurrentHashMap。存储策略的自动选择由三个配置类通过Condition注解完成配置类生效条件WxMpInMemoryConfiguration.javawx.mp.configStorage.type为memory默认属性缺省时也匹配使用WxMpMapConfigImplWxMpInJedisConfiguration.javatypejedis且 classpath 存在JedisPool使用WxMpRedisConfigImpl底层JedisWxRedisOpsWxMpInRedissonConfiguration.javatyperedisson且 classpath 存在Redisson使用WxMpRedissonConfigImpl其中 jedis/redisson 策略若配置了redis.host则由插件自建连接池/客户端否则从AppContext获取容器中已注册的JedisPool/RedissonClientBean方便与业务方已有的 Redis 连接复用。三个配置类由 WxMpMultiPluginImpl.java 在start()阶段统一beanMake注册。WxMpMultiServicesImpl内部用ConcurrentHashMapString, WxMpService存放所有实例提供getWxMpService(tenantId)、addWxMpService、removeWxMpService三个操作见 WxMpMultiServicesImpl.java可安全用于并发环境下的按租户服务治理。五、多账号下的常见操作模式1. 判空获取与容错未配置的租户返回null业务层应判空后降级处理WxMpService wxMpService wxMpMultiServices.getWxMpService(tenantId3); if (wxMpService null) { // 该租户未配置走兜底逻辑 return; }2. 动态移除实例当某租户需要下线或配置变更时可调用wxMpMultiServices.removeWxMpService(tenantId1)从容器中移除对应实例该方法为接口 WxMpMultiServices.java 声明的能力。3. 与单公众号插件的选择如果业务只有单个公众号可直接使用 wx-java-mp-solon-plugin其配置更扁平wx.mp.app-id、wx.mp.secret等自动注入WxMpService与WxMpConfigStorage两个 Bean多账号场景则必须使用本插件通过WxMpMultiServices统一管理。六、测试与验证插件自带一个基于 Solon 的加载测试 LoadTest.javaSolonTestTest用于验证插件在 Solon 容器中可正常加载启动。测试资源 app.properties 中给出了双租户 memory 存储的示例配置可作为最小可运行配置的参考模板。仓库其余 Solon 插件如 cp、miniapp、channel、store 等多账号插件均采用相同的目录结构与装配模式可相互对照学习。七、总结wx-java-mp-multi-solon-plugin以「租户键 多存储策略 多 HTTP 客户端」的组合方式把多公众号管理收敛为一个可注入的WxMpMultiServicesBean配置文件即服务清单tenantId即路由键业务代码无需感知底层是哪个公众号、哪种存储、哪个 HTTP 客户端。理解其Condition装配分支与 appId 唯一性校验有助于在多租户生产环境中正确规划 Redis 缓存与账号配置避免 token/ticket 串用问题。赞分享后端【免费下载链接】WxJava微信开发 Java SDK支持微信支付、开放平台、公众号、视频号、企业微信、小程序等的后端开发记得关注公众号及时接受版本更新信息以及加入微信群进行深入讨论项目地址https://gitcode.com/binary/WxJava点击查看免费下载相关推荐WxJava 微信公众号多租户 Solon 插件实战wx-java-mp-multi-solon-plugin 多账号配置与使用指南WxJava 微信公众号多租户 Solon 插件实战wx java mp multi solon plugin 多账号配置与使用指南 本篇指南围绕 WxJav后端即时通讯WxJava 微信小店多账号多租户Solon 插件 wx-java-store-multi-solon-plugin 使用指南WxJava 微信小店多账号多租户Solon 插件 wx java store multi solon plugin 使用指南 本篇技术指南围绕 WxJav后端即时通讯WxJava 微信公众号开发 Solon 插件 wx-java-mp-solon-plugin 快速接入指南WxJava 微信公众号开发 Solon 插件 wx java mp solon plugin 快速接入指南 wx java mp solon plugin 是后端即时通讯上一篇MXNet 模型转 Apple CoreMLmxnet-to-coreml 转换工具完整实战指南下一篇FreeRouting 高级 PCB 自动布线工具使用指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考