From c64caa25a8f6ffa026527828c1da3cd97c5c99c6 Mon Sep 17 00:00:00 2001 From: cuilei <ray_tsu1@163.com> Date: 星期四, 17 七月 2025 16:22:34 +0800 Subject: [PATCH] 企业微信H5登录手动授权并获取手机号码适配修改,用户同步根据现场情况调整 --- lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppWechatEnterpriseServiceImpl.java | 94 ++++++++++++++++++++++++++++--- lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdLoginController.java | 8 ++ lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserMapper.java | 4 + lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/model/ThirdLoginModel.java | 13 ++++ lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysThirdAccountServiceImpl.java | 6 + lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/entity/SysThirdAccount.java | 2 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserMapper.xml | 3 + 7 files changed, 117 insertions(+), 13 deletions(-) diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdLoginController.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdLoginController.java index 0d7a4c4..ea29976 100644 --- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdLoginController.java +++ b/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锛氶潤榛樻巿鏉冿紝鍙幏鍙栨垚鍛樼殑鐨勫熀纭�淇℃伅锛圲serId涓嶥eviceId锛夛紱 - builder.append("&scope=snsapi_base"); + //builder.append("&scope=snsapi_base"); + builder.append("&scope=snsapi_privateinfo"); // 鎵嬪姩鎺堟潈浣滅敤鍩� // 閲嶅畾鍚戝悗浼氬甫涓妔tate鍙傛暟锛岄暱搴︿笉鍙秴杩�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("銆愪紒涓氬井淇°�慜Auth2鐧诲綍杩涘叆callback锛歝ode=" + code + ", state=" + state); + if (code == null) { + log.info("鐢ㄦ埛鍙栨秷浜嗕紒涓氬井淇℃巿鏉�"); + return "鐢ㄦ埛鍙栨秷浜嗘巿鏉�"; + } loginUser = thirdAppWechatEnterpriseService.oauth2Login(code); if (loginUser == null) { return "鐧诲綍澶辫触"; diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/entity/SysThirdAccount.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/entity/SysThirdAccount.java index f3b583f..4fc65ad 100644 --- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/entity/SysThirdAccount.java +++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/entity/SysThirdAccount.java @@ -77,4 +77,6 @@ @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 String phone; } diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserMapper.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserMapper.java index 7966336..fc85322 100644 --- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserMapper.java +++ b/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); + } diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserMapper.xml b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserMapper.xml index 3e751a9..9d60c51 100644 --- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserMapper.xml +++ b/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> \ No newline at end of file diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/model/ThirdLoginModel.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/model/ThirdLoginModel.java index 4f6cc27..3b91689 100644 --- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/model/ThirdLoginModel.java +++ b/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 diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysThirdAccountServiceImpl.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysThirdAccountServiceImpl.java index 9629d1a..09a5d95 100644 --- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysThirdAccountServiceImpl.java +++ b/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; } diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppWechatEnterpriseServiceImpl.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppWechatEnterpriseServiceImpl.java index f98789b..f25dc67 100644 --- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppWechatEnterpriseServiceImpl.java +++ b/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鑾峰彇鐢ㄦ埛淇℃伅锛堝寘鍚玼ser_ticket锛� + JSONObject userInfoResult = this.getUserInfoByCode(code, accessToken); + if (userInfoResult == null || userInfoResult.getInteger("errcode") != 0) { + log.error("鑾峰彇浼佷笟寰俊鐢ㄦ埛淇℃伅澶辫触锛宑ode: {}", 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鑾峰彇鐢ㄦ埛淇℃伅锛堝寘鍚玼ser_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(); // 杩斿洖绌哄璞¢伩鍏峃PE + } + } + /** * 鏍规嵁绗笁鏂硅处鍙疯幏鍙栨湰鍦拌处鍙凤紝濡傛灉涓嶅瓨鍦ㄥ氨鍒涘缓 @@ -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 { // 娌℃湁灏辫蛋鍒涘缓閫昏緫 -- Gitblit v1.9.3