Browse Source

Merge branch 'dev/2024/0529/update-app-Y' of feifan/mall-backend-app into master

修改微信绑定功能
Yangzw 10 tháng trước cách đây
mục cha
commit
0dda734696

+ 45 - 13
feifan-module-system/feifan-module-system-biz/src/main/java/cn/newfeifan/mall/module/system/service/social/SocialUserServiceImpl.java

@@ -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);
     }