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; }
下一篇:
JAVA中选择结构if和switch详解