聊天室url修正

This commit is contained in:
2026-01-09 16:40:28 +08:00
parent bfd06dd8f6
commit f4b7337210
18 changed files with 360 additions and 124 deletions

View File

@@ -127,64 +127,94 @@ public class GuestController {
// ========================= 微信小程序用户识别登录 =========================
/**
* 模拟用户数据用于测试没有手机号校验appid时使用
* 格式:手机号 -> [姓名, 微信ID, 角色]
*/
private static final java.util.Map<String, String[]> MOCK_USERS = new java.util.HashMap<String, String[]>() {{
put("17857100375", new String[]{"超级管理员", "17857100375", "admin"});
put("13870055185", new String[]{"魏瑶", "75719954", "engineer"});
put("15170466624", new String[]{"刘杰", "liujie1370984851", "engineer"});
put("15170037929", new String[]{"万家明", "WJM15170037929", "engineer"});
put("19100185270", new String[]{"戴斌", "BaiBin0714", "guest"});
put("15797790517", new String[]{"余其跃", "a540378218", "guest"});
put("15879126468", new String[]{"李小华", "wxid_vgmmzfdcwx9021", "guest"});
}};
@Operation(summary = "微信小程序用户识别登录")
@PostMapping("/identify")
public ResultDomain<LoginDomain> identifyUser(@RequestBody LoginParam loginParam, HttpServletRequest request) {
logger.info("微信小程序登录请求: wechatId={}, code={}, phoneCode={}",
logger.info("微信小程序登录请求: wechatId={}, phone={}, mockMode={}",
loginParam.getWechatId(),
loginParam.getCode() != null ? loginParam.getCode().substring(0, Math.min(10, loginParam.getCode().length())) + "..." : null,
loginParam.getPhoneCode() != null ? "" : "");
loginParam.getPhone(),
loginParam.getMockMode() != null ? loginParam.getMockMode() : false);
// 1. 处理微信登录code获取openid
String openid = null;
String sessionKey = null;
if (loginParam.getCode() != null && !loginParam.getCode().trim().isEmpty()) {
ResultDomain<WeChatSessionResult> sessionResult = weChatMiniProgramService.code2Session(loginParam.getCode());
if (sessionResult.getSuccess() && sessionResult.getData() != null) {
openid = sessionResult.getData().getOpenid();
sessionKey = sessionResult.getData().getSessionKey();
logger.info("获取openid成功: {}", openid);
// 使用openid作为wechatId
loginParam.setWechatId(openid);
// ========== 模拟模式:直接使用传入的手机号匹配用户 ==========
if (Boolean.TRUE.equals(loginParam.getMockMode()) && loginParam.getPhone() != null) {
String phone = loginParam.getPhone().trim();
String[] mockUser = MOCK_USERS.get(phone);
if (mockUser != null) {
// 设置模拟用户信息
loginParam.setUsername(mockUser[0]);
loginParam.setWechatId(mockUser[1]);
logger.info("模拟登录: phone={}, name={}, wechatId={}, role={}",
phone, mockUser[0], mockUser[1], mockUser[2]);
} else {
logger.warn("获取openid失败: {}", sessionResult.getMessage());
return ResultDomain.failure("未找到该手机号对应的测试用户");
}
}
// 2. 处理手机号授权
String phoneNumber = null;
// 方式1使用phoneCode获取手机号新版API推荐
if (loginParam.getPhoneCode() != null && !loginParam.getPhoneCode().trim().isEmpty()) {
ResultDomain<WeChatPhoneResult> phoneResult = weChatMiniProgramService.getPhoneNumber(loginParam.getPhoneCode());
if (phoneResult.getSuccess() && phoneResult.getData() != null && phoneResult.getData().getPhoneInfo() != null) {
phoneNumber = phoneResult.getData().getPhoneInfo().getPurePhoneNumber();
if (phoneNumber == null) {
phoneNumber = phoneResult.getData().getPhoneInfo().getPhoneNumber();
} else {
// ========== 正常模式通过微信API获取手机号 ==========
// 1. 处理微信登录code获取openid
String openid = null;
String sessionKey = null;
if (loginParam.getCode() != null && !loginParam.getCode().trim().isEmpty()) {
ResultDomain<WeChatSessionResult> sessionResult = weChatMiniProgramService.code2Session(loginParam.getCode());
if (sessionResult.getSuccess() && sessionResult.getData() != null) {
openid = sessionResult.getData().getOpenid();
sessionKey = sessionResult.getData().getSessionKey();
logger.info("获取openid成功: {}", openid);
loginParam.setWechatId(openid);
} else {
logger.warn("获取openid失败: {}", sessionResult.getMessage());
}
logger.info("通过phoneCode获取手机号成功: {}", phoneNumber);
} else {
logger.warn("通过phoneCode获取手机号失败: {}", phoneResult.getMessage());
}
}
// 方式2使用encryptedData和iv解密手机号旧版API
if (phoneNumber == null && sessionKey != null
&& loginParam.getEncryptedData() != null && !loginParam.getEncryptedData().trim().isEmpty()
&& loginParam.getIv() != null && !loginParam.getIv().trim().isEmpty()) {
ResultDomain<String> decryptResult = weChatMiniProgramService.decryptPhoneNumber(
sessionKey, loginParam.getEncryptedData(), loginParam.getIv());
if (decryptResult.getSuccess() && decryptResult.getData() != null) {
phoneNumber = decryptResult.getData();
logger.info("通过解密获取手机号成功: {}", phoneNumber);
} else {
logger.warn("解密手机号失败: {}", decryptResult.getMessage());
// 2. 处理手机号授权
String phoneNumber = null;
// 方式1使用phoneCode获取手机号新版API推荐
if (loginParam.getPhoneCode() != null && !loginParam.getPhoneCode().trim().isEmpty()) {
ResultDomain<WeChatPhoneResult> phoneResult = weChatMiniProgramService.getPhoneNumber(loginParam.getPhoneCode());
if (phoneResult.getSuccess() && phoneResult.getData() != null && phoneResult.getData().getPhoneInfo() != null) {
phoneNumber = phoneResult.getData().getPhoneInfo().getPurePhoneNumber();
if (phoneNumber == null) {
phoneNumber = phoneResult.getData().getPhoneInfo().getPhoneNumber();
}
logger.info("通过phoneCode获取手机号成功: {}", phoneNumber);
} else {
logger.warn("通过phoneCode获取手机号失败: {}", phoneResult.getMessage());
}
}
// 方式2使用encryptedData和iv解密手机号旧版API
if (phoneNumber == null && sessionKey != null
&& loginParam.getEncryptedData() != null && !loginParam.getEncryptedData().trim().isEmpty()
&& loginParam.getIv() != null && !loginParam.getIv().trim().isEmpty()) {
ResultDomain<String> decryptResult = weChatMiniProgramService.decryptPhoneNumber(
sessionKey, loginParam.getEncryptedData(), loginParam.getIv());
if (decryptResult.getSuccess() && decryptResult.getData() != null) {
phoneNumber = decryptResult.getData();
logger.info("通过解密获取手机号成功: {}", phoneNumber);
} else {
logger.warn("解密手机号失败: {}", decryptResult.getMessage());
}
}
// 设置手机号
if (phoneNumber != null) {
loginParam.setPhone(phoneNumber);
}
}
// 设置手机号
if (phoneNumber != null) {
loginParam.setPhone(phoneNumber);
}
// 验证参数必须有wechatId或phone