5 天以前 | cuilei | ![]() |
5 天以前 | cuilei | ![]() |
5 天以前 | Houjie | ![]() |
6 天以前 | Houjie | ![]() |
6 天以前 | Houjie | ![]() |
8 天以前 | Houjie | ![]() |
2025-07-11 | Houjie | ![]() |
2025-07-11 | Houjie | ![]() |
2025-07-11 | Houjie | ![]() |
2025-07-10 | Houjie | ![]() |
2025-07-09 | Houjie | ![]() |
2025-07-09 | Houjie | ![]() |
2025-07-03 | Houjie | ![]() |
2025-07-01 | Houjie | ![]() |
2025-06-30 | Houjie | ![]() |
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdLoginController.java
@@ -317,9 +317,11 @@ builder.append("&response_type=code"); // 应用授权作用域。 // snsapi_base:静默授权,可获取成员的的基础信息(UserId与DeviceId); builder.append("&scope=snsapi_base"); //builder.append("&scope=snsapi_base"); builder.append("&scope=snsapi_privateinfo"); // 手动授权作用域 // 重定向后会带上state参数,长度不可超过128个字节 builder.append("&state=").append(state); builder.append("&agentid=").append(config.getAgentId()); // 补充AgentID // 终端使用此参数判断是否需要带上身份信息 builder.append("#wechat_redirect"); url = builder.toString(); @@ -376,6 +378,10 @@ SysUser loginUser; if (ThirdAppConfig.WECHAT_ENTERPRISE.equalsIgnoreCase(source)) { log.info("【企业微信】OAuth2登录进入callback:code=" + code + ", state=" + state); if (code == null) { log.info("用户取消了企业微信授权"); return "用户取消了授权"; } loginUser = thirdAppWechatEnterpriseService.oauth2Login(code); if (loginUser == null) { return "登录失败"; lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/entity/SysThirdAccount.java
@@ -77,4 +77,7 @@ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") private java.util.Date updateTime; /**手机号*/ @Excel(name = "手机号", width = 15) private java.lang.String phone; } lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserMapper.java
@@ -76,6 +76,9 @@ * @return */ public SysUser getUserByPhone(@Param("phone") String phone); /** 根据工号查询用户信息 */ SysUser getUserByWorkNo(@Param("workNo") String workNo); /** @@ -183,4 +186,5 @@ * 根据角色编码和设备编号查询用户 */ List<SysUser> getEquipmentAdmin(@Param("roleCode") String roleCode, @Param("equipmentId") String equipmentId); } lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserMapper.xml
@@ -217,4 +217,7 @@ WHERE t3.role_code = #{roleCode} AND equipment_ids LIKE concat(concat('%',#{equipmentId}),'%') </select> <select id="getUserByWorkNo" resultType="org.jeecg.modules.system.entity.SysUser"> select * from sys_user where work_no = #{workNo} and del_flag = 0 </select> </mapper> lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/model/ThirdLoginModel.java
@@ -33,6 +33,11 @@ private String avatar; /** * 第三方登录 手机号 */ private String phone; /** * 账号 后缀第三方登录 防止账号重复 */ private String suffix; @@ -60,6 +65,14 @@ this.avatar = avatar; } public ThirdLoginModel(String source,String uuid,String username,String avatar,String phone){ this.source = source; this.uuid = uuid; this.username = username; this.avatar = avatar; this.phone = phone; } /** * 获取登录账号名 * @return lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysThirdAccountServiceImpl.java
@@ -72,7 +72,7 @@ query.eq(SysThirdAccount::getThirdUserUuid,thirdUserUuid); SysThirdAccount account = sysThirdAccountMapper.selectOne(query); //通过用户名查询数据库是否已存在 SysUser userByName = sysUserMapper.getUserByName(thirdUserUuid); SysUser userByName = sysUserMapper.getUserByName(thirdUserUuid.substring(2)); if(null!=userByName){ //如果账号存在的话,则自动加上一个时间戳 String format = DateUtils.yyyymmddhhmmss.get().format(new Date()); @@ -83,7 +83,8 @@ user.setActivitiSync(CommonConstant.ACT_SYNC_0); user.setDelFlag(CommonConstant.DEL_FLAG_0); user.setStatus(1); user.setUsername(thirdUserUuid); //用户名取工号去除前两位字母后面的值 user.setUsername(thirdUserUuid.substring(2)); user.setPhone(phone); //设置初始密码 String salt = oConvertUtils.randomGen(8); @@ -148,6 +149,7 @@ user.setRealname(tlm.getUsername()); user.setThirdUserUuid(tlm.getUuid()); user.setThirdUserId(tlm.getUuid()); user.setPhone(tlm.getPhone()); super.save(user); return user; } lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppDingtalkServiceImpl.java
@@ -827,7 +827,7 @@ return null; } int agentId = thirdAppConfig.getDingtalk().getAgentIdInt(); return JdtMessageAPI.recallMessage(agentId, msgTaskId, getAccessToken()); return JdtMessageAPI.recallMessage(String.valueOf(agentId), msgTaskId, getAccessToken()); } /** lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppWechatEnterpriseServiceImpl.java
@@ -390,7 +390,7 @@ return syncInfo; } // 获取企业微信所有的用户 List<User> qwUsersList = JwUserAPI.getDetailUsersByDepartid("1433010418", null, null, accessToken); List<User> qwUsersList = JwUserAPI.getDetailUsersByDepartid("1", null, null, accessToken); if (qwUsersList == null) { syncInfo.addFailInfo("企业微信用户列表查询失败!"); return syncInfo; @@ -405,7 +405,7 @@ * 2. 本地表里没有,就先用手机号判断,不通过再用username判断。 */ SysThirdAccount sysThirdAccount = sysThirdAccountService.getOneByThirdUserId(qwUser.getUserid(), THIRD_TYPE); List<SysUser> collect = sysUsersList.stream().filter(user -> qwUser.getUserid().equals(user.getUsername()) List<SysUser> collect = sysUsersList.stream().filter(user -> qwUser.getUserid().equals(user.getWorkNo()) ).collect(Collectors.toList()); if (CollectionUtil.isNotEmpty(collect)) { @@ -643,7 +643,7 @@ sysUser.setDelFlag(0); sysUser.setStatus(1); // 通过 username 来关联 sysUser.setUsername(user.getUserid()); sysUser.setUsername(user.getUserid().substring(2)); // 密码默认为 “123456”,随机加盐 String password = "123456", salt = oConvertUtils.randomGen(8); String passwordEncode = PasswordUtil.encrypt(sysUser.getUsername(), password, salt); @@ -689,7 +689,9 @@ sysUser.setStatus(qwUser.getEnable() == 1 ? 1 : 2); } // 座机号 sysUser.setTelephone(qwUser.getTelephone()); if (StringUtils.isNotBlank(qwUser.getTelephone())) { sysUser.setTelephone(qwUser.getTelephone()); } // --- 企业微信没有逻辑删除的功能 // sysUser.setDelFlag() @@ -1036,7 +1038,17 @@ if (accessToken == null) { return null; } String appUserId = this.getUserIdByThirdCode(code, accessToken); // 通过code获取用户信息(包含user_ticket) JSONObject userInfoResult = this.getUserInfoByCode(code, accessToken); if (userInfoResult == null || userInfoResult.getInteger("errcode") != 0) { log.error("获取企业微信用户信息失败,code: {}", code); return null; } String appUserId = userInfoResult.getString("UserId"); String userTicket = userInfoResult.getString("user_ticket"); // 手动授权返回的用户票据 if (appUserId != null) { // 判断第三方用户表有没有这个人 LambdaQueryWrapper<SysThirdAccount> queryWrapper = new LambdaQueryWrapper<>(); @@ -1044,18 +1056,63 @@ queryWrapper.or().eq(SysThirdAccount::getThirdUserId, appUserId); queryWrapper.eq(SysThirdAccount::getThirdType, THIRD_TYPE); SysThirdAccount thirdAccount = sysThirdAccountService.getOne(queryWrapper); // 通过user_ticket获取用户详细信息(包含手机号等敏感信息) JSONObject userDetail = this.getUserDetailByTicket(userTicket, accessToken); String mobile = userDetail.getString("mobile"); if (thirdAccount != null) { // 更新手机号(如果有) if (mobile != null && !mobile.isEmpty()) { thirdAccount.setPhone(mobile); sysThirdAccountService.updateById(thirdAccount); } return this.getSysUserByThird(thirdAccount, null, appUserId, accessToken); } else { // 直接创建新账号 // 直接创建新账号,包含手机号信息 User appUser = JwUserAPI.getUserByUserid(appUserId, accessToken); ThirdLoginModel tlm = new ThirdLoginModel(THIRD_TYPE, appUser.getUserid(), appUser.getName(), appUser.getAvatar()); ThirdLoginModel tlm = new ThirdLoginModel(THIRD_TYPE, appUser.getUserid(), appUser.getName(), appUser.getAvatar(), mobile); thirdAccount = sysThirdAccountService.saveThirdUser(tlm); return this.getSysUserByThird(thirdAccount, appUser, null, null); } } return null; } /** * 通过code获取用户信息(包含user_ticket) */ private JSONObject getUserInfoByCode(String code, String accessToken) { String url = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo" + "?access_token=" + accessToken + "&code=" + code; try { String result = String.valueOf(RestUtil.get(url)); return JSONObject.parseObject(result); } catch (Exception e) { log.error("获取企业微信用户信息异常", e); return null; } } /** * 通过user_ticket获取用户详细信息(包含手机号等敏感信息) */ private JSONObject getUserDetailByTicket(String userTicket, String accessToken) { String url = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserdetail"; JSONObject params = new JSONObject(); params.put("user_ticket", userTicket); try { String result = String.valueOf(RestUtil.post(url + "?access_token=" + accessToken, JSONObject.parseObject(params.toJSONString()))); // String result = String.valueOf(RestUtil.post(url + "?access_token=" + accessToken, params.toJSONString())); return JSONObject.parseObject(result); } catch (Exception e) { log.error("获取企业微信用户详细信息异常", e); return new JSONObject(); // 返回空对象避免NPE } } /** * 根据第三方账号获取本地账号,如果不存在就创建 @@ -1069,14 +1126,24 @@ private SysUser getSysUserByThird(SysThirdAccount thirdAccount, User appUser, String appUserId, String accessToken) { String sysUserId = thirdAccount.getSysUserId(); if (oConvertUtils.isNotEmpty(sysUserId)) { return userMapper.selectById(sysUserId); SysUser sysUser = userMapper.selectById(sysUserId); if (sysUser != null && StringUtils.isBlank(sysUser.getPhone())) { //如果有用户,并且没有电话信息,更新进电话号码 SysUser user = new SysUser() .setId(sysUser.getId()) .setPhone(thirdAccount.getPhone()); userMapper.updateById(user); } return sysUser; } else { // 如果没有 sysUserId ,说明没有绑定账号,获取到手机号之后进行绑定 if (appUser == null) { appUser = JwUserAPI.getUserByUserid(appUserId, accessToken); } // 判断系统里是否有这个手机号的用户 SysUser sysUser = userMapper.getUserByPhone(appUser.getMobile()); appUser.setMobile(thirdAccount.getPhone()); // 判断系统里是否有这个用户,根据工号匹配 SysUser sysUser = userMapper.getUserByWorkNo(thirdAccount.getThirdUserId()); //SysUser sysUser = userMapper.getUserByPhone(appUser.getMobile()); if (sysUser != null) { thirdAccount.setAvatar(appUser.getAvatar()); thirdAccount.setRealname(appUser.getName()); @@ -1084,6 +1151,13 @@ thirdAccount.setThirdUserUuid(appUser.getUserid()); thirdAccount.setSysUserId(sysUser.getId()); sysThirdAccountService.updateById(thirdAccount); if (StringUtils.isBlank(sysUser.getPhone())) { //如果没有手机号码,更新 SysUser user = new SysUser() .setId(sysUser.getId()) .setPhone(appUser.getMobile()); userMapper.updateById(user); } return sysUser; } else { // 没有就走创建逻辑