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详解
