开发日记SpringBoot-实现支持多个微信小程序的登录
目录
【开发日记】SpringBoot 实现支持多个微信小程序的登录
在实际业务场景中,需要一个后台同时支持多个微信小程序的登录。例如,企业有多个不同业务的小程序,但希望统一在同一个后台系统里进行用户认证和数据处理。这时候,我们就需要一个灵活的方式来管理多个小程序的 appid
和 secret
,并根据前端传递的 appid
与 code
获取对应的 openid
实现登录。
本文将基于 weixin-java-miniapp SDK 实现一个通用的多小程序登录模块。
一、依赖引入
在 pom.xml
中加入微信小程序 SDK 依赖:
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-miniapp</artifactId>
<version>4.7.7-20250808.182223</version>
</dependency>
二、配置文件
通过 application.yml
配置多个小程序的 appid
与 secret
,提供给后续动态获取。
wx:
miniapp:
configs:
- appid: wxxxxxxxxxxxxxxxxxx
secret: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- appid: wyyyyyyyyyyyyyyyyyy
secret: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
三、属性类
定义配置属性类,读取配置文件中多个小程序的信息:
@Data
@Component
@ConfigurationProperties(prefix = "wx.miniapp")
public class WxMiniAppProperties {
private List<Config> configs;
@Data
public static class Config {
private String appid;
private String secret;
}
}
这样就能自动绑定 application.yml
中的配置到 WxMiniAppProperties
。
四、服务工厂类
编写一个工厂类 WxMiniAppServiceFactory
,用来存储和获取 WxMaService
实例。
每个小程序对应一个 WxMaService
,通过 appid
来区分。
后台可以根据传入的 appid
动态选择对应的 WxMaService
。
@Component
public class WxMiniAppServiceFactory {
private final Map<String, WxMaService> services = new HashMap<>();
public WxMiniAppServiceFactory(WxMiniAppProperties properties) {
for (WxMiniAppProperties.Config config : properties.getConfigs()) {
WxMaDefaultConfigImpl wxConfig = new WxMaDefaultConfigImpl();
wxConfig.setAppid(config.getAppid());
wxConfig.setSecret(config.getSecret());
WxMaService wxService = new WxMaServiceImpl();
wxService.setWxMaConfig(wxConfig);
services.put(config.getAppid(), wxService);
}
}
public WxMaService getWxMaService(String appid) {
WxMaService service = services.get(appid);
if (service == null) {
throw new IllegalArgumentException("未找到对应appid的配置: " + appid);
}
return service;
}
}
五、登录逻辑
定义登录服务,根据前端传递的 appid
与 code
获取用户 openid
:
@Service
public class WxMiniAppLoginService {
private final WxMiniAppServiceFactory serviceFactory;
public WxMiniAppLoginService(WxMiniAppServiceFactory serviceFactory) {
this.serviceFactory = serviceFactory;
}
public String getOpenId(String appid, String code) throws Exception {
WxMaService wxService = serviceFactory.getWxMaService(appid);
WxMaJscode2SessionResult session = wxService.jsCode2SessionInfo(code);
return session.getOpenid();
}
}
调用时,只需要传入 appid
和前端 wx.login
获取的 code
,就能拿到用户的唯一标识 openid
。