企业微信H5登录手动授权并获取手机号码适配修改,用户同步根据现场情况调整
已修改7个文件
130 ■■■■■ 文件已修改
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdLoginController.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/entity/SysThirdAccount.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserMapper.xml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/model/ThirdLoginModel.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysThirdAccountServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppWechatEnterpriseServiceImpl.java 94 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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,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;
}
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/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 {
                // 没有就走创建逻辑