基础服务模块 (base)
基础服务模块提供了系统运行所需的核心基础服务,包括多平台配置管理、支付配置管理、广告配置、账号绑定等功能。
模块结构
base/
├── controller/ # 控制器层
│ ├── AdController.java
│ ├── BindController.java
│ ├── PaymentController.java
│ └── PlatformController.java
├── service/ # 服务层
│ ├── IAdService.java
│ ├── IBindService.java
│ ├── IPaymentService.java
│ └── IPlatformService.java
├── domain/ # 数据模型
│ ├── entity/ # 实体类
│ ├── vo/ # 视图对象
│ └── bo/ # 业务对象
├── mapper/ # 数据访问层
└── authStrategy/ # 认证策略
核心功能
🏗️ 平台配置管理
支持多种平台的统一配置管理:
- 微信小程序 (mp-weixin)
- 微信公众号 (mp-official-account)
- 支付宝小程序 (mp-alipay)
- QQ小程序 (mp-qq)
- 其他平台 (mp-jd, mp-kuaishou, mp-lark, mp-baidu, mp-toutiao, mp-xhs)
平台配置实体
java
@Data
@TableName("b_platform")
public class Platform extends TenantEntity {
private Long id; // 平台配置ID
private String type; // 平台类型
private String name; // 平台名称
private String appid; // 应用ID
private String secret; // 应用密钥
private String token; // 接口Token
private String aeskey; // 加密密钥
private String paymentIds; // 关联支付配置
private String templateConfigs; // 模板配置
private String status; // 状态
}
核心接口
java
public interface IPlatformService extends IBaseService<Platform, PlatformBo, PlatformVo> {
// 继承基础CRUD操作
}
// 全局平台服务
public interface PlatformService {
List<PlatformDTO> listPlatformsByType(String type, String tenantId);
PlatformDTO getPlatformByAppidAndType(String appid, String type);
PlatformDTO getPlatformByAppid(String appid, String tenantId);
}
💳 支付配置管理
统一的支付配置管理,支持多种支付方式:
支付配置实体
java
@Data
@TableName("b_payment")
public class Payment extends TenantEntity {
private Long id; // 支付配置ID
private String type; // 商户类型
private String mchName; // 商户名称
private String mchId; // 商户号
private String mchKey; // 商户密钥
private String apiV3Key; // APIv3密钥
private String certPath; // 证书路径
private String keyPath; // 密钥路径
private String certSerialNo; // 证书序列号
private String status; // 状态
}
核心服务
java
public interface PaymentService {
List<PaymentDTO> listPaymentByType(String type, String tenantId);
PaymentDTO getByMchId(String mchId);
PaymentDTO getById(Long paymentId);
boolean existsValidMchId(String mchId);
long countPayments();
}
📱 账号绑定管理
管理用户在不同平台的账号绑定关系:
绑定实体
java
@Data
@TableName("b_bind")
public class Bind extends TenantEntity {
private Long id; // 绑定ID
private Long userId; // 用户ID
private String platformType; // 平台类型
private String appid; // 应用ID
private String unionid; // 统一标识
private String openid; // 平台标识
private String extraData; // 扩展数据
}
绑定服务
java
public interface IBindService extends IBaseService<Bind, BindBo, BindVo> {
/**
* 根据平台用户信息获取或创建绑定信息
*/
BindVo getOrCreateBind(PlatformUserInfoVo platformUserInfoVo);
/**
* 更新绑定信息的用户ID
*/
void updateBindUserId(BindBo bindBo, Long userId);
}
📢 广告配置管理
提供广告位和广告内容的统一管理:
广告实体
java
@Data
@TableName("b_ad")
public class Ad extends TenantEntity {
private Long id; // 广告ID
private String appid; // 应用ID
private String adUnitId; // 广告位ID
private String adName; // 广告名称
private String adType; // 广告类型
private String position; // 投放位置
private String img; // 广告图片
private String description; // 描述
private String jumpAppid; // 跳转应用ID
private String jumpPath; // 跳转路径
private String styleConfig; // 样式配置
private Long sortOrder; // 排序值
private String status; // 状态
}
认证策略
多平台认证架构
基于策略模式实现多平台登录认证:
认证策略接口
java
public interface IAuthStrategy {
String BASE_NAME = "AuthStrategy";
AuthTokenVo login(String body);
}
小程序认证策略
java
@Service("miniapp" + IAuthStrategy.BASE_NAME)
public class MiniappAuthStrategy implements IAuthStrategy {
@Override
public AuthTokenVo login(String body) {
// 1. 解析请求参数
PlatformLoginBody loginBody = JsonUtils.parseObject(body, PlatformLoginBody.class);
// 2. 获取平台用户信息
PlatformUserInfoVo platformUserInfo = getMiniappUserIdentity(loginBody);
// 3. 加载或创建用户
SysUserVo user = loadOrCreateUser(platformUserInfo);
// 4. 生成登录令牌
LoginUser loginUser = loginService.createLoginUser(user);
loginUser.setPlatform(platformUserInfo.getPlatform());
loginUser.setAppid(platformUserInfo.getAppid());
loginUser.setOpenid(platformUserInfo.getOpenid());
loginUser.setUnionid(platformUserInfo.getUnionid());
// 5. 完成登录
LoginHelper.login(loginUser, loginParameter);
// 6. 返回认证结果
AuthTokenVo authTokenVo = new AuthTokenVo();
authTokenVo.setAccessToken(StpUtil.getTokenValue());
authTokenVo.setExpireIn(StpUtil.getTokenTimeout());
return authTokenVo;
}
}
公众号认证策略
java
@Service("mp" + IAuthStrategy.BASE_NAME)
public class MpAuthStrategy implements IAuthStrategy {
// 公众号OAuth2.0认证流程实现
// 支持网页授权登录场景
}
认证流程
- 前端授权:用户在前端完成平台授权,获取授权码
- 策略选择:后端根据平台类型自动选择对应认证策略
- 信息获取:通过授权码换取用户基本信息
- 账号绑定:查找或创建用户账号绑定关系
- 令牌生成:生成JWT访问令牌
- 登录完成:返回令牌和用户信息
手机号绑定
微信小程序手机号获取
java
@PostMapping("/bindPhone")
public R<PhoneBindVo> bindPhone(@RequestBody PhoneBindBo bo) {
LoginUser loginUser = LoginHelper.getLoginUser();
wxMaService.switchover(loginUser.getAppid());
try {
WxMaPhoneNumberInfo phoneInfo = wxMaService.getUserService().getPhoneNumber(bo.getCode());
String phone = phoneInfo.getPhoneNumber();
// 更新用户手机号
SysUser sysUser = userMapper.selectById(loginUser.getUserId());
sysUser.setPhone(phone);
userMapper.updateById(sysUser);
return R.ok("绑定成功", PhoneBindVo.of(phone));
} catch (WxErrorException e) {
return R.fail("获取手机号出错");
}
}
数据字典服务
支付方式字典
java
@GetMapping("getPaymentDict")
public R<List<DictItemVo>> getPaymentDict() {
// 查询所有可用的支付方式
List<PaymentVo> paymentVoList = paymentService.list(
PlusLambdaQuery.of(Payment.class)
.eq(Payment::getStatus, DictEnableStatus.ENABLE.getValue()));
// 构建字典项列表
List<DictItemVo> dictItems = StreamUtils.toList(paymentVoList, payment ->
DictItemVo.of(payment.getMchName(), payment.getId().toString(), "success")
);
return R.ok(dictItems);
}
配置管理
平台配置热更新
java
private void reloadPlatformConfig() {
String tenantId = TenantHelper.getTenantId();
// 重新初始化微信小程序配置
SpringUtils.getBean(WxMaApplicationRunner.class).initByTenant(tenantId);
// 重新初始化微信公众号配置
SpringUtils.getBean(WxMpApplicationRunner.class).initByTenant(tenantId);
// 重新初始化支付配置
SpringUtils.getBean(PayApplicationRunner.class).initByTenant(tenantId);
}
支付配置热更新
java
private void reloadPaymentConfig() {
String tenantId = TenantHelper.getTenantId();
SpringUtils.getBean(PayApplicationRunner.class).initByTenant(tenantId);
}
使用示例
配置微信小程序
java
// 1. 创建平台配置
PlatformBo platformBo = new PlatformBo();
platformBo.setType("mp-weixin");
platformBo.setName("我的小程序");
platformBo.setAppid("wx1234567890");
platformBo.setSecret("your-secret");
platformBo.setStatus("1");
platformService.add(platformBo);
// 2. 配置支付信息
PaymentBo paymentBo = new PaymentBo();
paymentBo.setType("wechat");
paymentBo.setMchName("我的商户");
paymentBo.setMchId("1234567890");
paymentBo.setMchKey("your-mch-key");
paymentBo.setStatus("1");
paymentService.add(paymentBo);
用户登录认证
java
// 前端调用登录接口
POST /auth/login
{
"platform": "miniapp",
"body": {
"platform": "mp-weixin",
"appid": "wx1234567890",
"platformCode": "授权码"
}
}
// 返回结果
{
"code": 200,
"msg": "登录成功",
"data": {
"accessToken": "eyJ0eXAiOiJKV1Q...",
"expireIn": 7200
}
}
最佳实践
📋 配置管理
- 敏感信息(如密钥)加密存储
- 支持配置热更新,无需重启服务
- 按租户隔离配置,避免数据混淆
🔐 安全考虑
- 登录令牌设置合理的过期时间
- 敏感API添加权限校验
- 支付配置访问权限严格控制
🚀 性能优化
- 平台配置缓存,减少数据库查询
- 异步处理配置更新,提升响应速度
- 合理使用数据库索引
🔧 扩展建议
- 新增平台时,实现对应的认证策略
- 支付方式扩展遵循统一接口规范
- 配置项变更通过事件机制通知相关服务