Skip to content

Latest commit

 

History

History
224 lines (165 loc) · 12.3 KB

README.md

File metadata and controls

224 lines (165 loc) · 12.3 KB

wechat-works 企微微信模块

企业微信接入模块

企业微信模块
接入状态
实现类
用法
获取企微微信服务器IP地址 WeComServerService ServerServiceTest
基础 ↓
帐号ID WeComIDService WeComIDServiceTest
通讯录管理-成员管理 UserService UserServiceTest
通讯录管理-部门管理 DepartmentService DepartmentServiceTest
通讯录管理-标签管理 TagService TagServiceTest
通讯录管理-互联企业 LinkedCorpService LinkedCorpServiceTest
消息通知 WeComMessageHandler/
WeComMessageResolver,
WeComEventHandler/
WeComEventResolver
WeComMessageResolverTest
身份验证 AuthService AuthServiceTest
企业互联 CorpGroupService CorpGroupServiceTest
安全管理 SecurityService SecurityServiceTest
消息推送-应用发送消息到群聊会话 AppChatService AppChatServiceTest
群机器人 WebHookService WebHookServiceTest
应用管理 AgentService AgentServiceTest
应用管理-自定义菜单 MenuService MenuServiceTest
素材管理 MediaService MediaServiceTest

Service名称一般取自 API 第一个URL目录, 如

URL: https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&userid=USERID

Service: UserService

1.1 基本用法

  1. 创建Service对象

所有Service接口的的默认实现都是以DefaultXXXX开头的。如WeComServerService的实现类为DefaultWeComServerService

  String corpId = "", corpSecret = "";
  WeComConfig WeComConfig = new WeComConfig(corpId, corpSecret);
  DefaultWeComAccessTokenService weComAccessTokenService = new DefaultWeComAccessTokenService(WeComConfig);
  WeComServerService weComServerService = new DefaultWeComServerService(weComAccessTokenService);
  1. 通过Service A实例获取Service B的实例

如通过WeComServerService获取UserService实例

  • 方式一: 直接通过ofXXXX获取对应Service
UserService openApiService  = weComServerService.ofUserService();
  • 方式二: 通过<T extends WeChatService> T of(Class<T> toWeChatService)获取对应Service

toWeChatService为对应Service的实现类, 一般为DefaultXXXService

UserService openApiService  = weComServerService.of(DefaultUserService.class);

2. AccessToken 说明

// TODO xxx

AccessToken无需单独获取和指定,调用Api方法时,会自动获取并缓存AccessToken. AccessToken由WeComAccessTokenService维护,且缓存由WeChatTokenStorage维护。

2.1 access_token获取

  • 方式一: 使用WeComAccessTokenService获取token
String appId = "", appSecret = "";
WeComConfig weComConfig = new WeComConfig(appId, appSecret);
WeComAccessTokenService WeComAccessTokenService = new DefaultWeComAccessTokenService(weComConfig);
String token = WeComAccessTokenService.getToken();
  • 方式二: 使用Service实例获取token
String token = weComService.getToken();

2.2 access_token刷新

  • 方式一: 自动刷新

调用Api方法时,若收到微信40014:不合法的 access_token ,请开发者认真比对 access_token 的有效性(如是否过期),或查看是否正在为恰当的公众号调用接口 时,会自动重新请求AccessToken。

  • 方式二: 通过WeComAccessTokenService刷新AccessToken

刷新后会自动更新到缓存中。

weComAccessTokenService.tokenRefresh()
# 或
weComAccessTokenService.token(true)

2.3 access_token缓存

AccessToken缓存由WeChatTokenStorage维护,默认实现为DefaultLocalWeChatTokenStorage。 可在实例化WeComConfig时指定WeChatTokenStorage

  1. 默认缓存DefaultLocalWeChatTokenStorage

AccessToken缓存在当前Jvm中。

WeComConfig WeComConfig = new WeComConfig(appId, appSecret);
WeComAccessTokenService weComAccessTokenService = new DefaultWeComAccessTokenService(WeComConfig);
  1. 指定WeChatTokenStorage实现类

指定为Redis缓存实现类。

String redisAddress = "redis://127.0.0.1:6379";
Integer database = 0;

WeComConfig weComConfigWithRedis = new WeComConfig(appId, appSecret);
weComConfigWithRedis.setRedisConfig(WeChatRedisConfigFactory.newConfig(WeChatRedisConfig.ServerType.SingleServer, redisAddress, database));
RedisWeChatTokenStorage mpServerServiceWithRedisStorage = new RedisWeChatTokenStorage(WeComConfigWithRedis);
weComConfigWithRedis.setWeChatTokenStorage(mpServerServiceWithRedisStorage);
weComAccessTokenService = new DefaultWeComAccessTokenService(WeComConfigWithRedis);

3. 接口扩展

可通过继承AbstractWeComService类来快速接入微信公众号API, 并使用其中的post,get方法。 调用post,get方法时,可以指定是否需要AccessToken。

如:

public class DefaultWeComServerService extends AbstractWeComService implements WeComServerService {

    public DefaultWeComServerService(WeComConfig weChatConfig) {
        super(weChatConfig);
    }

    public DefaultWeComServerService(WeComAccessTokenService weComAccessTokenService) {
        super(weComAccessTokenService);
    }

    public DefaultWeComServerService(WeComAccessTokenService weComAccessTokenService, RequestFilterChain requestFilterChain) {
        super(weComAccessTokenService, requestFilterChain);
    }
}

4. 消息和事件

消息和事件 由 WeComMessageResolver 处理, 需先创建 WeComMessageResolver实例, 实现”消息处理器WeComMessageHandler<?>“、”事件处理器WeComEventHandler<?> “, 并将处理器添加到WeComMessageResolver中。

可参见wechat-platform/WeComServiceConfig.java

创建WeComMessageResolver并添加消息处理器

@Resource
private List<WeComMessageHandler<WeComMessage>> messageHandlers;
    
WeComMessageResolver weComMessageResolver = new WeComMessageResolver(weComService);
weComMessageResolver.addWeChatHandlers(messageHandlers);

4.1 消息

实现WeComMessageHandler<?>消息处理器, 并重写handle方法, ?为需要处理的具体消息类型。

可参见wechat-platform/MessageHandler.java

@Component("weComMessageHandler")
@Slf4j
public class MessageHandler implements WeComMessageHandler<WeComMessage> {
    @Override
    public WeComEchoMessage handle(WeComService service, WeComMessage message, MessageResolverContext context) {
        log.info("企业微信消息解析器: message: {}, context: {}", message, context);
        return WeComMessageHandler.super.handle(service, message, context);
    }
}

4.2 事件

实现WeComEventHandler<?>消息处理器, 并重写handle方法, ?为需要处理的具体事件类型。

可参见wechat-platform/EventHandler.java

@Component("weComEventHandler")
@Slf4j
public class EventHandler implements WeComEventHandler<WeComXmlEvent> {
    @Override
    public WeComEchoMessage handle(WeComService service, WeComXmlEvent event, MessageResolverContext context) {
        log.info("企业微信事件解析器: message: {}, context: {}", event, context);
        return WeComEventHandler.super.handle(service, event, context);
    }

}

附录

A. 企业微信官方文档

企业内部开发-服务端: https://developer.work.weixin.qq.com/document/path/90664