Explorar o código

1。添加注销账户操作(手机,邮箱)
2。添加账户注销苹果验证操作,添加p8文件
3。添加user_delete_log字段
4。修改登陆返回appleid

a0000 %!s(int64=2) %!d(string=hai) anos
pai
achega
131befeba2

+ 5 - 1
src/main/java/com/YuyeTech/TPlat/enums/ResultEnum.java

@@ -37,7 +37,11 @@ public enum ResultEnum {
 
     VERSION_CODE_ERROR(321,"version code 错误"),
 
-
+    APPLE_REVOKE_ERROR(322,"apple:注销用户失败!"),
+    REVOKE_ERROR(323,"注销用户方式异常!"),
+    WEIXIN_REVOKE_ERROR(324,"WEIXIN:注销用户失败!"),
+    PHONE_NUMBER_REVOKE_ERROR(324,"PHONE:注销用户失败!"),
+    BOX_EMAIL_REVOKE_ERROR(324,"WEIXIN:注销用户失败!"),
     //wallets
     WALLETS_GET_ERROR(401,"获取WALLETS错误"),
     WALLETS_MODIFY_ERROR(402,"修改WALLETS数据错误"),

+ 4 - 0
src/main/java/com/YuyeTech/TPlat/game/userDeleteLog/pojo/UserDeleteLog.java

@@ -12,6 +12,8 @@ public class UserDeleteLog implements Serializable {
     @Id
     private String userId;//
 
+    private String username;//
+
     private String telephoneNumber;//电话
 
     private String email;//邮箱
@@ -24,6 +26,8 @@ public class UserDeleteLog implements Serializable {
 
     private Integer status;//0:挂起数据,1:已删除,2:已恢复
 
+    private String type;
+
     private Date createTime;//创建时间
 
     private Date updateTime;//修改时间

+ 4 - 0
src/main/java/com/YuyeTech/TPlat/game/userDeleteLog/vo/UserDeleteLogSimpleVo.java

@@ -8,6 +8,8 @@ import java.util.Date;
 public class UserDeleteLogSimpleVo implements Serializable {
     private String userId;//
 
+    private String username;//
+
     private String telephoneNumber;//电话
 
     private String email;//邮箱
@@ -20,6 +22,8 @@ public class UserDeleteLogSimpleVo implements Serializable {
 
     private Integer status;//0:挂起数据,1:已删除,2:已恢复
 
+    private String type;
+
     private Date createTime;//创建时间
 
     private Date updateTime;//修改时间

+ 4 - 0
src/main/java/com/YuyeTech/TPlat/game/userDeleteLog/vo/UserDeleteLogVo.java

@@ -8,6 +8,8 @@ import java.util.Date;
 public class UserDeleteLogVo extends PageCondition implements Serializable {
     private String userId;//
 
+    private String username;
+
     private String telephoneNumber;//电话
 
     private String email;//邮箱
@@ -20,6 +22,8 @@ public class UserDeleteLogVo extends PageCondition implements Serializable {
 
     private Integer status;//0:挂起数据,1:已删除,2:已恢复
 
+    private String type;
+
     private Date createTime;//创建时间
 
     private Date updateTime;//修改时间

+ 51 - 5
src/main/java/com/YuyeTech/TPlat/game/userinfo/controller/ManagerController.java

@@ -2,6 +2,11 @@ package com.YuyeTech.TPlat.game.userinfo.controller;
 
 import com.YuyeTech.TPlat.VO.ResultVO;
 import com.YuyeTech.TPlat.constant.RedisConstant;
+import com.YuyeTech.TPlat.enums.RedisType;
+import com.YuyeTech.TPlat.enums.UserEnum;
+import com.YuyeTech.TPlat.game.TP_WxInfo.projo.WxInfo;
+import com.YuyeTech.TPlat.game.TP_WxInfo.service.WxInfoService;
+import com.YuyeTech.TPlat.game.userinfo.projo.MainInfo;
 import com.YuyeTech.TPlat.game.userinfo.projo.UserInfo;
 import com.YuyeTech.TPlat.enums.ResultEnum;
 import com.YuyeTech.TPlat.form.FeedbackForm;
@@ -9,6 +14,8 @@ import com.YuyeTech.TPlat.game.gameInfo.service.GameInfoService;
 import com.YuyeTech.TPlat.game.userinfo.service.MainInfoService;
 import com.YuyeTech.TPlat.game.userinfo.service.UserInfoService;
 import com.YuyeTech.TPlat.utils.AliyunOSSUtil;
+import com.YuyeTech.TPlat.utils.AppleUtil;
+import com.YuyeTech.TPlat.utils.RedisSettingMap;
 import com.YuyeTech.TPlat.utils.ResultVOUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
@@ -48,6 +55,12 @@ public class ManagerController {
     @Autowired
     private UserInfoService userInfoService;
 
+    @Autowired
+    private RedisSettingMap redisSettingMap;
+
+    @Autowired
+    private WxInfoService wxInfoService;
+
     /**
      * 通过类型来判断删除
      * 1。电话:密码或者验证码
@@ -55,21 +68,54 @@ public class ManagerController {
      * 3。微信:微信授权code
      * 4。苹果:苹果授权code
      * @param userId
-     * @param data
+     * @param code
      * @param request
      * @return
      */
     @PostMapping("/deleteUserByType")
     public ResultVO deleteUserByType(@RequestParam("userId") String userId,
-                               @RequestParam("data")String data,
-                               HttpServletRequest request){
+                                     @RequestParam("type") String type,
+                                     @RequestParam("code") String code,
+                                     HttpServletRequest request){
+
+        if(type.equals("apple")){
+            if(!AppleUtil.appleRevoke(code))
+            {
+                return ResultVOUtil.error(ResultEnum.APPLE_REVOKE_ERROR.getCode(), ResultEnum.APPLE_REVOKE_ERROR.getMessage());
+            }
+        }else if(type.equals("weixin")){
+            WxInfo wxInfo = wxInfoService.findWxInfoByOpenid(code);
+            if(wxInfo == null){
+                return ResultVOUtil.error(ResultEnum.REVOKE_ERROR.getCode(), ResultEnum.REVOKE_ERROR.getMessage());
+            }
+        } else if(type.equals("phoneNumber") || type.equals("mailBox")){
+            //查询电话号码
+            MainInfo mainInfo = mainInfoService.findMainInfoById(userId);
+            if(mainInfo == null){
+                return ResultVOUtil.error(UserEnum.USER_PASSWORD_ERROR.getCode(), UserEnum.USER_PASSWORD_ERROR.getMessage());
+            }
+            String account = type.equals("phoneNumber")? mainInfo.getTelephoneNumber():mainInfo.getEmail();
+            String codeValue = redisSettingMap.getValue(RedisType.SMS,account);
+            if (!StringUtils.equals(codeValue, code)) {
+                return ResultVOUtil.error(UserEnum.USER_CODE_ERROR.getCode(), UserEnum.USER_CODE_ERROR.getMessage());
+            }
+            Boolean bSuccess =redisSettingMap.deleteValue(RedisType.SMS, account);
+            if (!bSuccess) {
+                //删除不成功,redis不存在
+                log.info("redis 没有对应的token");
+                return ResultVOUtil.error(ResultEnum.PHONE_NUMBER_REVOKE_ERROR.getCode(), ResultEnum.PHONE_NUMBER_REVOKE_ERROR.getMessage());
+            }
+        } else {
+            return ResultVOUtil.error(ResultEnum.REVOKE_ERROR.getCode(), ResultEnum.REVOKE_ERROR.getMessage());
+        }
 
         //1.删除token
         String headToken = request.getHeader("token");
         log.info("{}",request.getParameterValues("userId")[0]);
         if (StringUtils.isNotBlank(headToken)) {
             log.info(String.format(RedisConstant.TOKEN_PREFIX, headToken));
-            Boolean bSuccess = redisTemplate.delete(String.format(RedisConstant.TOKEN_PREFIX, headToken));
+//            Boolean bSuccess = redisTemplate.delete(String.format(RedisConstant.TOKEN_PREFIX, headToken));
+            Boolean bSuccess = redisSettingMap.deleteValue(RedisType.TOKEN,headToken);
             if (!bSuccess) {
                 //删除不成功,redis不存在,是非法token
                 log.info("redis 没有对应的token");
@@ -84,7 +130,7 @@ public class ManagerController {
             }
         }
         //3.删除数据库数据
-        mainInfoService.deleteMainInfoById(userId);
+        mainInfoService.deleteMainInfoById(userId,type);
 
         return ResultVOUtil.success();
     }

+ 12 - 0
src/main/java/com/YuyeTech/TPlat/game/userinfo/controller/UserInfoController.java

@@ -9,6 +9,8 @@ import com.YuyeTech.TPlat.enums.PictureType;
 import com.YuyeTech.TPlat.enums.ResultEnum;
 import com.YuyeTech.TPlat.enums.UserEnum;
 import com.YuyeTech.TPlat.exception.UserException;
+import com.YuyeTech.TPlat.game.TP_AppleInfo.service.AppleInfoService;
+import com.YuyeTech.TPlat.game.TP_AppleInfo.vo.AppleInfoVo;
 import com.YuyeTech.TPlat.game.TP_WxInfo.projo.WxInfo;
 import com.YuyeTech.TPlat.game.TP_WxInfo.service.WxInfoService;
 import com.YuyeTech.TPlat.game.imageInfo.projo.Pictures;
@@ -67,6 +69,9 @@ public class UserInfoController {
     @Autowired
     private WxInfoService wxInfoService;
 
+    @Autowired
+    private AppleInfoService appleInfoService;
+
     @Autowired
     private WeightInfoService weightInfoService;
 
@@ -124,6 +129,13 @@ public class UserInfoController {
             map.put("openid", wxInfo.getOpenid());
         }
 
+        AppleInfoVo appleInfoVo = appleInfoService.getVo(userId);
+        if(appleInfoVo ==null){
+            map.put("appleid",null);
+        } else {
+            map.put("appleid",appleInfoVo.getAppleId());
+        }
+
         return ResultVOUtil.success(map);
     }
 

+ 2 - 1
src/main/java/com/YuyeTech/TPlat/game/userinfo/service/MainInfoService.java

@@ -19,9 +19,10 @@ public interface MainInfoService extends CommonService<MainInfoVo, MainInfo, Str
     /**
      * 删除用户,目前只是挂起数据
      * @param userId
+     * @param type 删除的操作类型
      * @return
      */
-    String deleteMainInfoById(String userId);
+    String deleteMainInfoById(String userId,String type);
 
     /**
      * 恢复删除用户数据

+ 10 - 1
src/main/java/com/YuyeTech/TPlat/game/userinfo/service/MainInfoServiceImpl.java

@@ -116,7 +116,7 @@ public class MainInfoServiceImpl extends CommonServiceImpl<MainInfoVo, MainInfo,
      * @return
      */
     @Override
-    public String deleteMainInfoById(String userId) {
+    public String deleteMainInfoById(String userId,String type) {
         try {
             //记录挂起日志,
             UserDeleteLogVo userDeleteLog = userDeleteLogService.getVo(userId);
@@ -139,6 +139,14 @@ public class MainInfoServiceImpl extends CommonServiceImpl<MainInfoVo, MainInfo,
                 //正常状态下进行删除操作,先清空用户信息(包活wx登录和apple登录),然后记录一个日志
                 //此删除只是把用户关联的数据清空,暂时保留一份记录
                 userDeleteLog.setUserId(mainInfoVo.getUserId());
+
+                UserInfo userInfo = userInfoService.findUserInfoById(userId,false);
+
+                userDeleteLog.setUsername(userInfo.getUsername());
+                userInfo.setUsername("");
+                userInfo.setStatus(2);
+                userInfoService.addUserInfo(userInfo);
+
                 userDeleteLog.setTelephoneNumber(mainInfoVo.getTelephoneNumber());
                 mainInfoVo.setTelephoneNumber("");
                 userDeleteLog.setEmail(mainInfoVo.getEmail());
@@ -165,6 +173,7 @@ public class MainInfoServiceImpl extends CommonServiceImpl<MainInfoVo, MainInfo,
                 userDeleteLog.setUpdateTime(DateUtil.date());
                 //记录一个log状态
                 userDeleteLog.setStatus(UserDeleteStatus.PENDING.ordinal());
+                userDeleteLog.setType(type);
                 userDeleteLogService.save(userDeleteLog);
                 super.save(mainInfoVo);
             }

+ 42 - 22
src/main/java/com/YuyeTech/TPlat/utils/AppleUtil.java

@@ -9,8 +9,10 @@ import io.jsonwebtoken.impl.DefaultJwtBuilder;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.codec.binary.Base64;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.core.io.ClassPathResource;
 import org.springframework.http.*;
+import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.util.MultiValueMap;
 import org.springframework.web.client.RestTemplate;
 
@@ -29,24 +31,42 @@ import java.util.Map;
  */
 
 @Slf4j
+@Configuration
 public class AppleUtil {
-    @Value("${apple.KEYS_URL}")
     private static String APPLE_KEYS_URL;
     //Revoke tokens
     //由于苹果注册后,删除用户需要revoke tokens
     public static String privateKeyStr;
-    @Value("${apple.REVOKE_TOKENS_URL}")
     private static String APPLE_REVOKE_TOKENS_URL;
-    @Value("${apple.AUTH_TOKENS_URL}")
     private static String APPLE_AUTH_TOKENS_URL;
-
-    @Value("${apple.TEAM_ID}")
     private static String APPLE_TEAM_ID;
-    @Value("${apple.KID}")
     private static String APPLE_KID;
-    @Value("${apple.BUNDLE_IDENTIFIER}")
     private static String APPLE_BUNDLE_IDENTIFIER;
 
+    @Value("${apple.KEYS_URL}")
+    public void set_APPLE_KEYS_URL(String APPLE_KEYS_URL) {
+        AppleUtil.APPLE_KEYS_URL = APPLE_KEYS_URL;
+    }
+    @Value("${apple.REVOKE_TOKENS_URL}")
+    public void set_REVOKE_TOKENS_URL(String REVOKE_TOKENS_URL) {
+        AppleUtil.APPLE_REVOKE_TOKENS_URL = REVOKE_TOKENS_URL;
+    }
+    @Value("${apple.AUTH_TOKENS_URL}")
+    public void set_APPLE_AUTH_TOKENS_URL(String AUTH_TOKENS_URL) {
+        AppleUtil.APPLE_AUTH_TOKENS_URL = AUTH_TOKENS_URL;
+    }
+    @Value("${apple.TEAM_ID}")
+    public void set_APPLE_TEAM_ID(String TEAM_ID) {
+        AppleUtil.APPLE_TEAM_ID = TEAM_ID;
+    }
+    @Value("${apple.KID}")
+    public void set_APPLE_KID(String KID) {
+        AppleUtil.APPLE_KID = KID;
+    }
+    @Value("${apple.BUNDLE_IDENTIFIER}")
+    public void set_APPLE_BUNDLE_IDENTIFIER(String BUNDLE_IDENTIFIER) {
+        AppleUtil.APPLE_BUNDLE_IDENTIFIER = BUNDLE_IDENTIFIER;
+    }
     /**
      * 获取苹果的公钥
      * @return
@@ -143,7 +163,7 @@ public class AppleUtil {
      */
     private static Key getPrivateKey() {
         try {
-            ClassPathResource resource = new ClassPathResource("static/config/AuthKey_8G9994KW4L.p8");
+            ClassPathResource resource = new ClassPathResource("config/AuthKey_63NM7757SN.p8");
             InputStream inputStream = resource.getInputStream();
             Reader reader = new InputStreamReader(inputStream, "utf-8");
             BufferedReader br = new BufferedReader(reader);
@@ -205,20 +225,22 @@ public class AppleUtil {
         }
 //        JSONObject jsonObject = null;
         try {
-            privateKeyStr = buildJwt(APPLE_TEAM_ID, APPLE_BUNDLE_IDENTIFIER, APPLE_KID);
-            Map<String, String> stringStringHashMap = new HashMap<>();
-            stringStringHashMap.put("client_id", APPLE_BUNDLE_IDENTIFIER);
-            stringStringHashMap.put("client_secret", privateKeyStr);
-            stringStringHashMap.put("code", code);
-            stringStringHashMap.put("grant_type", "authorization_code");
 
+            privateKeyStr = buildJwt(APPLE_TEAM_ID, APPLE_BUNDLE_IDENTIFIER, APPLE_KID);
+            MultiValueMap<String, String> stringStringHashMap = new LinkedMultiValueMap<>();
+            stringStringHashMap.add("client_id", APPLE_BUNDLE_IDENTIFIER);
+            stringStringHashMap.add("client_secret", privateKeyStr);
+            stringStringHashMap.add("code", code);
+            stringStringHashMap.add("grant_type", "authorization_code");
             HttpHeaders headers = new HttpHeaders();
             headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
             HttpEntity request = new HttpEntity<>(stringStringHashMap,headers);
             RestTemplate restTemplate = new RestTemplate();
             JSONObject jsonObject = restTemplate.postForObject(APPLE_AUTH_TOKENS_URL,request,JSONObject.class);
+            System.out.println(jsonObject);
             return jsonObject.get("access_token").toString();
         } catch (Exception e) {
+            System.out.println(e.getMessage());
             throw new RuntimeException(e);
         }
 
@@ -227,13 +249,11 @@ public class AppleUtil {
     public static Boolean appleRevoke(String code) {
         try {
             String authToken = getAuthToken(code);
-            Map<String, String> requestMap = new HashMap<>();
-            requestMap.put("client_id", APPLE_BUNDLE_IDENTIFIER);
-            requestMap.put("client_secret", privateKeyStr);
-            requestMap.put("token", authToken);
-            requestMap.put("token_type_hint", "access_token");
-            System.out.println(requestMap);
-
+            MultiValueMap<String, String> requestMap = new LinkedMultiValueMap<>();
+            requestMap.add("client_id", APPLE_BUNDLE_IDENTIFIER);
+            requestMap.add("client_secret", privateKeyStr);
+            requestMap.add("token", authToken);
+            requestMap.add("token_type_hint", "access_token");
             HttpHeaders headers = new HttpHeaders();
             headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
             HttpEntity request = new HttpEntity<>(requestMap,headers);
@@ -256,4 +276,4 @@ public class AppleUtil {
     }
 
 
-}
+}

+ 2 - 2
src/main/resources/application.yml

@@ -125,9 +125,9 @@ RSA:
 cache: '{"user":60,"dept":30}'  #自定义某些缓存空间的过期时间
 
 apple:
-  KID: 8G9994KW4L
+  KID: 63NM7757SN
   TEAM_ID: CT63XZVXP2
-  BUNDLE_IDENTIFIER: com.YuyeTech.HeartRate
+  BUNDLE_IDENTIFIER: com.yuyetech.bbeng
   REVOKE_TOKENS_URL: https://appleid.apple.com/auth/revoke
   AUTH_TOKENS_URL: https://appleid.apple.com/auth/token
   KEYS_URL: https://appleid.apple.com/auth/keys

+ 6 - 0
src/main/resources/config/AuthKey_63NM7757SN.p8

@@ -0,0 +1,6 @@
+-----BEGIN PRIVATE KEY-----
+MIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQgu+X/Cf1QmLM8HKid
+yjAYK78m823BwMC3t3cRSG1FQOugCgYIKoZIzj0DAQehRANCAATMrFM8i1fYwsxS
+MRf4hrZ2VNmZCJqudW+UM8sr35lSyT6GOtkliFMlHUgX904nAmBi6O/NlA294KOb
+AEFT+Y6g
+-----END PRIVATE KEY-----

+ 0 - 6
src/main/resources/config/AuthKey_8G9994KW4L.p8

@@ -1,6 +0,0 @@
------BEGIN PRIVATE KEY-----
-MIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQgmXLh35Im/y8hL2k+
-nFMifKkzrJEosEe2/nK6Y89bPS+gCgYIKoZIzj0DAQehRANCAASVGIXHEqqkeum3
-YTFXYjqRlicL9CrGQYS/o2fr17C9CeTy5t+iZ+1g3WeSOTTNfOBU/z/PL4yncwpg
-Ti/u96i3
------END PRIVATE KEY-----