Java实现微信登录

二.扫码成功后会回调该redirect的url

即 “/api/common/wx/redirect” 该回调接口地址

会将扫码授权登录成功时返回的code一并携带,请求该回调地址

public class WxInfoRespDTO extends BaseDTO {
          
   

    @ApiModelProperty(value = "会话标识", required=true)
    private String openId;

    @ApiModelProperty(value = "昵称", required=true)
    private String nickName;

    @ApiModelProperty(value = "性别", required=true)
    private Integer sex;

    @ApiModelProperty(value = "省份", required=true)
    private String province;

    @ApiModelProperty(value = "市", required=true)
    private String city;

    @ApiModelProperty(value = "国家", required=true)
    private String country;

    @ApiModelProperty(value = "头像地址", required=true)
    private String headimgurl;

    @ApiModelProperty(value = "头像地址", required=true)
    private String unionid;

    @ApiModelProperty(value = "头像地址", required=true)
    private List<String> privilege;
@Override
    public SysUserLoginDTO loginByThird(String loginType, String openId, String nickName, String avatar) {
          
   

        String userId = sysUserBindService.findBind(loginType, openId);

        // 不存在,创建新的用户
        if (StringUtils.isBlank(userId)) {
          
   
            // 随机产生数据
            SysUserLoginDTO dto = this.saveAndLogin(
                    RandomStringUtils.randomAlphabetic(16),
                    "A01",
                    nickName,
                    avatar,
                    RandomStringUtils.randomAlphanumeric(32));
            // 建立绑定关系
            sysUserBindService.save(false, dto.getId(), loginType, openId);
            return dto;
        }
        // 校验用户状态&密码
        SysUser user = this.getById(userId);
        return this.checkAndLogin(user, null);
    }
/**
     * 用户登录校验
     *
     * @param user
     */
    private SysUserLoginDTO checkAndLogin(SysUser user, String password) {
          
   

        if (user == null) {
          
   
            throw new ServiceException(ApiError.ERROR_90010001);
        }
        // 被禁用
        if (UserState.DISABLED.equals(user.getState())) {
          
   
            throw new ServiceException(ApiError.ERROR_90010005);
        }
        // 待审核
        if (UserState.AUDIT.equals(user.getState())) {
          
   
            throw new ServiceException(ApiError.ERROR_90010006);
        }
        if (!StringUtils.isBlank(password)) {
          
   
            boolean pass = PassHandler.checkPass(password, user.getSalt(), user.getPassword());
            if (!pass) {
          
   
                throw new ServiceException(ApiError.ERROR_90010002);
            }
        }
        return this.setToken(user);
    }

生成用户的token存储并将用户角色权限等信息,返回至前端

/**
     * 保存会话信息
     *
     * @param user
     * @return
     */
    @Override
    public SysUserLoginDTO setToken(SysUser user) {
          
   
        // 获取一个用户登录的信息
        String key = Constant.USER_NAME_KEY + user.getUserName();
        String json = redisService.getString(key);
        if (!StringUtils.isBlank(json)) {
          
   
            // 删除旧的会话
            redisService.del(key);
        }
        SysUserLoginDTO respDTO = new SysUserLoginDTO();
        BeanMapper.copy(user, respDTO);
        // 正常状态才登录
        if(UserState.NORMAL.equals(user.getState())){
          
   
            // 根据用户生成Token
            String token = JwtUtils.sign(user.getUserName());
            respDTO.setToken(token);
            // 添加角色信息
            this.fillRoleData(respDTO);
            // 权限表,用于前端控制按钮
            List<String> permissions = sysUserRoleService.findUserPermission(user.getId());
            respDTO.setPermissions(permissions);
            // 保存如Redis
            redisService.set(key, JSON.toJSONString(respDTO));
        }
        return respDTO;
    }
经验分享 程序员 微信小程序 职场和发展