国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

SpringCloud微服務(wù)實戰(zhàn)——搭建企業(yè)級開發(fā)框架(五十三):微信小程序授權(quán)登錄增加多租戶可配置界面

這篇具有很好參考價值的文章主要介紹了SpringCloud微服務(wù)實戰(zhàn)——搭建企業(yè)級開發(fā)框架(五十三):微信小程序授權(quán)登錄增加多租戶可配置界面。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

??GitEgg框架集成weixin-java-miniapp工具包以實現(xiàn)微信小程序相關(guān)接口調(diào)用功能,weixin-java-miniapp底層支持多租戶擴展。每個小程序都有唯一的appid,weixin-java-miniapp的多租戶實現(xiàn)并不是以租戶標(biāo)識TenantId來區(qū)分的,而是在接口調(diào)用時,傳入appid,動態(tài)切換ThreadLocal的appid來實現(xiàn)多租戶的。并且其多個微信小程序的配置,都是在配置yml文件中的,在實際業(yè)務(wù)運營過程中,如果需要新增多租戶小程序就修改配置文件顯然是不合適的。
??現(xiàn)在我們需要結(jié)合weixin-java-miniapp的多租戶實現(xiàn)整合到我們的框架中,使多租戶可通過系統(tǒng)配置界面來新增多租戶小程序。前面我們講了如何集成以及如何使用weixin-java-miniapp實現(xiàn)微信授權(quán)登錄及賬號綁定等,現(xiàn)在只需要在原來的基礎(chǔ)上增加數(shù)據(jù)配置存儲,在服務(wù)啟動時由原先的讀取配置文件加載相應(yīng)的微信小程序接口實例,修改為可以通過讀取配置文件和讀取緩存配置來生成相應(yīng)的微信小程序接口實例。

一、新增微信小程序配置界面
1. 微信小程序配置數(shù)據(jù)庫設(shè)計

??在數(shù)據(jù)庫設(shè)計的時候,我們需要知道微信小程序授權(quán)時,哪些字段需要配置,是可選字段還是必填字段,這里我們通過weixin-java-miniapp的springboot工程配置文件可知,所需字段有:

# 公眾號配置(必填)
wx.miniapp.appid = appId
wx.miniapp.secret = @secret
wx.miniapp.token = @token
wx.miniapp.aesKey = @aesKey
wx.miniapp.msgDataFormat = @msgDataFormat                  # 消息格式,XML或者JSON.
# 存儲配置redis(可選)
# 注意: 指定redis.host值后不會使用容器注入的redis連接(JedisPool)
wx.miniapp.config-storage.type = Jedis                     # 配置類型: Memory(默認(rèn)), Jedis, RedisTemplate
wx.miniapp.config-storage.key-prefix = wa                  # 相關(guān)redis前綴配置: wa(默認(rèn))
wx.miniapp.config-storage.redis.host = 127.0.0.1
wx.miniapp.config-storage.redis.port = 6379
# http客戶端配置
wx.miniapp.config-storage.http-client-type=HttpClient      # http客戶端類型: HttpClient(默認(rèn)), OkHttp, JoddHttp
wx.miniapp.config-storage.http-proxy-host=
wx.miniapp.config-storage.http-proxy-port=
wx.miniapp.config-storage.http-proxy-username=
wx.miniapp.config-storage.http-proxy-password=

??根據(jù)我們的設(shè)計,配置文件中需要增加租戶字段,我們需要兼容即使用配置文件來配置微信小程序,又可以使用配置界面將微信小程序配置信息配置到數(shù)據(jù)庫中,同時,增加md5字段配置,用于在讀取配置時比較配置信息是否有更改。所以,保存微信小程序配置的數(shù)據(jù)庫設(shè)計如下:

CREATE TABLE `t_wechat_miniapp`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `tenant_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '租戶id',
  `miniapp_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '微信小程序名稱',
  `appid` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '微信小程序appid',
  `secret` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '微信小程序secret',
  `token` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '微信小程序token',
  `aes_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '微信小程序aesKey',
  `msg_data_format` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '消息格式,XML或者JSON',
  `storage_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '配置類型: Memory(默認(rèn)), Jedis, RedisTemplate',
  `key_prefix` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '相關(guān)redis前綴配置: wa(默認(rèn))',
  `redis_host` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'Redis服務(wù)器地址',
  `redis_port` int(11) NULL DEFAULT NULL COMMENT 'Redis服務(wù)器端口',
  `http_client_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'http客戶端類型: HttpClient(默認(rèn)), OkHttp, JoddHttp',
  `http_proxy_host` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'http_proxy_host',
  `http_proxy_port` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'http_proxy_port',
  `http_proxy_username` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'http_proxy_username',
  `http_proxy_password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'http_proxy_password',
  `status` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '1' COMMENT '狀態(tài) 1有效 0禁用',
  `md5` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'MD5',
  `comments` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '描述',
  `create_time` datetime(0) NULL DEFAULT NULL COMMENT '創(chuàng)建時間',
  `creator` bigint(20) NULL DEFAULT NULL COMMENT '創(chuàng)建者',
  `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新時間',
  `operator` bigint(20) NULL DEFAULT NULL COMMENT '更新者',
  `del_flag` tinyint(2) NOT NULL DEFAULT 0 COMMENT '是否刪除',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '微信小程序配置' ROW_FORMAT = DYNAMIC;

2. 通過代碼生成器生成微信小程序配置的增刪查改代碼

??通過代碼生成器根據(jù)新設(shè)計的表進行CRUD代碼生成,詳細(xì)步驟不再贅述,前面有詳細(xì)講解如何根據(jù)數(shù)據(jù)庫表設(shè)計生成前后端代碼。只是這里需要增加業(yè)務(wù)邏輯處理,以及更新到緩存配置。

  • 新增時,將配置信息添加到Redis,并且需要根據(jù)系統(tǒng)是否開啟多租戶來判斷生成緩存key
    /**
    * 創(chuàng)建微信小程序配置
    * @param miniapp
    * @return
    */
    @Override
    public boolean createMiniapp(CreateMiniappDTO miniapp) {
        Miniapp miniappEntity = BeanCopierUtils.copyByClass(miniapp, Miniapp.class);
        try {
            String miniappEntityStr = JsonUtils.objToJson(miniappEntity);
            miniappEntity.setMd5(SecureUtil.md5(miniappEntityStr));
        } catch (Exception e) {
            log.error("創(chuàng)建微信小程序配置時,md5加密失敗:{}", e);
            throw new BusinessException("創(chuàng)建微信小程序配置時,md5加密失敗:" + e);
        }
        boolean result = this.save(miniappEntity);
        if (result)
        {
            // 更新到緩存
            Miniapp miniappEntityLocal = this.getById(miniappEntity.getId());
            MiniappDTO miniappDTO = BeanCopierUtils.copyByClass(miniappEntityLocal, MiniappDTO.class);
            this.addOrUpdateMiniappCache(miniappDTO);
        }
        return result;
    }
  • 編輯時,需要更新Redis配置信息,因為會有key也同時修改的情況,所以,需要先刪除舊的配置信息,再新增新的配置信息
    /**
    * 更新微信小程序配置
    * @param miniapp
    * @return
    */
    @Override
    public boolean updateMiniapp(UpdateMiniappDTO miniapp) {
        Miniapp miniappEntity = BeanCopierUtils.copyByClass(miniapp, Miniapp.class);
        Miniapp miniappEntityOld = this.getById(miniappEntity.getId());
        try {
            String miniappEntityStr = JsonUtils.objToJson(miniappEntity);
            miniappEntity.setMd5(SecureUtil.md5(miniappEntityStr));
        } catch (Exception e) {
            log.error("創(chuàng)建微信小程序配置時,md5加密失敗:{}", e);
            throw new BusinessException("創(chuàng)建微信小程序配置時,md5加密失敗:" + e);
        }
        boolean result = this.updateById(miniappEntity);
        if (result)
        {
            // 把舊的刪掉
            MiniappDTO miniappDTOOld = BeanCopierUtils.copyByClass(miniappEntityOld, MiniappDTO.class);
            this.deleteMiniappCache(miniappDTOOld);
            // 更新到緩存
            Miniapp miniappEntityLocal = this.getById(miniappEntity.getId());
            MiniappDTO miniappDTO = BeanCopierUtils.copyByClass(miniappEntityLocal, MiniappDTO.class);
            this.addOrUpdateMiniappCache(miniappDTO);
        }
        return result;
    }
  • 刪除時,直接根據(jù)條件生成緩存key,然后進行刪除即可
    /**
    * 刪除微信小程序配置
    * @param miniappId
    * @return
    */
    @Override
    public boolean deleteMiniapp(Long miniappId) {
        // 從緩存刪除
        Miniapp miniappEntity = this.getById(miniappId);
        MiniappDTO miniappDTO = BeanCopierUtils.copyByClass(miniappEntity, MiniappDTO.class);
        this.deleteMiniappCache(miniappDTO);
        // 從數(shù)據(jù)庫中刪除
        boolean result = this.removeById(miniappId);
        return result;
    }
  • 新增/更新緩存的公共方法
    private void addOrUpdateMiniappCache(MiniappDTO miniappDTO) {
        try {

            String redisKey = MiniappConstant.WX_MINIAPP_CONFIG_KEY;
            if (enable) {
                redisKey = MiniappConstant.WX_MINIAPP_TENANT_CONFIG_KEY + miniappDTO.getAppid();
            }
            redisTemplate.opsForHash().put(redisKey, miniappDTO.getTenantId().toString(), JsonUtils.objToJson(miniappDTO));

            // wxMaService增加config
            this.addConfig(miniappDTO);

        } catch (Exception e) {
            log.error("初始化微信小程序配置失?。簕}" , e);
        }
    }
  • 刪除緩存的公共方法
    private void deleteMiniappCache(MiniappDTO miniappDTO) {
        try {

            String redisKey = MiniappConstant.WX_MINIAPP_CONFIG_KEY;
            if (enable) {
                redisKey = MiniappConstant.WX_MINIAPP_TENANT_CONFIG_KEY + miniappDTO.getAppid();
            }
            redisTemplate.opsForHash().delete(redisKey, miniappDTO.getTenantId().toString(), JsonUtils.objToJson(miniappDTO));
            // wxMaService刪除config
            this.removeConfig(miniappDTO);
        } catch (Exception e) {
            log.error("初始化微信小程序配置失?。簕}" , e);
        }
    }
3. 修改相關(guān)配置文件,使微信小程序配置既支持配置文件又支持?jǐn)?shù)據(jù)庫配置
  • 新增GitEggWxMaRedissonConfigImpl類繼承自WxMaRedissonConfigImpl,增加我們需要的租戶配置字段:configKey、tenantId、md5。
/**
 * @author GitEgg
 * @date 2023/7/21
 */
public class GitEggWxMaRedissonConfigImpl extends WxMaRedissonConfigImpl {

    protected String configKey;

    protected String tenantId;

    protected String md5;

    public GitEggWxMaRedissonConfigImpl(@NonNull RedissonClient redissonClient, String keyPrefix) {
        super(redissonClient, keyPrefix);
    }

    public GitEggWxMaRedissonConfigImpl(@NonNull RedissonClient redissonClient) {
        super(redissonClient);
    }
......
}
  • 修改WxMaProperties類,增加我們需要的字段tenantId,因為configKey和md5是系統(tǒng)生成的,只有動態(tài)可配置時才會用到這幾個字段去判斷,這里如果是配置文件配置,修改后生效必須重啟系統(tǒng),所以這里不需要這幾個字段。
@Data
@ConfigurationProperties(prefix = "wx.miniapp")
public class WxMaProperties {

    private List<Config> configs;

    @Data
    public static class Config {

        /**
         * 租戶
         */
        private Long tenantId;

        /**
         * 設(shè)置微信小程序的appid
         */
        private String appid;

        /**
         * 設(shè)置微信小程序的Secret
         */
        private String secret;

        /**
         * 設(shè)置微信小程序消息服務(wù)器配置的token
         */
        private String token;

        /**
         * 設(shè)置微信小程序消息服務(wù)器配置的EncodingAESKey
         */
        private String aesKey;

        /**
         * 消息格式,XML或者JSON
         */
        private String msgDataFormat;
    }

}
  • 修改WxMaConfiguration類,我們使用自己定義的緩存方式和Config類進行相關(guān)操作,這里的緩存我們使用Redisson。
    @Bean
    public WxMaService wxMaService() {
        List<WxMaProperties.Config> configs = this.properties.getConfigs();
        //已添加緩存配置,如果配置文件沒有,那么在緩存新增時,仍然可以setConfigs
//        if (configs == null) {
//            throw new WxRuntimeException("大哥,拜托先看下項目首頁的說明(readme文件),添加下相關(guān)配置,注意別配錯了!");
//        }
        WxMaService maService = new WxMaServiceImpl();
        if (null != configs)
        {
            maService.setMultiConfigs(
                    configs.stream()
                            .map(a -> {
//                    WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl();
//                    WxMaDefaultConfigImpl config = new WxMaRedisConfigImpl(new JedisPool());
                                GitEggWxMaRedissonConfigImpl config = new GitEggWxMaRedissonConfigImpl(redissonClient);
                                // 使用上面的配置時,需要同時引入jedis-lock的依賴,否則會報類無法找到的異常
                                config.setTenantId(null != a.getTenantId() ? a.getTenantId().toString() : AuthConstant.DEFAULT_TENANT_ID.toString());
                                config.setConfigKey(config.getTenantId() + StrPool.UNDERLINE + a.getAppid());
                                config.setAppid(a.getAppid());
                                config.setSecret(a.getSecret());
                                config.setToken(a.getToken());
                                config.setAesKey(a.getAesKey());
                                config.setMsgDataFormat(a.getMsgDataFormat());
                                return config;
                            }).collect(Collectors.toMap( GitEggWxMaRedissonConfigImpl::getConfigKey, a -> a, (o, n) -> o)));
        }
        return maService;
    }
二、服務(wù)啟動時加載微信小程序配置信息
1. 新增加載方法,服務(wù)啟動時加載配置數(shù)據(jù)需要排除多租戶插件,之所以在啟動時加載配置信息到緩存,是因為配置的微服務(wù)和小程序相關(guān)功能的服務(wù)不是同一個服務(wù),所以將緩存作為相關(guān)配置的存儲。
  • MiniappMapper中新增initMiniappList數(shù)據(jù)庫查詢方法,一定要加@InterceptorIgnore(tenantLine = “true”)注解,表示此查詢不需要多租戶控制,在服務(wù)啟動時不區(qū)分租戶加載所有配置。
    /**
     * 排除多租戶插件查詢微信配置列表
     * @param miniappDTO
     * @return
     */
    @InterceptorIgnore(tenantLine = "true")
    List<MiniappDTO> initMiniappList(@Param("miniapp") QueryMiniappDTO miniappDTO);
    <!-- 不區(qū)分租戶查詢微信小程序配置信息 -->
    <select id="getMiniapp" resultType="com.gitegg.boot.extension.wx.miniapp.dto.MiniappDTO" parameterType="com.gitegg.boot.extension.wx.miniapp.dto.QueryMiniappDTO">
        SELECT
        <include refid="Base_Column_List"/>
        FROM t_wechat_miniapp
        WHERE del_flag = 0
        <if test="miniapp.miniappName != null and miniapp.miniappName != ''">
            AND miniapp_name = #{miniapp.miniappName}
        </if>
        <if test="miniapp.appid != null and miniapp.appid != ''">
            AND appid = #{miniapp.appid}
        </if>
        <if test="miniapp.secret != null and miniapp.secret != ''">
            AND secret = #{miniapp.secret}
        </if>
        <if test="miniapp.status != null and miniapp.status != ''">
            AND status = #{miniapp.status}
        </if>
        ORDER BY id DESC
    </select>
  • MiniappServiceImpl中新增initMiniappList接口的實現(xiàn)方法,緩存配置的增刪查改方法也在此類中實現(xiàn),這里不再贅述,更多了解可以查看框架代碼。
    /**
     * 初始化微信小程序配置表列表
     * @return
     */
    @Override
    public void initMiniappList() {
        QueryMiniappDTO miniappDTO = new QueryMiniappDTO();
        miniappDTO.setStatus(String.valueOf(GitEggConstant.ENABLE));
        // 這里初始化所有的配置,不再只初始化已啟用的配置
        List<MiniappDTO> miniappInfoList = miniappMapper.initMiniappList(miniappDTO);

        // 判斷是否開啟了租戶模式,如果開啟了,那么需要按租戶進行分類存儲
        if (enable) {
            Map<String, List<MiniappDTO>> miniappListMap =
                    miniappInfoList.stream().collect(Collectors.groupingBy(MiniappDTO::getAppid));
            miniappListMap.forEach((key, value) -> {
                String redisKey = MiniappConstant.WX_MINIAPP_TENANT_CONFIG_KEY + key;
                redisTemplate.delete(redisKey);
                addMiniapp(redisKey, value);
            });
        } else {
            redisTemplate.delete(MiniappConstant.WX_MINIAPP_CONFIG_KEY);
            addMiniapp(MiniappConstant.WX_MINIAPP_CONFIG_KEY, miniappInfoList);
        }
    }
  • 在InitExtensionCacheRunner系統(tǒng)配置加載類中新增initMiniappList的調(diào)用
/**
 * 容器啟動完成加載擴展信息數(shù)據(jù)到緩存
 * @author GitEgg
 */
@Slf4j
@RequiredArgsConstructor(onConstructor_ = @Autowired)
@Component
public class InitExtensionCacheRunner implements CommandLineRunner {
    
    private final IJustAuthConfigService justAuthConfigService;
    
    private final IJustAuthSourceService justAuthSourceService;

    private final IMailChannelService mailChannelService;

    private final IMiniappService miniappService;

    @Override
    public void run(String... args) {

        log.info("InitExtensionCacheRunner running");
    
    
        // 初始化第三方登錄主配置
        justAuthConfigService.initJustAuthConfigList();

        // 初始化第三方登錄 第三方配置
        justAuthSourceService.initJustAuthSourceList();

        // 初始化郵件配置信息
        mailChannelService.initMailChannelList();

        // 初始化微信配置信息
        miniappService.initMiniappList();

    }
}
2. 實現(xiàn)動態(tài)選擇某個租戶微信小程序接口的方法,我們需要在保證原先讀取配置文件的方式仍然可用的基礎(chǔ)上擴展讀取數(shù)據(jù)庫緩存配置信息,所以,在接口實現(xiàn)時需要充分考慮原先配置方式可用。
  • 通過appid獲取組裝后的key值,在WxMaService中存儲著默認(rèn)以appid為key值的配置configMap,這里我們將key值修改為tenantId_appid的格式,作為多租戶的擴展,同時在獲取配置信息時,也需要傳入多租戶信息。
  • 如果前端傳了租戶,那么先使用前端的租戶,如果沒有傳租戶,那么從系統(tǒng)中查詢租戶
  • 從緩存獲取配置對象,如果md5配置和系統(tǒng)配置不一樣,那么需要重新add
  • 緩存配置中沒有也需要直接返回,因為有可能是配置文件配置的
  • 取緩存中所有appid的配置租戶,如果存在多個租戶,那么提示錯誤,讓前端選擇租戶;如果只有一個租戶,那么返回
    /**
     * 通過appid獲取appid,忽略租戶插件
     * @param miniappId
     * @return
     */
    @Override
    public String getMiniappId(String miniappId) {
        if (enable) {
            // 如果前端傳了租戶,那么先使用前端的租戶,如果沒有傳租戶,那么從系統(tǒng)中查詢租戶
            String tenantId = GitEggAuthUtils.getTenantId();
            if (!StringUtils.isEmpty(tenantId))
            {
                String miniappStr = (String) redisTemplate.opsForHash().get(MiniappConstant.WX_MINIAPP_TENANT_CONFIG_KEY + miniappId, tenantId);
                if (!StringUtils.isEmpty(miniappStr))
                {
                    // 轉(zhuǎn)為系統(tǒng)配置對象
                    try {
                        // 從緩存獲取配置對象,如果md5配置和系統(tǒng)配置不一樣,那么需要重新add
                        MiniappDTO miniappDTO = JsonUtils.jsonToPojo(miniappStr, MiniappDTO.class);
                        return this.ifConfig(miniappDTO);
                    } catch (Exception e) {
                        log.error("獲取微信小程序配置時發(fā)生異常:{}", e);
                        throw new BusinessException("獲取微信小程序配置時發(fā)生異常。");
                    }
                }
                // 緩存配置中沒有也需要直接返回,因為有可能是配置文件配置的
                return tenantId + StrPool.UNDERLINE + miniappId;
            } else {
                String redisKey = MiniappConstant.WX_MINIAPP_TENANT_CONFIG_KEY + miniappId;
                // 取緩存中所有appid的配置租戶,如果存在多個租戶,那么提示錯誤,讓前端選擇租戶;如果只有一個租戶,那么返回
                List<Object> values = redisTemplate.opsForHash().values(redisKey);
                if (!CollectionUtils.isEmpty(values))
                {
                    if (values.size() > GitEggConstant.Number.ONE)
                    {
                        throw new BusinessException("此小程序配置在多個租戶下,請選擇所需要操作的租戶。");
                    }

                    String miniappConfig = (String) values.stream().findFirst().orElse(null);
                    try {
                        MiniappDTO miniappConfigDTO = JsonUtils.jsonToPojo(miniappConfig, MiniappDTO.class);
                        return this.ifConfig(miniappConfigDTO);
                    } catch (Exception e) {
                        log.error("獲取緩存小程序配置失敗:{}", e);
                        throw new BusinessException("小程序已被禁用,請聯(lián)系管理員");
                    }
                }
                else
                {
                    return AuthConstant.DEFAULT_TENANT_ID + StrPool.UNDERLINE + miniappId;
                }

            }
        } else {
            return AuthConstant.DEFAULT_TENANT_ID + StrPool.UNDERLINE + miniappId;
        }
    }
3. 修改原先的切換租戶方法調(diào)用,在WxMaUserController中,將原來的wxMaService.switchover(appid)修改為我們自己的實現(xiàn)miniappService.switchover(appid),其它有切換租戶調(diào)用的都改為此方法。
        if (!miniappService.switchover(appid)) {
            throw new IllegalArgumentException(String.format("未找到對應(yīng)appid=[%s]的配置,請核實!", appid));
        }
4. 微信小程序前端代碼不需要修改,還是按照前面章節(jié)的說明進行調(diào)用即可。在請求中加入appid,在請求頭中加入租戶id。
import request from '@/common/utils/request'

const wechatLoginApi = {
  Login: '/extension/wx/user/'
}

export default wechatLoginApi

/**
 * 微信登錄
 * @param {Object} appId
 * @param {Object} parameter
 */
export function wechatLogin (appId, parameter) {
  return request({
    url: wechatLoginApi.Login + appId + '/login',
    method: 'get',
    params: parameter
  })
}

/**
 * 獲取微信信息
 * @param {Object} appId
 * @param {Object} parameter
 */
export function wechatInfo (appId, parameter) {
  return request({
    url: wechatLoginApi.Login + appId + '/info',
    method: 'get',
    params: parameter
  })
}

/**
 * 獲取手機號
 * @param {Object} appId
 * @param {Object} parameter
 */
export function wechatPhone (appId, parameter) {
  return request({
    url: wechatLoginApi.Login + appId + '/phone',
    method: 'get',
    params: parameter
  })
}

??在修改配置時,一定需要注意權(quán)限問題,一般情況下,在不同的租戶下不允許配置相同的微信小程序,因為appid是唯一的,在發(fā)布微信小程序后,微信小程序是唯一的。當(dāng)然也有特殊的情況,比如,同一個小程序作為多個租戶相同的商戶管理端,那么在此時,需要讓用戶在前端選擇輸入租戶標(biāo)識以確定登錄用戶屬于那個租戶,即多個租戶共用同一個微信小程序。

GitEgg-Cloud是一款基于SpringCloud整合搭建的企業(yè)級微服務(wù)應(yīng)用開發(fā)框架,開源項目地址:

Gitee: https://gitee.com/wmz1930/GitEgg

GitHub: https://github.com/wmz1930/GitEgg文章來源地址http://www.zghlxwxcb.cn/news/detail-617413.html

到了這里,關(guān)于SpringCloud微服務(wù)實戰(zhàn)——搭建企業(yè)級開發(fā)框架(五十三):微信小程序授權(quán)登錄增加多租戶可配置界面的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 畢業(yè)設(shè)計So Easy:SpringCloud Hadoop Vue實現(xiàn)企業(yè)級網(wǎng)盤系統(tǒng)

    畢業(yè)設(shè)計So Easy:SpringCloud Hadoop Vue實現(xiàn)企業(yè)級網(wǎng)盤系統(tǒng)

    目錄 1、項目背景 2、項目功能 3、項目機制 4、功能模塊結(jié)構(gòu) 5、數(shù)據(jù)庫設(shè)計 6、項目實現(xiàn) 6.1、前臺主要功能模塊 6.2、后臺主要功能模塊 7、項目效果 7.1、主界面 7.2、后臺界面 7.3、菜單管理界面 很多計算機專業(yè)大學(xué)生經(jīng)常和我交流:畢業(yè)設(shè)計沒思路、不會做、論文不會寫、

    2024年02月13日
    瀏覽(17)
  • java項目分享 - 基于SpringCloud+Hadoop+Vue的企業(yè)級網(wǎng)盤系統(tǒng)設(shè)計與實現(xiàn)

    java項目分享 - 基于SpringCloud+Hadoop+Vue的企業(yè)級網(wǎng)盤系統(tǒng)設(shè)計與實現(xiàn)

    基于SpringCloud+Hadoop+Vue的企業(yè)級網(wǎng)盤系統(tǒng)設(shè)計與實現(xiàn) 提示:適合用于課程設(shè)計或畢業(yè)設(shè)計,工作量達標(biāo),源碼開放 前端:vue-projectManage 后臺:mycloud-admin 提供前端服務(wù):mycloud 文件在線預(yù)覽服務(wù):file-online-preview 編程語言:Java、Mybatis、Spring、SpringBoot、SpringCloud、Node、Vue 開發(fā)環(huán)

    2024年02月05日
    瀏覽(20)
  • 畢業(yè)設(shè)計項目 基于SpringCloud+Hadoop+Vue的企業(yè)級網(wǎng)盤系統(tǒng)設(shè)計與實現(xiàn)

    畢業(yè)設(shè)計項目 基于SpringCloud+Hadoop+Vue的企業(yè)級網(wǎng)盤系統(tǒng)設(shè)計與實現(xiàn)

    基于SpringCloud+Hadoop+Vue的企業(yè)級網(wǎng)盤系統(tǒng)設(shè)計與實現(xiàn) 提示:適合用于課程設(shè)計或畢業(yè)設(shè)計,工作量達標(biāo),源碼開放 前端:vue-projectManage 后臺:mycloud-admin 提供前端服務(wù):mycloud 文件在線預(yù)覽服務(wù):file-online-preview 編程語言:Java、Mybatis、Spring、SpringBoot、SpringCloud、Node、Vue 開發(fā)環(huán)

    2024年04月24日
    瀏覽(17)
  • 計算機畢設(shè)分享 基于SpringCloud+Hadoop+Vue的企業(yè)級網(wǎng)盤系統(tǒng)設(shè)計與實現(xiàn)

    計算機畢設(shè)分享 基于SpringCloud+Hadoop+Vue的企業(yè)級網(wǎng)盤系統(tǒng)設(shè)計與實現(xiàn)

    基于SpringCloud+Hadoop+Vue的企業(yè)級網(wǎng)盤系統(tǒng)設(shè)計與實現(xiàn) 提示:適合用于課程設(shè)計或畢業(yè)設(shè)計,工作量達標(biāo),源碼開放 前端:vue-projectManage 后臺:mycloud-admin 提供前端服務(wù):mycloud 文件在線預(yù)覽服務(wù):file-online-preview 編程語言:Java、Mybatis、Spring、SpringBoot、SpringCloud、Node、Vue 開發(fā)環(huán)

    2024年02月20日
    瀏覽(155)
  • Docker(四)搭建harbor企業(yè)級倉庫

    Docker(四)搭建harbor企業(yè)級倉庫

    雖然Docker官方也提供了公共的鏡像倉庫,但是從安全和效率等方面考慮,部署我們私有環(huán)境的Registry也是非常必要的。 所以Harbor孕育而生,Harbor是由VMware公司開源的企業(yè)級的Docker Registry管理項目,它包括權(quán)限管理(RBAC)、LDAP、日志審核、管理界面、自我注冊、鏡像復(fù)制和中文支

    2024年02月04日
    瀏覽(27)
  • 阿里云大數(shù)據(jù)——搭建企業(yè)級數(shù)據(jù)分析平臺

    阿里云大數(shù)據(jù)——搭建企業(yè)級數(shù)據(jù)分析平臺

    目錄 1、數(shù)據(jù)分析介紹 1.1數(shù)據(jù)分析基本介紹 1.2數(shù)據(jù)分析目的 1.3數(shù)據(jù)分析平臺組成部分 1.4數(shù)據(jù)分析平臺對應(yīng)的場景 2、阿里云數(shù)加介紹 2.1數(shù)加是什么? 2.2“數(shù)加”是阿里云大數(shù)據(jù)的核心能力 2.3數(shù)加平臺發(fā)展歷程 3、常用的數(shù)加產(chǎn)品 3.1數(shù)加產(chǎn)品框架圖 3.2數(shù)據(jù)分析平臺常用的數(shù)

    2023年04月11日
    瀏覽(30)
  • Git---企業(yè)級開發(fā)模型

    Git---企業(yè)級開發(fā)模型

    我們知道,一個軟件從零開始到最終交付,大概包括一下幾個階段 : 規(guī)劃、編碼、構(gòu)建、測試、發(fā)布、部署和維護. 最初程序比較簡單,工作量也不大.程序猿一個人可以完成所有階段的工作.但隨著軟件產(chǎn)業(yè)的日益發(fā)展壯大,軟件的規(guī)模也在逐漸變得龐大.軟件的復(fù)雜度不斷攀升,一個

    2024年02月13日
    瀏覽(17)
  • CentOS7搭建Harbor企業(yè)級Docker倉庫

    前言 Harbor是一個企業(yè)級的Docker Registry管理項目,主要用于存儲和分發(fā)Docker鏡像。它提供了一些企業(yè)必需的功能特性,如安全、標(biāo)識和管理等,以擴展開源Docker Distribution。 作為企業(yè)級私有Registry服務(wù)器,Harbor提供了更好的性能和安全,并提升了用戶使用Registry構(gòu)建和運行環(huán)境傳

    2024年01月22日
    瀏覽(31)
  • 拿來即用的企業(yè)級安全運維體系搭建指南

    拿來即用的企業(yè)級安全運維體系搭建指南

    **作者介紹****林偉壕,**SecDevOpsor,先后在中國電信和網(wǎng)易游戲從事數(shù)據(jù)網(wǎng)絡(luò)、網(wǎng)絡(luò)安全和游戲運維工作。對Linux運維、虛擬化和網(wǎng)絡(luò)安全防護等研究頗多,目前專注于網(wǎng)絡(luò)安全自動化檢測、防御系統(tǒng)構(gòu)建。 在上篇《99%的人會中招的運維安全陋習(xí),請規(guī)避!》中,我們花了很大

    2024年02月03日
    瀏覽(28)
  • 【云原生-Harbor】企業(yè)級搭建鏡像倉庫Harbor最佳教程

    【云原生-Harbor】企業(yè)級搭建鏡像倉庫Harbor最佳教程

    Harbor 是由 VMware 公司中國團隊為企業(yè)用戶設(shè)計的 Registry server 開源項目,包括了權(quán)限管理 (RBAC)、LDAP、審計、管理界面、自我注冊、HA 等企業(yè)必需的功能,同時針對中國用戶的特點,設(shè)計鏡像復(fù)制和中文支持等功能。 官網(wǎng):https://goharbor.io/ 開源地址:https://github.com/goharbor/har

    2024年02月02日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包