Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions pom.xml
Original file line numberDiff line numberDiff line change
Expand Up@@ -126,6 +126,7 @@
<module>weixin-java-qidian</module>
<module>weixin-java-channel</module>
<module>spring-boot-starters</module>
<module>solon-plugins</module>
<!--module>weixin-java-osgi</module-->
</modules>

Expand Down
44 changes: 44 additions & 0 deletions solon-plugins/pom.xml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
<?xml version="1.0"?>
<project 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"
xmlns="http://maven.apache.org/POM/4.0.0">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.github.binarywang</groupId>
<artifactId>wx-java</artifactId>
<version>4.6.4.B</version>
</parent>
<packaging>pom</packaging>
<artifactId>wx-java-solon-plugins</artifactId>
<name>WxJava - Solon Plugins</name>
<description>WxJava 各个模块的 Solon Plugin</description>

<properties>
<solon.version>2.9.2</solon.version>
</properties>

<modules>
<module>wx-java-miniapp-solon-plugin</module>
<module>wx-java-mp-multi-solon-plugin</module>
<module>wx-java-mp-solon-plugin</module>
<module>wx-java-pay-solon-plugin</module>
<module>wx-java-open-solon-plugin</module>
<module>wx-java-qidian-solon-plugin</module>
<module>wx-java-cp-multi-solon-plugin</module>
<module>wx-java-cp-solon-plugin</module>
<module>wx-java-channel-solon-plugin</module>
</modules>

<dependencies>
<dependency>
<groupId>org.noear</groupId>
<artifactId>solon</artifactId>
<version>${solon.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
31 changes: 31 additions & 0 deletions solon-plugins/wx-java-channel-solon-plugin/pom.xml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
<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-solon-plugins</artifactId>
<groupId>com.github.binarywang</groupId>
<version>4.6.4.B</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>wx-java-channel-solon-plugin</artifactId>
<name>WxJava - Solon Plugin for Channel</name>
<description>微信视频号开发的 Solon Plugin</description>

<dependencies>
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-channel</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
package com.binarywang.solon.wxjava.channel.config;


import com.binarywang.solon.wxjava.channel.properties.WxChannelProperties;
import lombok.AllArgsConstructor;
import me.chanjar.weixin.channel.api.WxChannelService;
import me.chanjar.weixin.channel.api.impl.WxChannelServiceImpl;
import me.chanjar.weixin.channel.config.WxChannelConfig;
import org.noear.solon.annotation.Bean;
import org.noear.solon.annotation.Condition;
import org.noear.solon.annotation.Configuration;

/**
* 微信小程序平台相关服务自动注册
*
* @author <a href="https://github.com/lixize">Zeyes</a>
*/
@Configuration
@AllArgsConstructor
public class WxChannelServiceAutoConfiguration {
private final WxChannelProperties properties;

/**
* Channel Service
*
* @return Channel Service
*/
@Bean
@Condition(onMissingBean=WxChannelService.class, onBean = WxChannelConfig.class)
public WxChannelService wxChannelService(WxChannelConfig wxChannelConfig) {
WxChannelService wxChannelService = new WxChannelServiceImpl();
wxChannelService.setConfig(wxChannelConfig);
return wxChannelService;
}
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
package com.binarywang.solon.wxjava.channel.config.storage;

import com.binarywang.solon.wxjava.channel.properties.WxChannelProperties;
import me.chanjar.weixin.channel.config.impl.WxChannelDefaultConfigImpl;
import org.apache.commons.lang3.StringUtils;

/**
* @author <a href="https://github.com/lixize">Zeyes</a>
*/
public abstract class AbstractWxChannelConfigStorageConfiguration {

protected WxChannelDefaultConfigImpl config(WxChannelDefaultConfigImpl config, WxChannelProperties properties) {
config.setAppid(StringUtils.trimToNull(properties.getAppid()));
config.setSecret(StringUtils.trimToNull(properties.getSecret()));
config.setToken(StringUtils.trimToNull(properties.getToken()));
config.setAesKey(StringUtils.trimToNull(properties.getAesKey()));
config.setMsgDataFormat(StringUtils.trimToNull(properties.getMsgDataFormat()));

WxChannelProperties.ConfigStorage configStorageProperties = properties.getConfigStorage();
config.setHttpProxyHost(configStorageProperties.getHttpProxyHost());
config.setHttpProxyUsername(configStorageProperties.getHttpProxyUsername());
config.setHttpProxyPassword(configStorageProperties.getHttpProxyPassword());
if (configStorageProperties.getHttpProxyPort() != null) {
config.setHttpProxyPort(configStorageProperties.getHttpProxyPort());
}

int maxRetryTimes = configStorageProperties.getMaxRetryTimes();
if (configStorageProperties.getMaxRetryTimes() < 0) {
maxRetryTimes = 0;
}
int retrySleepMillis = configStorageProperties.getRetrySleepMillis();
if (retrySleepMillis < 0) {
retrySleepMillis = 1000;
}
config.setRetrySleepMillis(retrySleepMillis);
config.setMaxRetryTimes(maxRetryTimes);
return config;
}
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
package com.binarywang.solon.wxjava.channel.config.storage;


import com.binarywang.solon.wxjava.channel.properties.RedisProperties;
import com.binarywang.solon.wxjava.channel.properties.WxChannelProperties;
import lombok.RequiredArgsConstructor;
import me.chanjar.weixin.channel.config.WxChannelConfig;
import me.chanjar.weixin.channel.config.impl.WxChannelRedisConfigImpl;
import me.chanjar.weixin.common.redis.JedisWxRedisOps;
import me.chanjar.weixin.common.redis.WxRedisOps;
import org.apache.commons.lang3.StringUtils;
import org.noear.solon.annotation.Bean;
import org.noear.solon.annotation.Condition;
import org.noear.solon.annotation.Configuration;
import org.noear.solon.core.AppContext;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
* @author <a href="https://github.com/lixize">Zeyes</a>
* @author noear
*/
@Configuration
@Condition(
onProperty = "${"+WxChannelProperties.PREFIX + ".configStorage.type} = jedis",
onClass = JedisPool.class
)
@RequiredArgsConstructor
public class WxChannelInJedisConfigStorageConfiguration extends AbstractWxChannelConfigStorageConfiguration {
private final WxChannelProperties properties;
private final AppContext applicationContext;

@Bean
@Condition(onMissingBean=WxChannelConfig.class)
public WxChannelConfig wxChannelConfig() {
WxChannelRedisConfigImpl config = getWxChannelRedisConfig();
return this.config(config, properties);
}

private WxChannelRedisConfigImpl getWxChannelRedisConfig() {
RedisProperties redisProperties = properties.getConfigStorage().getRedis();
JedisPool jedisPool;
if (redisProperties != null && StringUtils.isNotEmpty(redisProperties.getHost())) {
jedisPool = getJedisPool();
} else {
jedisPool = applicationContext.getBean(JedisPool.class);
}
WxRedisOps redisOps = new JedisWxRedisOps(jedisPool);
return new WxChannelRedisConfigImpl(redisOps, properties.getConfigStorage().getKeyPrefix());
}

private JedisPool getJedisPool() {
WxChannelProperties.ConfigStorage storage = properties.getConfigStorage();
RedisProperties redis = storage.getRedis();

JedisPoolConfig config = new JedisPoolConfig();
if (redis.getMaxActive() != null) {
config.setMaxTotal(redis.getMaxActive());
}
if (redis.getMaxIdle() != null) {
config.setMaxIdle(redis.getMaxIdle());
}
if (redis.getMaxWaitMillis() != null) {
config.setMaxWaitMillis(redis.getMaxWaitMillis());
}
if (redis.getMinIdle() != null) {
config.setMinIdle(redis.getMinIdle());
}
config.setTestOnBorrow(true);
config.setTestWhileIdle(true);

return new JedisPool(config, redis.getHost(), redis.getPort(), redis.getTimeout(), redis.getPassword(), redis.getDatabase());
}
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
package com.binarywang.solon.wxjava.channel.config.storage;


import com.binarywang.solon.wxjava.channel.properties.WxChannelProperties;
import lombok.RequiredArgsConstructor;
import me.chanjar.weixin.channel.config.WxChannelConfig;
import me.chanjar.weixin.channel.config.impl.WxChannelDefaultConfigImpl;
import org.noear.solon.annotation.Bean;
import org.noear.solon.annotation.Condition;
import org.noear.solon.annotation.Configuration;

/**
* @author <a href="https://github.com/lixize">Zeyes</a>
*/
@Configuration
@Condition(
onProperty = "${"+WxChannelProperties.PREFIX + ".configStorage.type:memory} = memory"
)
@RequiredArgsConstructor
public class WxChannelInMemoryConfigStorageConfiguration extends AbstractWxChannelConfigStorageConfiguration {
private final WxChannelProperties properties;

@Bean
@Condition(onMissingBean = WxChannelProperties.class)
public WxChannelConfig wxChannelConfig() {
WxChannelDefaultConfigImpl config = new WxChannelDefaultConfigImpl();
return this.config(config, properties);
}
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
package com.binarywang.solon.wxjava.channel.config.storage;


import com.binarywang.solon.wxjava.channel.properties.RedisProperties;
import com.binarywang.solon.wxjava.channel.properties.WxChannelProperties;
import lombok.RequiredArgsConstructor;
import me.chanjar.weixin.channel.config.WxChannelConfig;
import me.chanjar.weixin.channel.config.impl.WxChannelRedissonConfigImpl;
import org.apache.commons.lang3.StringUtils;
import org.noear.solon.annotation.Bean;
import org.noear.solon.annotation.Condition;
import org.noear.solon.annotation.Configuration;
import org.noear.solon.core.AppContext;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.redisson.config.TransportMode;

/**
* @author <a href="https://github.com/lixize">Zeyes</a>
*/
@Configuration
@Condition(
onProperty = "${"+WxChannelProperties.PREFIX + ".configStorage.type} = redisson",
onClass = Redisson.class
)
@RequiredArgsConstructor
public class WxChannelInRedissonConfigStorageConfiguration extends AbstractWxChannelConfigStorageConfiguration {
private final WxChannelProperties properties;
private final AppContext applicationContext;

@Bean
@Condition(onMissingBean=WxChannelConfig.class)
public WxChannelConfig wxChannelConfig() {
WxChannelRedissonConfigImpl config = getWxChannelRedissonConfig();
return this.config(config, properties);
}

private WxChannelRedissonConfigImpl getWxChannelRedissonConfig() {
RedisProperties redisProperties = properties.getConfigStorage().getRedis();
RedissonClient redissonClient;
if (redisProperties != null && StringUtils.isNotEmpty(redisProperties.getHost())) {
redissonClient = getRedissonClient();
} else {
redissonClient = applicationContext.getBean(RedissonClient.class);
}
return new WxChannelRedissonConfigImpl(redissonClient, properties.getConfigStorage().getKeyPrefix());
}

private RedissonClient getRedissonClient() {
WxChannelProperties.ConfigStorage storage = properties.getConfigStorage();
RedisProperties redis = storage.getRedis();

Config config = new Config();
config.useSingleServer()
.setAddress("redis://" + redis.getHost() + ":" + redis.getPort())
.setDatabase(redis.getDatabase())
.setPassword(redis.getPassword());
config.setTransportMode(TransportMode.NIO);
return Redisson.create(config);
}
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
package com.binarywang.solon.wxjava.channel.enums;

/**
* httpclient类型
*
* @author <a href="https://github.com/lixize">Zeyes</a>
*/
public enum HttpClientType {
/**
* HttpClient
*/
HttpClient
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
package com.binarywang.solon.wxjava.channel.enums;

/**
* storage类型
*
* @author <a href="https://github.com/lixize">Zeyes</a>
*/
public enum StorageType {
/**
* 内存
*/
Memory,
/**
* redis(JedisClient)
*/
Jedis,
/**
* redis(Redisson)
*/
Redisson,
/**
* redis(RedisTemplate)
*/
RedisTemplate
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
package com.binarywang.solon.wxjava.channel.integration;


import com.binarywang.solon.wxjava.channel.config.WxChannelServiceAutoConfiguration;
import com.binarywang.solon.wxjava.channel.config.storage.WxChannelInJedisConfigStorageConfiguration;
import com.binarywang.solon.wxjava.channel.config.storage.WxChannelInMemoryConfigStorageConfiguration;
import com.binarywang.solon.wxjava.channel.config.storage.WxChannelInRedissonConfigStorageConfiguration;
import com.binarywang.solon.wxjava.channel.properties.WxChannelProperties;
import org.noear.solon.core.AppContext;
import org.noear.solon.core.Plugin;

/**
* @author noear 2024/9/2 created
*/
public class WxChannelPluginImpl implements Plugin {
@Override
public void start(AppContext context) throws Throwable {
context.beanMake(WxChannelProperties.class);
context.beanMake(WxChannelServiceAutoConfiguration.class);

context.beanMake(WxChannelInMemoryConfigStorageConfiguration.class);
context.beanMake(WxChannelInJedisConfigStorageConfiguration.class);
context.beanMake(WxChannelInRedissonConfigStorageConfiguration.class);
}
}
Loading