|  | @@ -142,10 +142,53 @@ public class SocialUserServiceImpl implements SocialUserService {
 | 
	
		
			
				|  |  |                   null,userIds);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 授权
 | 
	
		
			
				|  |  | +     * @param socialType 社交平台的类型 {@link SocialTypeEnum}
 | 
	
		
			
				|  |  | +     * @param userType   用户类型
 | 
	
		
			
				|  |  | +     * @param code       授权码
 | 
	
		
			
				|  |  | +     * @param state      state
 | 
	
		
			
				|  |  | +     * @return 授权用户
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  |      public SocialUserDO authSocialUser(Integer socialType, Integer userType, String code, String state) {
 | 
	
		
			
				|  |  | -        return this.authSocialUser(socialType, userType, code, state, false, false);
 | 
	
		
			
				|  |  | +        // 优先从 DB 中获取,因为 code 有且可以使用一次。
 | 
	
		
			
				|  |  | +        // 在社交登录时,当未绑定 User 时,需要绑定登录,此时需要 code 使用两次
 | 
	
		
			
				|  |  | +        SocialUserDO socialUser = socialUserMapper.selectByTypeAndCodeAnState(socialType, code, state);
 | 
	
		
			
				|  |  | +        if (socialUser != null) {
 | 
	
		
			
				|  |  | +            return socialUser;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        AuthUser authUser = socialClientService.getAuthUser(socialType, userType, code, state);
 | 
	
		
			
				|  |  | +        Assert.notNull(authUser, "三方用户不能为空");
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        return getSocialUserDO(socialType, code, state, socialUser, authUser);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 获得社交用户
 | 
	
		
			
				|  |  | +     *
 | 
	
		
			
				|  |  | +     * @param socialType 社交平台的类型
 | 
	
		
			
				|  |  | +     * @param code 授权码
 | 
	
		
			
				|  |  | +     * @param state 授权 state
 | 
	
		
			
				|  |  | +     * @return 社交用户
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    @NotNull
 | 
	
		
			
				|  |  | +    private SocialUserDO getSocialUserDO(Integer socialType, String code, String state, SocialUserDO socialUser, AuthUser authUser) {
 | 
	
		
			
				|  |  | +        if (socialUser == null) {
 | 
	
		
			
				|  |  | +            socialUser = new SocialUserDO();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        socialUser.setType(socialType).setCode(code).setState(state) // 需要保存 code + state 字段,保证后续可查询
 | 
	
		
			
				|  |  | +                .setOpenid(authUser.getUuid()).setToken(authUser.getToken().getAccessToken()).setRawTokenInfo((toJsonString(authUser.getToken())))
 | 
	
		
			
				|  |  | +                .setNickname(authUser.getNickname()).setAvatar(authUser.getAvatar()).setRawUserInfo(toJsonString(authUser.getRawUserInfo()));
 | 
	
		
			
				|  |  | +        if (socialUser.getId() == null) {
 | 
	
		
			
				|  |  | +            socialUserMapper.insert(socialUser);
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +            socialUserMapper.updateById(socialUser);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return socialUser;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      /**
 | 
	
		
			
				|  |  |       * 授权获得对应的社交用户
 | 
	
		
			
				|  |  |       * 如果授权失败,则会抛出 {@link ServiceException} 异常
 | 
	
	
		
			
				|  | @@ -183,18 +226,7 @@ public class SocialUserServiceImpl implements SocialUserService {
 | 
	
		
			
				|  |  |              stringRedisTemplate.opsForValue().set("auth_user:" + code, JsonUtils.toJsonString(authUser) , 60 * 10 , TimeUnit.SECONDS);
 | 
	
		
			
				|  |  |              throw exception(AUTH_LOGIN_USER_IS_FIRST);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -        if (socialUser == null) {
 | 
	
		
			
				|  |  | -            socialUser = new SocialUserDO();
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        socialUser.setType(socialType).setCode(code).setState(state) // 需要保存 code + state 字段,保证后续可查询
 | 
	
		
			
				|  |  | -                .setOpenid(authUser.getUuid()).setToken(authUser.getToken().getAccessToken()).setRawTokenInfo((toJsonString(authUser.getToken())))
 | 
	
		
			
				|  |  | -                .setNickname(authUser.getNickname()).setAvatar(authUser.getAvatar()).setRawUserInfo(toJsonString(authUser.getRawUserInfo()));
 | 
	
		
			
				|  |  | -        if (socialUser.getId() == null) {
 | 
	
		
			
				|  |  | -            socialUserMapper.insert(socialUser);
 | 
	
		
			
				|  |  | -        } else {
 | 
	
		
			
				|  |  | -            socialUserMapper.updateById(socialUser);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        return socialUser;
 | 
	
		
			
				|  |  | +        return getSocialUserDO(socialType, code, state, socialUser, authUser);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 |