feat(微信用户): 实现微信用户自动创建及信息获取功能
新增微信昵称生成器工具类,用于生成随机昵称 在WxUserApplicationService中添加getOrCreateUserByOpenid方法,实现用户不存在时自动创建 修改WxController的mpCodeToOpenId接口返回完整用户信息 新增getWxUserByOpenid接口用于获取用户信息
This commit is contained in:
parent
03b50542fa
commit
147194a116
|
|
@ -1,3 +1,4 @@
|
||||||
{
|
{
|
||||||
"java.jdt.ls.vmargs": "-XX:+UseParallelGC -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 -Dsun.zip.disableMemoryMapping=true -Xmx2G -Xms100m -Xlog:disable"
|
"java.jdt.ls.vmargs": "-XX:+UseParallelGC -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 -Dsun.zip.disableMemoryMapping=true -Xmx2G -Xms100m -Xlog:disable",
|
||||||
|
"java.compile.nullAnalysis.mode": "automatic"
|
||||||
}
|
}
|
||||||
|
|
@ -6,11 +6,15 @@ import com.agileboot.common.core.dto.ResponseDTO;
|
||||||
import com.agileboot.common.exception.ApiException;
|
import com.agileboot.common.exception.ApiException;
|
||||||
import com.agileboot.common.exception.error.ErrorCode;
|
import com.agileboot.common.exception.error.ErrorCode;
|
||||||
import com.agileboot.domain.wx.WxService;
|
import com.agileboot.domain.wx.WxService;
|
||||||
|
import com.agileboot.domain.wx.user.WxUserApplicationService;
|
||||||
|
import com.agileboot.domain.wx.user.dto.WxUserDTO;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.springframework.web.bind.annotation.CrossOrigin;
|
import org.springframework.web.bind.annotation.CrossOrigin;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.client.RestClientException;
|
import org.springframework.web.client.RestClientException;
|
||||||
|
|
||||||
|
|
@ -25,6 +29,8 @@ import java.util.Map;
|
||||||
public class WxController {
|
public class WxController {
|
||||||
private final WxService wxService;
|
private final WxService wxService;
|
||||||
|
|
||||||
|
private final WxUserApplicationService wxUserApplicationService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取小程序用户OpenID
|
* 获取小程序用户OpenID
|
||||||
* @param code 微信授权码
|
* @param code 微信授权码
|
||||||
|
|
@ -32,14 +38,40 @@ public class WxController {
|
||||||
* @throws ApiException 当code无效或微信接口调用失败时抛出
|
* @throws ApiException 当code无效或微信接口调用失败时抛出
|
||||||
*/
|
*/
|
||||||
@GetMapping("/mpCodeToOpenId")
|
@GetMapping("/mpCodeToOpenId")
|
||||||
public ResponseDTO<String> mpCodeToOpenId(String code) {
|
public ResponseDTO<WxUserDTO> mpCodeToOpenId(String code) {
|
||||||
try {
|
try {
|
||||||
String openid = wxService.getSmallOpenid(code);
|
String openid = wxService.getSmallOpenid(code);
|
||||||
|
// 校验openid是否为空
|
||||||
|
if (StringUtils.isBlank(openid)) {
|
||||||
|
throw new ApiException(ErrorCode.Client.COMMON_REQUEST_PARAMETERS_INVALID, "根据code获取openid失败");
|
||||||
|
}
|
||||||
|
|
||||||
return ResponseDTO.ok(openid);
|
return ResponseDTO.ok(wxUserApplicationService.getOrCreateUserByOpenid(openid));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("获取openid失败", e);
|
log.error("获取openid失败", e);
|
||||||
return ResponseDTO.fail(new ApiException(ErrorCode.Client.COMMON_REQUEST_PARAMETERS_INVALID, e.getMessage()));
|
return ResponseDTO.fail(new ApiException(ErrorCode.Client.COMMON_REQUEST_PARAMETERS_INVALID, e.getMessage()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据openid获取微信用户信息
|
||||||
|
* @param openid 微信用户openid
|
||||||
|
* @return 微信用户信息
|
||||||
|
* @throws ApiException 当openid无效或用户不存在时抛出
|
||||||
|
*/
|
||||||
|
@GetMapping("/getWxUserByOpenid")
|
||||||
|
public ResponseDTO<WxUserDTO> getWxUserByOpenid(@RequestParam("openid") String openid) {
|
||||||
|
try {
|
||||||
|
WxUserDTO wxUserDTO = wxUserApplicationService.getUserDetailByOpenid(openid);
|
||||||
|
|
||||||
|
if (wxUserDTO == null) {
|
||||||
|
return ResponseDTO.fail(new ApiException(ErrorCode.Client.COMMON_REQUEST_PARAMETERS_INVALID, "用户不存在"));
|
||||||
|
}
|
||||||
|
|
||||||
|
return ResponseDTO.ok(wxUserDTO);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("获取微信用户信息失败", e);
|
||||||
|
return ResponseDTO.fail(new ApiException(ErrorCode.Client.COMMON_REQUEST_PARAMETERS_INVALID, e.getMessage()));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ package com.agileboot.domain.wx.user;
|
||||||
|
|
||||||
import com.agileboot.common.core.page.PageDTO;
|
import com.agileboot.common.core.page.PageDTO;
|
||||||
import com.agileboot.domain.common.command.BulkOperationCommand;
|
import com.agileboot.domain.common.command.BulkOperationCommand;
|
||||||
|
import com.agileboot.domain.wx.utils.WxNicknameGenerator;
|
||||||
import com.agileboot.domain.wx.user.command.AddWxUserCommand;
|
import com.agileboot.domain.wx.user.command.AddWxUserCommand;
|
||||||
import com.agileboot.domain.wx.user.command.UpdateWxUserCommand;
|
import com.agileboot.domain.wx.user.command.UpdateWxUserCommand;
|
||||||
import com.agileboot.domain.wx.user.db.SearchWxUserDO;
|
import com.agileboot.domain.wx.user.db.SearchWxUserDO;
|
||||||
|
|
@ -166,4 +167,39 @@ public class WxUserApplicationService {
|
||||||
// 更新
|
// 更新
|
||||||
model.updateById();
|
model.updateById();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据openid获取或创建微信用户
|
||||||
|
* 如果openid对应数据不存在,则创建一条新数据到数据库
|
||||||
|
*
|
||||||
|
* @param openid 微信openid
|
||||||
|
* @return 微信用户信息
|
||||||
|
*/
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public WxUserDTO getOrCreateUserByOpenid(String openid) {
|
||||||
|
// 先尝试查询用户
|
||||||
|
WxUserDTO userDTO = getUserDetailByOpenid(openid);
|
||||||
|
|
||||||
|
// 如果用户不存在,则创建新用户
|
||||||
|
if (userDTO == null) {
|
||||||
|
AddWxUserCommand command = new AddWxUserCommand();
|
||||||
|
command.setOpenid(openid);
|
||||||
|
command.setNickName(WxNicknameGenerator.generateRandomNickname()); // 使用昵称生成器生成随机昵称
|
||||||
|
|
||||||
|
// 保存新用户
|
||||||
|
WxUserModel model = modelFactory.create();
|
||||||
|
model.loadAddWxUserCommand(command);
|
||||||
|
|
||||||
|
// 业务校验(只校验openid唯一性,因为是新用户,其他字段有默认值)
|
||||||
|
model.checkOpenidIsUnique();
|
||||||
|
|
||||||
|
// 保存
|
||||||
|
model.insert();
|
||||||
|
|
||||||
|
// 返回新创建的用户信息
|
||||||
|
userDTO = getUserDetailByOpenid(openid);
|
||||||
|
}
|
||||||
|
|
||||||
|
return userDTO;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,53 @@
|
||||||
|
package com.agileboot.domain.wx.utils;
|
||||||
|
|
||||||
|
import java.security.SecureRandom;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 微信昵称生成器
|
||||||
|
* 生成格式:固定前缀_随机6位大小写字母数字
|
||||||
|
*
|
||||||
|
* @author your-name
|
||||||
|
* @since 2025-01-01
|
||||||
|
*/
|
||||||
|
public class WxNicknameGenerator {
|
||||||
|
|
||||||
|
private static final String PREFIX = "微信用户";
|
||||||
|
private static final String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
||||||
|
private static final int RANDOM_LENGTH = 6;
|
||||||
|
private static final SecureRandom random = new SecureRandom();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 生成随机昵称
|
||||||
|
* 格式:微信用户_XXXXXX(其中XXXXXX为6位随机大小写字母数字)
|
||||||
|
*
|
||||||
|
* @return 生成的昵称
|
||||||
|
*/
|
||||||
|
public static String generateRandomNickname() {
|
||||||
|
StringBuilder randomPart = new StringBuilder(RANDOM_LENGTH);
|
||||||
|
|
||||||
|
for (int i = 0; i < RANDOM_LENGTH; i++) {
|
||||||
|
int index = random.nextInt(CHARACTERS.length());
|
||||||
|
randomPart.append(CHARACTERS.charAt(index));
|
||||||
|
}
|
||||||
|
|
||||||
|
return PREFIX + "_" + randomPart.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 生成指定前缀的随机昵称
|
||||||
|
* 格式:{前缀}_XXXXXX(其中XXXXXX为6位随机大小写字母数字)
|
||||||
|
*
|
||||||
|
* @param prefix 自定义前缀
|
||||||
|
* @return 生成的昵称
|
||||||
|
*/
|
||||||
|
public static String generateRandomNickname(String prefix) {
|
||||||
|
StringBuilder randomPart = new StringBuilder(RANDOM_LENGTH);
|
||||||
|
|
||||||
|
for (int i = 0; i < RANDOM_LENGTH; i++) {
|
||||||
|
int index = random.nextInt(CHARACTERS.length());
|
||||||
|
randomPart.append(CHARACTERS.charAt(index));
|
||||||
|
}
|
||||||
|
|
||||||
|
return prefix + "_" + randomPart.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue