尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

WxJava 企业微信 Solon 插件 wx-java-cp-solon-plugin 快速接入与自动装配指南

WxJava 企业微信 Solon 插件 wx-java-cp-solon-plugin 快速接入与自动装配指南 WxJava 企业微信 Solon 插件 wx-java-cp-solon-plugin 快速接入与自动装配指南【免费下载链接】WxJava微信开发 Java SDK 支持包括微信支付开放平台小程序企业微信视频号公众号等的后端开发项目地址: https://gitcode.com/gh_mirrors/wx/WxJava本篇技术指南围绕 WxJava 仓库中 solon-plugins/wx-java-cp-solon-plugin 官方 README 展开系统讲解如何在 Solon 框架应用中引入该插件、通过wx.cp.*配置项完成企业微信企业号接入以及插件内部基于条件装配实现WxCpService、WxCpConfigStorage自动注入的完整原理。读者读完本文后将掌握从依赖引入、参数配置到存储策略切换、Bean 覆盖的全部实战方案并能结合源码理解其底层工作方式。一、插件是什么Solon 生态下的企业微信自动装配wx-java-cp-solon-plugin是 WxJava 官方为 Solon 框架提供的企业微信接入插件其模块描述为 WxJava - Solon Plugin for WxCp / 微信企业号开发的 Solon Plugin见 pom.xml。它基于 Solon 的 IoC/AOP 容器能力将底层weixin-java-cp模块中繁琐的手动初始化工作收敛为「引入依赖 编写配置」两步底层依赖插件直接依赖com.github.binarywang:weixin-java-cp版本与父工程保持一致核心 API 全部来自me.chanjar.weixin.cp包自动装配通过WxCpPluginImpl实现org.noear.solon.core.Plugin接口在 Solon 应用启动时自动注册配置属性类、服务自动配置类和多种存储策略配置类技术栈工程基于 Solon 3.2.0 构建见 solon-plugins/pom.xml与仓库中 mp、miniapp、pay、open、channel 等 Solon 插件并列统一收口在wx-java-solon-plugins聚合工程下。在 WxJava 仓库中企业微信相关的 Solon 插件共有两个单租户版wx-java-cp-solon-plugin本文主角与多租户版wx-java-cp-multi-solon-pluginsolon-plugins/wx-java-cp-multi-solon-plugin。若你的应用需要同时对接多个企业微信账号可参考多租户版本单个账号场景下本文的插件即是开箱即用的最小方案。二、快速开始三步接入企业微信官方 README 给出了完整的快速开始流程核心只有三步引入依赖、添加配置、注入使用。1. 引入依赖在 Solon 应用的pom.xml中加入以下依赖dependency groupIdcom.github.binarywang/groupId artifactIdwx-java-cp-solon-plugin/artifactId version${version}/version /dependency其中${version}替换为当前仓库发布版本仓库根 pom.xml 及插件 pom.xml 中使用的父版本为4.8.6.B请以你实际引入的 WxJava 发布版本为准。插件本身已传递依赖weixin-java-cp同时声明了jedis与redisson依赖用于支撑下文介绍的 Redis 存储策略。2. 添加配置app.properties在 Solon 应用的app.properties或application.properties中写入企业微信配置。官方 README 的完整配置模板如下# 企业微信号配置(必填) wx.cp.corp-id corp-id wx.cp.corp-secret corp-secret # 选填 wx.cp.agent-id agent-id wx.cp.token token wx.cp.aes-key aes-key wx.cp.msg-audit-priKey msg-audit-priKey wx.cp.msg-audit-lib-path msg-audit-lib-path # ConfigStorage 配置选填 wx.cp.config-storage.typememory # 配置类型: memory(默认), jedis, redisson, redistemplate # http 客户端配置选填 wx.cp.config-storage.http-proxy-host wx.cp.config-storage.http-proxy-port wx.cp.config-storage.http-proxy-username wx.cp.config-storage.http-proxy-password # 最大重试次数默认5 次如果小于 0则为 0 wx.cp.config-storage.max-retry-times5 # 重试时间间隔步进默认1000 毫秒如果小于 0则为 1000 wx.cp.config-storage.retry-sleep-millis10003. 注入并使用配置完成后插件支持自动注入以下两种类型me.chanjar.weixin.cp.api.WxCpService企业微信服务门面聚合了通讯录、消息、素材、OAuth2、会话存档等各类 APIme.chanjar.weixin.cp.config.WxCpConfigStorage配置存储接口保存 corpId、corpSecret、token、aesKey 及 access_token 缓存等运行时状态。在任意 Solon 管理的类中直接注入即可使用import me.chanjar.weixin.cp.api.WxCpService; import org.noear.solon.annotation.Inject; public class WxCpUsage { Inject private WxCpService wxCpService; public void demo() throws Exception { // 例如获取企业微信 access_token String accessToken wxCpService.getAccessToken(); } }三、配置项详解从 README 到源码实现插件所有配置统一以wx.cp为前缀源码中由WxCpProperties.PREFIX wx.cp常量定义通过Configuration Inject(${wx.cp})绑定到 WxCpProperties.java。下面按类别逐一展开。3.1 企业微信账号配置配置项必填说明绑定字段wx.cp.corp-id是企业 ID微信企业号 corpIdcorpIdwx.cp.corp-secret是应用的凭证密钥corpSecretcorpSecretwx.cp.agent-id否应用 AgentId整数类型agentIdwx.cp.token否用于回调消息验证的 Tokentokenwx.cp.aes-key否回调消息加解密使用的 EncodingAESKeyaesKeywx.cp.msg-audit-priKey否会话存档消息审计私钥msgAuditPriKeywx.cp.msg-audit-lib-path否会话存档加密类库so/dll路径msgAuditLibPath其中corpId与corpSecret为必填项。其余字段在配置存储初始化时按需写入以 AbstractWxCpConfigStorageConfiguration.java 的config(...)方法为例corpId、corpSecret、agentId直接赋值而token、aesKey、msgAuditPriKey、msgAuditLibPath均通过StringUtils.isNotBlank(...)判空后再设置——也就是说未配置的选填项不会污染底层WxCpDefaultConfigImpl的默认状态。会话存档相关配置最终透传至me.chanjar.weixin.cp.config.impl.WxCpDefaultConfigImpl的msgAuditPriKey/msgAuditLibPath字段供企业微信「会话存档」接口消息审计使用。3.2 ConfigStorage 配置存储策略配置项默认值说明wx.cp.config-storage.typememory配置存储类型memory默认、jedis、redisson、redistemplatewx.cp.config-storage.key-prefixwx:cpRedis 模式下 access_token 等缓存的 key 前缀wx.cp.config-storage.http-proxy-host空HTTP 代理主机wx.cp.config-storage.http-proxy-port空HTTP 代理端口wx.cp.config-storage.http-proxy-username空HTTP 代理用户名wx.cp.config-storage.http-proxy-password空HTTP 代理密码wx.cp.config-storage.max-retry-times5HTTP 请求最大重试次数若小于 0 则按 0 处理wx.cp.config-storage.retry-sleep-millis1000重试时间间隔毫秒若小于 0 则按 1000 处理存储类型枚举StorageType定义于 WxCpProperties.java包含memory、jedis、redisson、redistemplate四种。需要说明的是本插件源码中实际注册的自动装配类覆盖memory、jedis、redisson三种详见下文第四节redistemplate虽在枚举中预留但未内置对应装配类若需要可自定义WxCpConfigStorageBean 覆盖见第四节「覆盖自动配置」。重试参数在 WxCpServiceAutoConfiguration.java 中被显式归一化maxRetryTimes 0时强制为 0retrySleepMillis 0时强制为 1000与 README 中的描述完全一致。这两个参数最终通过wxCpService.setMaxRetryTimes(...)与wxCpService.setRetrySleepMillis(...)写入WxCpService对应底层me.chanjar.weixin.cp.api.impl.BaseWxCpServiceImpl的 HTTP 请求重试机制。HTTP 代理四项配置同样在AbstractWxCpConfigStorageConfiguration.config(...)中处理仅当httpProxyHost非空时才会设置代理端口、用户名、密码避免空值覆盖底层默认行为。3.3 Redis 连接配置jedis / redisson 场景当存储类型选择jedis或redisson时可通过wx.cp.config-storage.redis.*配置 Redis 连接参数对应源码 WxCpRedisProperties.java配置项默认值说明wx.cp.config-storage.redis.host空Redis 主机地址未配置时回退到容器内已有的JedisPool/RedissonClientBeanwx.cp.config-storage.redis.port6379Redis 端口wx.cp.config-storage.redis.password空Redis 密码wx.cp.config-storage.redis.timeout2000连接超时毫秒wx.cp.config-storage.redis.database0Redis 数据库编号wx.cp.config-storage.redis.max-active空Jedis 连接池最大活跃连接数映射maxTotalwx.cp.config-storage.redis.max-idle空Jedis 连接池最大空闲连接数wx.cp.config-storage.redis.max-wait-millis空Jedis 连接池最大等待毫秒数wx.cp.config-storage.redis.min-idle空Jedis 连接池最小空闲连接数实际使用中按需配置即可例如wx.cp.config-storage.typejedis wx.cp.config-storage.key-prefixwx:cp wx.cp.config-storage.redis.host127.0.0.1 wx.cp.config-storage.redis.port6379 wx.cp.config-storage.redis.passwordyour-redis-password wx.cp.config-storage.redis.database0四、自动装配原理从启动到 Bean 就绪README 中「支持自动注入」与「覆盖自动配置」两句话背后是 Solon 插件机制 条件注解的组合。下面按启动链路拆解。4.1 插件入口WxCpPluginImpl插件通过META-INF的 Solon SPI 机制被容器识别入口为 WxCpPluginImpl.java。其start(AppContext context)方法依次完成四件事context.beanMake(WxCpProperties.class); // 1. 注册配置属性类 context.beanMake(WxCpServiceAutoConfiguration.class); // 2. 注册服务自动配置类 context.beanMake(WxCpInMemoryConfigStorageConfiguration.class); // 3. 注册内存存储配置 context.beanMake(WxCpInJedisConfigStorageConfiguration.class); // 4. 注册 jedis 存储配置 context.beanMake(WxCpInRedissonConfigStorageConfiguration.class);// 5. 注册 redisson 存储配置这也印证了 3.2 节「redistemplate 未内置装配类」的推断插件启动时只注册了三种存储策略的配置类。4.2 服务装配WxCpServiceAutoConfigurationWxCpServiceAutoConfiguration.java 负责组装WxCpServiceBean Condition(onMissingBean WxCpService.class, onBean WxCpConfigStorage.class) public WxCpService wxCpService(WxCpConfigStorage wxCpConfigStorage) { WxCpService wxCpService new WxCpServiceImpl(); wxCpService.setWxCpConfigStorage(wxCpConfigStorage); // ... 归一化 maxRetryTimes 与 retrySleepMillis 并写入服务 return wxCpService; }关键点有二onBean WxCpConfigStorage.class只有在容器中已存在配置存储 Bean 时才创建服务保证WxCpService始终拿到可用的WxCpConfigStorageonMissingBean WxCpService.class如果用户已自定义了WxCpServiceBean则自动装配的实例不会生效实现「自定义优先」。4.3 存储装配memory / jedis / redisson 三策略三种存储配置类均继承AbstractWxCpConfigStorageConfiguration通过Condition按配置项与类路径动态激活存储类型装配类激活条件底层实现memoryWxCpInMemoryConfigStorageConfiguration.javawx.cp.config-storage.type默认memoryWxCpDefaultConfigImpljedisWxCpInJedisConfigStorageConfiguration.javatypejedis且 classpath 存在JedisPoolWxCpJedisConfigImplredissonWxCpInRedissonConfigStorageConfiguration.javatyperedisson且 classpath 存在RedissonWxCpRedissonConfigImpl以memory为例其条件写法为onProperty ${wx.cp.configStorage.type:memory} memory即未配置时默认走内存策略jedis/redisson则额外要求对应客户端类在 classpath 中插件 pom 已声明 jedis 与 redisson 依赖。三种策略的 Bean 方法都带有Condition(onMissingBean WxCpConfigStorage.class)这意味着用户只要自己定义了一个WxCpConfigStorageBean插件内部的存储配置即全部让位不再重复创建。jedis与redisson的客户端获取逻辑遵循同一优先级先看wx.cp.config-storage.redis.host是否配置——若配置了则由插件根据 Redis 参数自建JedisPoolWxCpInJedisConfigStorageConfiguration.java含连接池testOnBorrowtrue、testWhileIdletrue等默认行为或RedissonClientWxCpInRedissonConfigStorageConfiguration.java单机模式redis://host:portNIO 传输模式若未配置 host则回退到容器中已存在的JedisPool/RedissonClientBean方便复用应用自身的 Redis 连接管理。4.4 覆盖自动配置自定义 Bean 优先README 明确「自定义注入的 bean 会覆盖自动注入的」。覆盖范围包括两类WxCpService自定义WxCpServiceBean 后WxCpServiceAutoConfiguration因onMissingBean条件不满足而不再创建默认实例WxCpConfigStorage自定义WxCpConfigStorageBean 后三种存储配置类的onMissingBean条件均不满足插件不再自动创建存储。典型场景是自定义存储实现如接入数据库或自研缓存或需要微调底层WxCpDefaultConfigImpl行为import me.chanjar.weixin.cp.config.impl.WxCpDefaultConfigImpl; import org.noear.solon.annotation.Bean; import org.noear.solon.annotation.Configuration; import org.noear.solon.annotation.Inject; Configuration public class CustomWxCpConfig { Bean public WxCpConfigStorage wxCpConfigStorage(Inject(${wx.cp}) WxCpProperties properties) { WxCpDefaultConfigImpl config new WxCpDefaultConfigImpl(); config.setCorpId(properties.getCorpId()); config.setCorpSecret(properties.getCorpSecret()); // ... 按需补充其他字段 return config; } }五、验证与相关资源插件自带一个基于solon-test的加载冒烟测试 LoadTest.java通过SolonTest启动应用上下文用于验证插件能够被正常加载装配。插件完整源码solon-plugins/wx-java-cp-solon-plugin配置属性定义WxCpProperties.java服务自动装配WxCpServiceAutoConfiguration.java存储装配基类AbstractWxCpConfigStorageConfiguration.java多租户多企业号版本solon-plugins/wx-java-cp-multi-solon-plugin底层企业微信 SDK 核心模块weixin-java-cp结语wx-java-cp-solon-plugin把企业微信接入的样板代码压缩到了极致一个依赖、一份配置Solon 应用即可获得开箱即用的WxCpService与WxCpConfigStorage而「配置属性 → 条件装配 → 存储策略 → 自定义覆盖」的完整链路在源码中清晰可循便于在遇到多租户、多存储或代理等复杂需求时精准定位与二次定制。理解本文的配置项与装配条件后你便能在 Solon 应用中稳定、可维护地驾驭 WxJava 的企业微信能力。【免费下载链接】WxJava微信开发 Java SDK 支持包括微信支付开放平台小程序企业微信视频号公众号等的后端开发项目地址: https://gitcode.com/gh_mirrors/wx/WxJava创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表