admin
2019-11-20 8b2191df2f7d94aa299bd43dcbe97c94e5a61bbd
fanli/src/main/java/com/yeshi/fanli/service/impl/user/UserAccountServiceImpl.java
@@ -3,6 +3,7 @@
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
@@ -15,7 +16,9 @@
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.yeshi.utils.HttpUtil;
import org.yeshi.utils.JsonUtil;
import org.yeshi.utils.entity.FileUploadResult;
import org.yeshi.utils.tencentcloud.COSManager;
import com.google.gson.Gson;
@@ -57,6 +60,7 @@
import com.yeshi.fanli.util.FileUtil;
import com.yeshi.fanli.util.RedisManager;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.ThreadUtil;
import com.yeshi.fanli.util.TimeUtil;
import com.yeshi.fanli.util.factory.msg.MsgAccountDetailFactory;
import com.yeshi.fanli.util.wx.WXLoginUtil;
@@ -218,6 +222,8 @@
                  updateUserInfo.setLastLoginTime(System.currentTimeMillis());
                  updateUserInfo.setLoginType(loginType);
                  updateUserInfo.setLastLoginIp(request.getRemoteHost());
                  // 更新openId
                  updateUserInfo.setOpenid(weiXinUser.getOpenid());
                  userInfoMapper.updateByPrimaryKeySelective(updateUserInfo);
                  // 删除邀请图片
@@ -687,6 +693,7 @@
      addUser(userInfo);
   }
   @Transactional
   @Override
   public void addUser(UserInfo user) {
@@ -719,12 +726,12 @@
         e.printStackTrace();
      }
      // 添加账号绑定历史
      if (!StringUtil.isNullOrEmpty(user.getPhone()))
         userInfoModifyRecordService.addModifyRecord(uid, ModifyTypeEnum.bindPhone, user.getPhone());
      if (!StringUtil.isNullOrEmpty(user.getWxUnionId()))
         userInfoModifyRecordService.addModifyRecord(uid, ModifyTypeEnum.bindWeiXin, user.getWxUnionId());
   }
   @Override
@@ -1062,7 +1069,7 @@
      } finally {
         jedis.del(watchKey);
         jedis.unwatch();
         jedisPool.returnResource(jedis);
         jedis.close();
      }
      throw new UserAccountException(10, "请稍后再试");
   }
@@ -1080,8 +1087,7 @@
      // 通过Code换取信息
      WXAccountInfoDTO wxAccount = Constant.getWXAccount(acceptData.getPlatform(), acceptData.getVersion());
      WeiXinUser weiXinUser = WXLoginUtil.getWeiXinUserWithSavePortrait(code, wxAccount.getAppId(),
            wxAccount.getAppSecret());
      WeiXinUser weiXinUser = WXLoginUtil.getWeiXinUser(code, wxAccount.getAppId(), wxAccount.getAppSecret());
      if (weiXinUser == null) {
         throw new UserAccountException(1, "微信帐号授权失败");
      }
@@ -1118,9 +1124,27 @@
               spreadUserImgService.deleteImgUrl(userInfo.getId());
            } else {
               LogHelper.test("微信unionID不存在:" + weiXinUser.getUnionid());
               String portrait = null;
               if (!StringUtil.isNullOrEmpty(weiXinUser.getHeadimgurl())) {
                  InputStream asInputStream = HttpUtil.getAsInputStream(weiXinUser.getHeadimgurl());
                  if (asInputStream != null) {
                     FileUploadResult result = COSManager.getInstance().uploadFile(asInputStream,
                           String.format("/portrait/wx/%s_%s.jpg", weiXinUser.getUnionid(),
                                 System.currentTimeMillis() + ""));
                     if (result != null && !StringUtil.isNullOrEmpty(result.getUrl()))
                        portrait = result.getUrl();
                  } else {
                     portrait = weiXinUser.getHeadimgurl();
                  }
               }
               if (StringUtil.isNullOrEmpty(portrait))
                  portrait = Constant.systemCommonConfig.getDefaultPortrait();
               // 创建新账户
               userInfo = new UserInfo();
               userInfo.setPortrait(weiXinUser.getHeadimgurl());
               userInfo.setPortrait(portrait);
               userInfo.setAppId(appId);
               userInfo.setNickName(weiXinUser.getNickname());
               userInfo.setWxName(weiXinUser.getNickname());
@@ -1150,9 +1174,53 @@
      } finally {
         jedis.del(watchKey);
         jedis.unwatch();
         jedisPool.returnResource(jedis);
         jedis.close();
      }
      throw new UserAccountException(10, "请稍后再试");
   }
   @Transactional
   @Override
   public UserInfo loginWeiXinNew(HttpServletRequest request, AcceptData acceptData, int loginType, String wxCode,
         String appId) throws UserAccountException {
      // 日志信息
      JSONObject logInfo = new JSONObject();
      logInfo.put("appId", appId);
      logInfo.put("wxCode", wxCode);
      logInfo.put("loginType", loginType);
      LogHelper.lgoinInfo(logInfo.toString());
      // 通过Code换取信息
      WXAccountInfoDTO wxAccount = Constant.getWXAccount(acceptData.getPlatform(), acceptData.getVersion());
      WeiXinUser weiXinUser = WXLoginUtil.getWeiXinUser(wxCode, wxAccount.getAppId(), wxAccount.getAppSecret());
      if (weiXinUser == null) {
         throw new UserAccountException(1, "微信帐号授权失败");
      }
      LogHelper.test("微信授权用户信息:" + new Gson().toJson(weiXinUser));
      // 判断微信unionid是否被封禁
      ForbiddenUserIdentifyCode identifyCode = forbiddenUserIdentifyCodeService
            .listByTypeAndIdentifyCode(ForbiddenUserIdentifyCodeTypeEnum.wxUnionId, weiXinUser.getUnionid());
      if (identifyCode != null && identifyCode.getEffective() != null && identifyCode.getEffective()) {
         throw new UserAccountException(Constant.CODE_FORBIDDEN_USER, Constant.FORBIDDEN_USER_REASON_DESC);
      }
      UserInfo userInfo = userInfoMapper.getEffectiveUserInfoByWXUnionId(weiXinUser.getUnionid());
      if (userInfo == null) {
         String longinKey = StringUtil.Md5("WXLogin:" + weiXinUser.getUnionid());
         redisManager.cacheCommonString(longinKey, JsonUtil.getSimpleGson().toJson(weiXinUser), 60 * 20);
         throw new UserAccountException(101, longinKey);
      }
      // 更新账户登录信息
      updateLonginInfo(userInfo, loginType, request);
      Long uid = userInfo.getId();
      ThreadUtil.run(new Runnable() {
         public void run() {
            // 删除邀请分享图
            spreadUserImgService.deleteImgUrl(uid);
         }
      });
      return userInfo;
   }
   /**
@@ -1219,8 +1287,7 @@
         throw new UserAccountException(1, "用户不存在");
      }
      WXAccountInfoDTO wxAccount = Constant.getWXAccount(acceptData.getPlatform(), acceptData.getVersion());
      WeiXinUser weiXinUser = WXLoginUtil.getWeiXinUserWithSavePortrait(code, wxAccount.getAppId(),
            wxAccount.getAppSecret());
      WeiXinUser weiXinUser = WXLoginUtil.getWeiXinUser(code, wxAccount.getAppId(), wxAccount.getAppSecret());
      if (weiXinUser == null) {
         throw new UserAccountException(2, "微信帐号授权失败");
      }
@@ -1236,7 +1303,7 @@
         if (newUser != null) {
            throw new UserAccountException(4, "该微信号已被其他帐号绑定");
         }
      } else if (wxUnionId.equals(wxUnionIdExist)) {
      } else if (wxUnionId.equalsIgnoreCase(wxUnionIdExist)) {
         throw new UserAccountException(3, "微信帐号一致无需更换");
      }
@@ -1263,7 +1330,20 @@
      String defaultPortrait = Constant.systemCommonConfig.getDefaultPortrait();
      if (!StringUtil.isNullOrEmpty(weiXinUser.getHeadimgurl()) && !StringUtil.isNullOrEmpty(defaultPortrait)
            && defaultPortrait.equals(user.getPortrait())) {
         updateUserInfo.setPortrait(weiXinUser.getHeadimgurl());
         String headimgurl = weiXinUser.getHeadimgurl();
         InputStream asInputStream = HttpUtil.getAsInputStream(headimgurl);
         if (asInputStream == null) {
            LogHelper.test("微信头像下载失败: " + weiXinUser.getUnionid() + " " + headimgurl);
         } else {
            FileUploadResult result = COSManager.getInstance().uploadFile(asInputStream, String
                  .format("/portrait/wx/%s_%s.jpg", weiXinUser.getUnionid(), System.currentTimeMillis() + ""));
            if (result != null && !StringUtil.isNullOrEmpty(result.getUrl())) {
               headimgurl = result.getUrl();
            } else {
               LogHelper.test("微信头像上传失败: " + weiXinUser.getUnionid() + " " + headimgurl);
            }
         }
         updateUserInfo.setPortrait(headimgurl);
      }
      userInfoMapper.updateByPrimaryKeySelective(updateUserInfo);
@@ -1286,6 +1366,92 @@
   }
   @Override
   public UserInfo bindPhoneToLogin(String phone, String key, String appId, HttpServletRequest request)
         throws UserAccountException {
      UserInfo phoneUser = userInfoMapper.getEffectiveUserInfoByPhone(phone);
      if (phoneUser != null)
         throw new UserAccountException(1, "号码已经被占用");
      // 判断手机号码是否被封禁
      ForbiddenUserIdentifyCode identifyCode1 = forbiddenUserIdentifyCodeService
            .listByTypeAndIdentifyCode(ForbiddenUserIdentifyCodeTypeEnum.phone, phone);
      if (identifyCode1 != null && identifyCode1.getEffective() != null && identifyCode1.getEffective())
         throw new UserAccountException(Constant.CODE_FORBIDDEN_USER, Constant.FORBIDDEN_USER_REASON_DESC);
      String value = redisManager.getCommonString(key);
      if (StringUtil.isNullOrEmpty(value))
         throw new UserAccountException(1, "微信授权失效,请使用微信重新登录");
      WeiXinUser weiXinUser = JsonUtil.getSimpleGson().fromJson(value, WeiXinUser.class);
      if (weiXinUser == null)
         throw new UserAccountException(1, "微信授权失效,请使用微信重新登录");
      UserInfo userInfo = userInfoMapper.getEffectiveUserInfoByWXUnionId(weiXinUser.getUnionid());
      // 直接用的微信登录
      if (userInfo != null)
         throw new UserAccountException(10, "该微信号已被占用");
      String portrait = null;
      if (!StringUtil.isNullOrEmpty(weiXinUser.getHeadimgurl())) {
         InputStream asInputStream = HttpUtil.getAsInputStream(weiXinUser.getHeadimgurl());
         if (asInputStream != null) {
            FileUploadResult result = COSManager.getInstance().uploadFile(asInputStream, String
                  .format("/portrait/wx/%s_%s.jpg", weiXinUser.getUnionid(), System.currentTimeMillis() + ""));
            if (result != null && !StringUtil.isNullOrEmpty(result.getUrl()))
               portrait = result.getUrl();
         } else {
            portrait = weiXinUser.getHeadimgurl();
         }
      }
      if (StringUtil.isNullOrEmpty(portrait))
         portrait = Constant.systemCommonConfig.getDefaultPortrait();
      // 创建新账户
      userInfo = new UserInfo();
      userInfo.setPhone(phone);
      userInfo.setPortrait(portrait);
      userInfo.setAppId(appId);
      userInfo.setNickName(weiXinUser.getNickname());
      userInfo.setWxName(weiXinUser.getNickname());
      userInfo.setWxOpenId(weiXinUser.getOpenid());
      userInfo.setWxUnionId(weiXinUser.getUnionid());
      userInfo.setWxPic(weiXinUser.getHeadimgurl());
      userInfo.setLastLoginTime(System.currentTimeMillis());
      userInfo.setLoginType(2);
      userInfo.setLastLoginIp(request.getRemoteHost());
      userInfo.setState(UserInfo.STATE_NORMAL);
      addUser(userInfo);
      Long uid = userInfo.getId();
      ThreadUtil.run(new Runnable() {
         public void run() {
            try {
               // 第一次登录时创建用户额外信息
               userInfoExtraService.createUserInfoExtra(uid);
            } catch (Exception e) {
               e.printStackTrace();
            }
            // 加入绑定记录
            UserAccountBindingHistory history = new UserAccountBindingHistory();
            history.setContent(phone);
            history.setType(UserAccountBindingHistory.TYPE_PHONE);
            history.setUid(uid);
            history.setFirst(true);
            userAccountBindingHistoryService.addUserAccountBindingHistory(history);
            userInfoModifyRecordService.addModifyRecord(uid, ModifyTypeEnum.bindPhone, phone);
            userInfoModifyRecordService.addModifyRecord(uid, ModifyTypeEnum.bindWeiXin, weiXinUser.getUnionid());
         }
      });
      // 删除缓存
      redisManager.removeCommonString(key);
      return userInfo;
   }
   @Override
   public void forbiddenUserAll(Long uid, String reason) {
      UserInfo currentInfo = userInfoService.selectByPKey(uid);
      if (currentInfo == null) {