yujian
2019-04-22 b6c37e4bc38db88a360d0f2c6099183f9bb75bdc
fanli/src/main/java/com/yeshi/fanli/service/impl/user/UserAccountServiceImpl.java
@@ -29,6 +29,7 @@
import com.yeshi.fanli.entity.bus.user.LoginResult;
import com.yeshi.fanli.entity.bus.user.SMSHistory;
import com.yeshi.fanli.entity.bus.user.ThreeSale;
import com.yeshi.fanli.entity.bus.user.UserAccountBindingHistory;
import com.yeshi.fanli.entity.bus.user.UserConnectHistory;
import com.yeshi.fanli.entity.bus.user.UserInfo;
import com.yeshi.fanli.entity.bus.user.WeiXinUser;
@@ -39,6 +40,7 @@
import com.yeshi.fanli.service.inter.user.BindingAccountService;
import com.yeshi.fanli.service.inter.user.ForbiddenUserIdentifyCodeService;
import com.yeshi.fanli.service.inter.user.SpreadUserImgService;
import com.yeshi.fanli.service.inter.user.UserAccountBindingHistoryService;
import com.yeshi.fanli.service.inter.user.UserAccountService;
import com.yeshi.fanli.service.inter.user.UserExtraTaoBaoInfoService;
import com.yeshi.fanli.service.inter.user.UserInfoExtraService;
@@ -84,9 +86,12 @@
   @Resource
   private ForbiddenUserIdentifyCodeService forbiddenUserIdentifyCodeService;
   @Resource
   private UserInfoExtraService userInfoExtraService;
   @Resource
   private UserAccountBindingHistoryService userAccountBindingHistoryService;
   @Transactional
   @Override
@@ -900,19 +905,17 @@
      return user.getPortrait();
   }
   @Transactional
   @Override
   public UserInfo loginPhone(HttpServletRequest request,int loginType, String vcode, String phone,
         String appId) throws UserAccountException {
   public UserInfo loginPhone(HttpServletRequest request, int loginType, String vcode, String phone, String appId)
         throws UserAccountException {
      // 空额清理
      if (phone == null || phone.trim().length() == 0) {
         throw new UserAccountException(1, "请输入手机号码");
      }
      phone = phone.replaceAll(" ", "");
      // 苹果应用商店上线测试号码
      if ("17316780233".equalsIgnoreCase(phone) && "258168".equalsIgnoreCase(vcode)) {
         ;
@@ -928,8 +931,7 @@
            throw new UserAccountException(1, "验证码错误,重新输入");
         }
      }
      redisManager.clearSMSFrequencyLimit(phone, SMSHistory.TYPE_LOGIN);
      JSONObject logInfo = new JSONObject();
      logInfo.put("appId", appId);
      logInfo.put("phone", phone);
@@ -942,6 +944,11 @@
      if (identifyCode1 != null && identifyCode1.getEffective() != null && identifyCode1.getEffective()) {
         throw new UserAccountException(Constant.CODE_FORBIDDEN_USER, Constant.FORBIDDEN_USER_REASON_DESC);
      }
      // 清空限制
      redisManager.clearSMSFrequencyLimit(phone, SMSHistory.TYPE_LOGIN);
      // 清理次数
      redisManager.removeCommonString("sendMSNLoginCount" + phone);
      // 查询是否存在该电话历史用户
      UserInfo userInfo = userInfoMapper.getEffectiveUserInfoByPhone(phone);
@@ -958,8 +965,7 @@
         userInfo.setState(UserInfo.STATE_NORMAL);
         // 创建用户
         addUser(userInfo);
         try {
            // 第一次登录时创建用户额外信息
            userInfoExtraService.createUserInfoExtra(userInfo.getId());
@@ -970,10 +976,11 @@
      return userInfo;
   }
   @Transactional
   @Override
   public UserInfo loginWinXin(HttpServletRequest request,int loginType, String code, String appId) throws UserAccountException {
   public UserInfo loginWinXin(HttpServletRequest request, int loginType, String code, String appId)
         throws UserAccountException {
      // 日志信息
      JSONObject logInfo = new JSONObject();
      logInfo.put("appId", appId);
@@ -998,9 +1005,13 @@
      UserInfo userInfo = userInfoMapper.getEffectiveUserInfoByWXUnionId(weiXinUser.getUnionid());
      // 直接用的微信登录
      if (userInfo != null) {
         LogHelper.test("微信unionID存在:"+weiXinUser.getUnionid());
         // 更新账户登录信息
         updateLonginInfo(userInfo, loginType, request);
         // 删除邀请分享图
         spreadUserImgService.deleteImgUrl(userInfo.getId());
      } else {
         LogHelper.test("微信unionID不存在:"+weiXinUser.getUnionid());
         // 创建新账户
         userInfo = new UserInfo();
         userInfo.setPortrait(weiXinUser.getHeadimgurl());
@@ -1015,7 +1026,7 @@
         userInfo.setLastLoginIp(request.getRemoteHost());
         userInfo.setState(UserInfo.STATE_NORMAL);
         addUser(userInfo);
         try {
            // 第一次登录时创建用户额外信息
            userInfoExtraService.createUserInfoExtra(userInfo.getId());
@@ -1025,9 +1036,10 @@
      }
      return userInfo;
   }
   /**
    * 更新账户登录信息
    *
    * @param userInfo
    * @param loginType
    * @param request
@@ -1040,15 +1052,14 @@
      updateUserInfo.setLastLoginIp(request.getRemoteHost());
      userInfoMapper.updateByPrimaryKeySelective(updateUserInfo);
   }
   @Override
   public void bindPhoneNew(Long uid, String phone) throws UserAccountException {
      UserInfo user = userInfoMapper.selectByPrimaryKey(uid);
      if (user == null) {
         throw new UserAccountException(1, "用户不存在");
      }
      String hasPhone = user.getPhone();
      if (!StringUtil.isNullOrEmpty(hasPhone) && hasPhone.equals(phone)) {
         throw new UserAccountException(2, "您已经绑定了该电话号码");
@@ -1058,44 +1069,59 @@
      if (phoneUser != null) {
         throw new UserAccountException(2, "号码已经被占用");
      }
      // 更新电话号码
      UserInfo update = new UserInfo(user.getId());
      update.setPhone(phone);
      userInfoMapper.updateByPrimaryKeySelective(update);
      // 加入绑定记录
      UserAccountBindingHistory history = new UserAccountBindingHistory();
      history.setContent(phone);
      history.setType(UserAccountBindingHistory.TYPE_PHONE);
      history.setUid(uid);
      // 之前已经绑定电话号码
      if (!StringUtil.isNullOrEmpty(user.getPhone()))
         history.setFirst(false);
      else
         history.setFirst(true);
      userAccountBindingHistoryService.addUserAccountBindingHistory(history);
      // 发送消息
      userAccountMsgNotificationService.bindingSuccess(uid, MsgAccountDetailFactory.TYPE_PHONE);
   }
   @Override
   public void bindWeiXin(Long uid, String code) throws UserAccountException {
      UserInfo user = userInfoMapper.selectByPrimaryKey(uid);
      if (user == null) {
         throw new UserAccountException(1, "用户不存在");
      }
      WeiXinUser weiXinUser = WXLoginUtil.getWeiXinUserWithSavePortrait(code);
      if (weiXinUser == null) {
         throw new UserAccountException(2, "微信帐号授权失败");
      }
      
      if (weiXinUser.getUnionid().equalsIgnoreCase(user.getWxUnionId())) {
      String wxUnionId = weiXinUser.getUnionid();
      if (StringUtil.isNullOrEmpty(wxUnionId)) {
         throw new UserAccountException(2, "微信帐号授权失败");
      }
      String wxUnionIdExist = user.getWxUnionId();
      if (StringUtil.isNullOrEmpty(wxUnionIdExist)) {
         UserInfo newUser = userInfoMapper.getEffectiveUserInfoByWXUnionId(wxUnionId);
         if (newUser != null) {
            throw new UserAccountException(4, "该微信号已被其他帐号绑定");
         }
      } else if (wxUnionId.equals(wxUnionIdExist)) {
         throw new UserAccountException(3, "微信帐号一致无需更换");
      }
      UserInfo newUser = userInfoMapper.getEffectiveUserInfoByWXUnionId(weiXinUser.getUnionid());
      if (newUser != null) {
         throw new UserAccountException(4, "该微信号已被其他帐号绑定");
      }
      String wxUnionId = user.getWxUnionId();
      if (!StringUtil.isNullOrEmpty(wxUnionId) && StringUtil.isNullOrEmpty(user.getPhone())) {
      if (StringUtil.isNullOrEmpty(user.getPhone())) {
         throw new UserAccountException(5, "该帐号没有绑定手机号码,需绑定手机号码才能完成微信更换");
      }
      UserInfo updateUserInfo = new UserInfo(uid);
      updateUserInfo.setWxName(weiXinUser.getNickname());
      updateUserInfo.setWxOpenId(weiXinUser.getOpenid());
@@ -1112,7 +1138,20 @@
      }
      userInfoMapper.updateByPrimaryKeySelective(updateUserInfo);
      // 加入绑定记录
      UserAccountBindingHistory history = new UserAccountBindingHistory();
      history.setContent(weiXinUser.getUnionid());
      history.setType(UserAccountBindingHistory.TYPE_WX);
      history.setUid(uid);
      // 之前已经绑定电话号码
      if (!StringUtil.isNullOrEmpty(user.getWxUnionId()))
         history.setFirst(false);
      else
         history.setFirst(true);
      userAccountBindingHistoryService.addUserAccountBindingHistory(history);
      userAccountMsgNotificationService.bindingSuccess(uid, MsgAccountDetailFactory.TYPE_WX);
   }
}