2026-06-24 f4bd1f3c89d906131495a0aca5aaf82966378510
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package cn.iocoder.yudao.module.system.framework.social.config;
 
import cn.binarywang.wx.miniapp.config.WxMaConfig;
import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl;
import cn.binarywang.wx.miniapp.config.impl.WxMaRedisBetterConfigImpl;
import com.binarywang.spring.starter.wxjava.miniapp.properties.WxMaProperties;
import com.binarywang.spring.starter.wxjava.mp.properties.WxMpProperties;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.redis.RedisTemplateWxRedisOps;
import me.chanjar.weixin.common.redis.WxRedisOps;
import me.chanjar.weixin.mp.config.WxMpConfigStorage;
import me.chanjar.weixin.mp.config.WxMpHostConfig;
import me.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl;
import me.chanjar.weixin.mp.config.impl.WxMpRedisConfigImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.StringRedisTemplate;
 
/**
 * WxJava Boot 4 compatibility: bypass starter storage config that still initializes Apache HttpClient 4 builders.
 */
@Configuration(proxyBeanMethods = false)
@Slf4j
public class YudaoWxClientConfiguration {
 
    @Bean
    @ConditionalOnProperty(prefix = WxMpProperties.PREFIX + ".config-storage", name = "type", havingValue = "redistemplate")
    @ConditionalOnClass(StringRedisTemplate.class)
    @ConditionalOnMissingBean(WxMpConfigStorage.class)
    public WxMpConfigStorage wxMpConfigStorage(WxMpProperties properties, ApplicationContext applicationContext) {
        StringRedisTemplate redisTemplate = applicationContext.getBean(StringRedisTemplate.class);
        WxRedisOps redisOps = new RedisTemplateWxRedisOps(redisTemplate);
        WxMpRedisConfigImpl config = new WxMpRedisConfigImpl(redisOps, properties.getConfigStorage().getKeyPrefix());
        applyWxMpConfig(config, properties);
        log.debug("[wxMpConfigStorage][using local Boot 4 compatible WxJava config]");
        return config;
    }
 
    @Bean
    @ConditionalOnProperty(prefix = WxMaProperties.PREFIX + ".config-storage", name = "type", havingValue = "redistemplate")
    @ConditionalOnClass(StringRedisTemplate.class)
    @ConditionalOnMissingBean(WxMaConfig.class)
    public WxMaConfig wxMaConfig(WxMaProperties properties, ApplicationContext applicationContext) {
        StringRedisTemplate redisTemplate = applicationContext.getBean(StringRedisTemplate.class);
        WxRedisOps redisOps = new RedisTemplateWxRedisOps(redisTemplate);
        WxMaRedisBetterConfigImpl config = new WxMaRedisBetterConfigImpl(redisOps, properties.getConfigStorage().getKeyPrefix());
        applyWxMaConfig(config, properties);
        log.debug("[wxMaConfig][using local Boot 4 compatible WxJava config]");
        return config;
    }
 
    private void applyWxMpConfig(WxMpDefaultConfigImpl config, WxMpProperties properties) {
        config.setAppId(properties.getAppId());
        config.setSecret(properties.getSecret());
        config.setToken(properties.getToken());
        config.setAesKey(properties.getAesKey());
        config.setUseStableAccessToken(properties.isUseStableAccessToken());
 
        WxMpProperties.ConfigStorage storage = properties.getConfigStorage();
        config.setHttpProxyHost(storage.getHttpProxyHost());
        config.setHttpProxyUsername(storage.getHttpProxyUsername());
        config.setHttpProxyPassword(storage.getHttpProxyPassword());
        if (storage.getHttpProxyPort() != null) {
            config.setHttpProxyPort(storage.getHttpProxyPort());
        }
 
        if (properties.getHosts() != null && StringUtils.isNotEmpty(properties.getHosts().getApiHost())) {
            WxMpHostConfig hostConfig = new WxMpHostConfig();
            hostConfig.setApiHost(properties.getHosts().getApiHost());
            hostConfig.setOpenHost(properties.getHosts().getOpenHost());
            hostConfig.setMpHost(properties.getHosts().getMpHost());
            config.setHostConfig(hostConfig);
        }
    }
 
    private void applyWxMaConfig(WxMaDefaultConfigImpl config, WxMaProperties properties) {
        WxMaProperties.ConfigStorage storage = properties.getConfigStorage();
        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()));
        config.useStableAccessToken(properties.isUseStableAccessToken());
        config.setApiHostUrl(StringUtils.trimToNull(properties.getApiHostUrl()));
        config.setAccessTokenUrl(StringUtils.trimToNull(properties.getAccessTokenUrl()));
 
        config.setHttpProxyHost(storage.getHttpProxyHost());
        config.setHttpProxyUsername(storage.getHttpProxyUsername());
        config.setHttpProxyPassword(storage.getHttpProxyPassword());
        if (storage.getHttpProxyPort() != null) {
            config.setHttpProxyPort(storage.getHttpProxyPort());
        }
 
        config.setRetrySleepMillis(Math.max(storage.getRetrySleepMillis(), 1000));
        config.setMaxRetryTimes(Math.max(storage.getMaxRetryTimes(), 0));
    }
 
}