一个简单的基于 Spring RestTemplate 封装的微信sdk
示例项目,基于spring-boot boot-dbm-sample 示例项目,基于jfish onetwo-wechat-sample
- JDK 1.8+
- Spring 4.0+
当前snapshot版本:4.7.4-SNAPSHOT
若使用snapshot版本,请添加snapshotRepository仓储:
<repository>
<id>oss</id>
<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
添加依赖:
<dependency>
<groupId>org.onetwo4j</groupId>
<artifactId>onetwo-wechat</artifactId>
<version>4.7.4-SNAPSHOT</version>
</dependency>
spring的依赖请自行添加。
在使用前需要在spring的下上文(properties或yaml文件)配置下面的属性:
wechat:
appid: 开发者ID
appsecret: 开发者密码
token: 令牌
encodingAESKey: 消息加解密密钥,如果不配置,请在微信后台配置使用明文的方式
如果只需要使用微信的客户端rest接口,只需要在spring配置类(即有@Configuration注解的类)上加上注解@EnableWechatClient 即可。
@EnableWechatClient
public class SpringContextConfig {
}
因为微信接口众多,目前只实现了少量接口。所以onetwo-wechat提供了一阵自定义实现微信客户端接口的方式。
未实现的接口可按下面的方式实现:
包约定:
- 根据微信模块建立相应的包,比如要实现菜单的接口,则创建对应的xxx.menu。
- 接口放在api子包下,即:xxx.menu.api
- 请求的vo放在request子包下,即:xxx.menu.request
- 响应的vo放在response子包下,即:xxx.menu.response
比如创建菜单接口 根据微信的创建菜单接口文档,其http请求地址为: https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN
对应接口代码如下:
@WechatApiClient(path="/menu")
public interface MenuService {
@PostMapping(value="/create", consumes=MediaType.APPLICATION_JSON_UTF8_VALUE)
@WechatRequestConfig(accessToken=true)
WechatResponse create(@RequestBody CreateMenuRequest createMenuRequest);
}
解释:
- 所有微信客户端接口必须使用@WechatApiClient注解标注为微信接口
- @WechatApiClient注解的path指定本接口下的所有方法的请求路径都是“/menu”的子路径
- @PostMapping是spring mvc的注解,本库利用了一些spring mvc的现成注解,@PostMapping(value="/create")标识这个方法是post请求,并且请求路径是/menu下的/create。因为https://api.weixin.qq.com/cgi-bin 是@EnableWechatClient默认已经设置了的,所以在编写接口的时候,只需要用相关注解设置/menu/create即可。因为微信的创建菜单接口接收的数据类型为json,所以consumes标记本次请求的requestBody会使用application/json的MediaType。
- @RequestBody 表示createMenuRequest参数将会作为请求的request body
- @WechatRequestConfig(accessToken=true)注解的意思是自动获取accessToken并附加到请求的url参数。
- CreateMenuRequest 是一个VO,表示请求内容,按照微信的文档编写即可。
- WechatResponse 是一个VO,表示响应内容,按照微信的文档编写即可,这里使用了onetwo-wechat自带的基类。
至此,一个微信rest客户端接口就编写完成了。
使用的时候,只需要直接把接口用spring的方式直接注入示例即可使用,如:
public class MenuServiceTest {
@Autowired
MenuService menuService;
@Test
public void testCreateMenu() throws IOException{
String classPath = "menu_create.json";
CreateMenuRequest request = ....;
WechatResponse res = menuService.create(request);
assertThat(res.isSuccess()).isTrue();
}
}
@EnableWechatClient 注解默认启用消息接收处理,如果不需要消息处理,可配置enableMessageServe属性为false。
@EnableWechatClient
public class SpringContextConfig {
}
onetwo-wechat会自动注册一系列服务,包括一个请求地址为“/serve”的Controller,所以你只需要在微信后台配置如下服务器地址: http://你的域名/serve
@Component
public class MessageHandlerRegister {
@Autowired
MessageRouterService messageRouterService;
@PostConstruct
public void init(){
this.messageRouterService.register(MessageType.TEXT, (TextMessage text)->{
return TextReplyMessage.builder()
.fromUserName(text.getToUserName())
.toUserName(text.getFromUserName())
.content("我收到你的消息啦~")
.build();
});
}
}
只需要在spring启动的时候,注入onetwo-wechat的MessageRouterService服务,并通过MessageRouterService的api注册相关类型的消息监听即可。 上面的示例会在收到消息后简单回复一条"我收到你的消息啦~"的信息。
4.7.3 版本增加了对企业微信的支持
因为企业微信需要对多个应用支持,所以在兼容以前微信配置方式的前提下,增加work-wechat前缀配置以支持企业微信的配置,其中每个企业培训app的配置项都和普通配置的配置方式一样,可以参考WechatConfig
work-wechat:
apps:
party:
appid: 企业微信cropid
appsecret: 应用秘钥
agentId: 应用id
encodingAESKey: aes加解密秘钥
token: 服务器验证token
oauth2:
errorInBrowser: false
redirectUri: oauth2跳转url,比如http://domian/api/uaa/login/oauth2
qrConnectRedirectUri: 扫码登录http://domian/api/uaa/login/qrConnect
内置实现了oauth2和扫码登录支持。 用户可以参考或者直接继承WorkLoginController实现业务登录流程。 比如如果是使用zifish框架,并基于jwt的登录,可以如下实现登录controller:
@RestController
@RequestMapping("/uaa/login")
public class LoginBffController extends WorkLoginController<JwtTokenInfo> {
@Autowired
private LoginService loginService;
@Override
protected JwtTokenInfo loginByWorkWechatUser(WorkUserLoginInfo workUserLoginInfo) {
return this.loginService.loginByWorkWechatUser(workUserLoginInfo);
}
}
WorkEventServeController已经封装了对企业微信消息通知的支持,用户引入依赖后,可以编写一个继承WorkEventServeController的controller即可,启动后可以从控制台的spring mvc的mapping信息中看到controller的路径,默认一般为:/workEventServe 全路径一般为:http://domain.com/workEventServe/{appid} 其中appid为配置文件里对应的appid
注册回调处理器可以通过 MessageRouterService 服务,比如监听用户创建:
messageRouterService.register(ContactChangeTypes.CREATE_USER, ContactCreateUserMessage.class, msg -> {
// 处理业务……
return "";
});
如果是基于zifish的项目,使用了@EnableJFishBootExtension 注解激活扩展,会自动注册拦截器。 使用的时候,通过@Interceptor注解把扩展拦截器标注在需要拦截的Controller即可:
@RestController
@Interceptor(WechatOAuth2MvcInterceptor.class)
public class TestController extends AbstractBaseController{
@Autowired
private WechatUserStoreService sessionStoreService;
@GetMapping("/test")
public Object test(HttpServletRequest request){
OAuth2UserInfo userInfo = sessionStoreService.getCurrentUser(request).get();
return userInfo;
}
}
如果是基于普通的spring mvc或boot的项目,则需要激活@EnableWechatClient注解的enableOAuth2Interceptor属性。
@EnableWechatClient(enableOAuth2Interceptor=true)
public class SpringContextConfig {
}
激活此属性后,onetwo-wechat会自动注册拦截器,拦截器url可通过配置文件wechat.oauth2.intercept.urls属性配置,默认为空,即拦截所有请求。
配置wechat.qcloud.live.enabled=true激活腾讯云的直播支持
wechat:
qcloud:
live:
enabled: true
bizId:
pushSafeKey:
callback:
enabled: true
path: # 默认为:callback
使用注解@LiveMessageListener 和@Subscribe 可以监听腾讯云的事件消息通知,详细事件见: https://cloud.tencent.com/document/api/267/5957 目前一共有三种消息:
- PushMessage :推流 断流
- RecordingMessage :新录制文件
- ScreenShotMessage:新截图文件
@LiveMessageListener
public class PushMessageListener {
@Subscribe
public void onMessage(PushMessage message) {
if(message.isPushEvent()){
System.out.println("有人来直播了!!!");
}else{
System.out.println("有人关闭了直播");
}
}
}