Skip to content

Commit

Permalink
🆕 #2423 【企业微信】新增企业微信 Spring Boot Starter
Browse files Browse the repository at this point in the history
  • Loading branch information
foreveryang321 authored Dec 6, 2021
1 parent 05ea881 commit e3fc624
Show file tree
Hide file tree
Showing 9 changed files with 318 additions and 0 deletions.
1 change: 1 addition & 0 deletions spring-boot-starters/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
<module>wx-java-pay-spring-boot-starter</module>
<module>wx-java-open-spring-boot-starter</module>
<module>wx-java-qidian-spring-boot-starter</module>
<module>wx-java-cp-spring-boot-starter</module>
</modules>

<dependencies>
Expand Down
45 changes: 45 additions & 0 deletions spring-boot-starters/wx-java-cp-spring-boot-starter/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>wx-java-spring-boot-starters</artifactId>
<groupId>com.github.binarywang</groupId>
<version>4.2.1.B</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>wx-java-cp-spring-boot-starter</artifactId>
<name>WxJava - Spring Boot Starter for WxCp</name>
<description>微信企业号开发的 Spring Boot Starter</description>

<dependencies>
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-cp</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring.boot.version}</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.2.1</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.binarywang.spring.starter.wxjava.cp.config;

import com.binarywang.spring.starter.wxjava.cp.properties.WxCpProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

/**
* 企业微信自动注册
*
* @author yl
* @date 2021/12/6
*/
@Configuration
@EnableConfigurationProperties(WxCpProperties.class)
@Import({
WxCpStorageAutoConfiguration.class,
WxCpServiceAutoConfiguration.class
})
public class WxCpAutoConfiguration {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.binarywang.spring.starter.wxjava.cp.config;

import com.binarywang.spring.starter.wxjava.cp.properties.WxCpProperties;
import lombok.RequiredArgsConstructor;
import me.chanjar.weixin.cp.api.WxCpService;
import me.chanjar.weixin.cp.api.impl.WxCpServiceImpl;
import me.chanjar.weixin.cp.config.WxCpConfigStorage;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
* 企业微信平台相关服务自动注册
*
* @author yl
* @date 2021/12/6
*/
@Configuration
@RequiredArgsConstructor
public class WxCpServiceAutoConfiguration {
private final WxCpProperties wxCpProperties;

@Bean
@ConditionalOnMissingBean
@ConditionalOnBean(WxCpConfigStorage.class)
public WxCpService wxCpService(WxCpConfigStorage wxCpConfigStorage) {
WxCpService wxCpService = new WxCpServiceImpl();
wxCpService.setWxCpConfigStorage(wxCpConfigStorage);

WxCpProperties.ConfigStorage storage = wxCpProperties.getConfigStorage();
int maxRetryTimes = storage.getMaxRetryTimes();
if (maxRetryTimes < 0) {
maxRetryTimes = 0;
}
int retrySleepMillis = storage.getRetrySleepMillis();
if (retrySleepMillis < 0) {
retrySleepMillis = 1000;
}
wxCpService.setRetrySleepMillis(retrySleepMillis);
wxCpService.setMaxRetryTimes(maxRetryTimes);
return wxCpService;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.binarywang.spring.starter.wxjava.cp.config;

import com.binarywang.spring.starter.wxjava.cp.storage.WxCpInMemoryConfigStorageConfiguration;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

/**
* 企业微信存储策略自动配置
*
* @author yl
* @date 2021/12/6
*/
@Configuration
@Import({
WxCpInMemoryConfigStorageConfiguration.class
})
public class WxCpStorageAutoConfiguration {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
package com.binarywang.spring.starter.wxjava.cp.properties;

import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.io.Serializable;

/**
* 企业微信接入相关配置属性
*
* @author yl
* @date 2021/12/6
*/
@Data
@NoArgsConstructor
@ConfigurationProperties(prefix = WxCpProperties.PREFIX)
public class WxCpProperties {
public static final String PREFIX = "wx.cp";

/**
* 微信企业号 corpId
*/
private String corpId;
/**
* 微信企业号 corpSecret
*/
private String corpSecret;
/**
* 微信企业号应用 token
*/
private String token;
/**
* 微信企业号应用 ID
*/
private Integer agentId;
/**
* 微信企业号应用 EncodingAESKey
*/
private String aesKey;

/**
* 配置存储策略,默认内存
*/
private ConfigStorage configStorage = new ConfigStorage();

@Data
@NoArgsConstructor
public static class ConfigStorage implements Serializable {
private static final long serialVersionUID = 4815731027000065434L;
/**
* 存储类型
*/
private StorageType type = StorageType.memory;

/**
* http代理主机
*/
private String httpProxyHost;

/**
* http代理端口
*/
private Integer httpProxyPort;

/**
* http代理用户名
*/
private String httpProxyUsername;

/**
* http代理密码
*/
private String httpProxyPassword;

/**
* http 请求最大重试次数
* <pre>
* {@link me.chanjar.weixin.cp.api.WxCpService#setMaxRetryTimes(int)}
* {@link me.chanjar.weixin.cp.api.impl.BaseWxCpServiceImpl#setMaxRetryTimes(int)}
* </pre>
*/
private int maxRetryTimes = 5;

/**
* http 请求重试间隔
* <pre>
* {@link me.chanjar.weixin.cp.api.WxCpService#setRetrySleepMillis(int)}
* {@link me.chanjar.weixin.cp.api.impl.BaseWxCpServiceImpl#setRetrySleepMillis(int)}
* </pre>
*/
private int retrySleepMillis = 1000;
}

public enum StorageType {
/**
* 内存
*/
memory
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package com.binarywang.spring.starter.wxjava.cp.storage;

import com.binarywang.spring.starter.wxjava.cp.properties.WxCpProperties;
import me.chanjar.weixin.cp.config.impl.WxCpDefaultConfigImpl;
import org.apache.commons.lang3.StringUtils;

/**
* WxCpConfigStorage 抽象配置类
*
* @author yl
* @date 2021/12/6
*/
public abstract class AbstractWxCpConfigStorageConfiguration {

protected WxCpDefaultConfigImpl config(WxCpDefaultConfigImpl config, WxCpProperties properties) {
String corpId = properties.getCorpId();
String corpSecret = properties.getCorpSecret();
String token = properties.getToken();
Integer agentId = properties.getAgentId();
String aesKey = properties.getAesKey();

config.setCorpId(corpId);
config.setCorpSecret(corpSecret);
if (StringUtils.isNotBlank(token)) {
config.setToken(token);
}
if (agentId != null) {
config.setAgentId(agentId);
}
if (StringUtils.isNotBlank(aesKey)) {
config.setAesKey(aesKey);
}

WxCpProperties.ConfigStorage storage = properties.getConfigStorage();
String httpProxyHost = storage.getHttpProxyHost();
Integer httpProxyPort = storage.getHttpProxyPort();
String httpProxyUsername = storage.getHttpProxyUsername();
String httpProxyPassword = storage.getHttpProxyPassword();
if (StringUtils.isNotBlank(httpProxyHost)) {
config.setHttpProxyHost(httpProxyHost);
if (httpProxyPort != null) {
config.setHttpProxyPort(httpProxyPort);
}
if (StringUtils.isNotBlank(httpProxyUsername)) {
config.setHttpProxyUsername(httpProxyUsername);
}
if (StringUtils.isNotBlank(httpProxyPassword)) {
config.setHttpProxyPassword(httpProxyPassword);
}
}
return config;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.binarywang.spring.starter.wxjava.cp.storage;

import com.binarywang.spring.starter.wxjava.cp.properties.WxCpProperties;
import lombok.RequiredArgsConstructor;
import me.chanjar.weixin.cp.config.WxCpConfigStorage;
import me.chanjar.weixin.cp.config.impl.WxCpDefaultConfigImpl;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
* 自动装配基于内存策略配置
*
* @author yl
* @date 2021/12/6
*/
@Configuration
@ConditionalOnProperty(
prefix = WxCpProperties.PREFIX + ".config-storage", name = "type",
matchIfMissing = true, havingValue = "memory"
)
@RequiredArgsConstructor
public class WxCpInMemoryConfigStorageConfiguration extends AbstractWxCpConfigStorageConfiguration {
private final WxCpProperties wxCpProperties;

@Bean
@ConditionalOnMissingBean(WxCpConfigStorage.class)
public WxCpConfigStorage wxCpConfigStorage() {
WxCpDefaultConfigImpl config = new WxCpDefaultConfigImpl();
return this.config(config, wxCpProperties);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.binarywang.spring.starter.wxjava.cp.config.WxCpAutoConfiguration

0 comments on commit e3fc624

Please sign in to comment.