From 4dfefab9070773746e8e9e1d1dd4309d1bf8490c Mon Sep 17 00:00:00 2001 From: xuwenbo <717567226@qq.com> Date: Thu, 14 May 2020 14:30:51 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E5=85=AC=E4=BC=97=E5=8F=B7?= =?UTF-8?q?=E4=B8=8E=E5=B0=8F=E7=A8=8B=E5=BA=8F=E6=8E=88=E6=9D=83=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E4=BA=8B=E5=8A=A1=E6=8E=A7=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/security/rest/AuthController.java | 258 +-------------- .../modules/user/service/YxUserService.java | 5 + .../user/service/impl/YxUserServiceImpl.java | 311 +++++++++++++++++- 3 files changed, 316 insertions(+), 258 deletions(-) diff --git a/yshop-api/src/main/java/co/yixiang/modules/security/rest/AuthController.java b/yshop-api/src/main/java/co/yixiang/modules/security/rest/AuthController.java index fe09a358..882b8f07 100644 --- a/yshop-api/src/main/java/co/yixiang/modules/security/rest/AuthController.java +++ b/yshop-api/src/main/java/co/yixiang/modules/security/rest/AuthController.java @@ -101,7 +101,7 @@ public class AuthController { private final YxUserService userService; private final PasswordEncoder passwordEncoder; private final YxWechatUserService wechatUserService; - private final WxMaService wxMaService; + private final NotifyService notifyService; private final YxSystemAttachmentService systemAttachmentService; @@ -161,132 +161,7 @@ public class AuthController { * 2、目前登陆授权打通方式适用于新项目(也就是你yx_user、yx_wechat_user都是空的) * 3、如果你以前已经有数据请自行处理 */ - - try { - WxMpService wxService = WxMpConfiguration.getWxMpService(); - WxMpOAuth2AccessToken wxMpOAuth2AccessToken = wxService.oauth2getAccessToken(code); - WxMpUser wxMpUser = wxService.oauth2getUserInfo(wxMpOAuth2AccessToken, null); - String openid = wxMpUser.getOpenId(); - - //如果开启了UnionId - if (StrUtil.isNotBlank(wxMpUser.getUnionId())) { - openid = wxMpUser.getUnionId(); - } - YxUser yxUser = userService.findByName(openid); - - String username = ""; - if(ObjectUtil.isNull(yxUser)){ - //过滤掉表情 - String nickname = EmojiParser.removeAllEmojis(wxMpUser.getNickname()); - log.info("昵称:{}", nickname); - //用户保存 - YxUser user = new YxUser(); - user.setAccount(nickname); - //如果开启了UnionId - if (StrUtil.isNotBlank(wxMpUser.getUnionId())) { - username = wxMpUser.getUnionId(); - user.setUsername(wxMpUser.getUnionId()); - }else{ - username = wxMpUser.getOpenId(); - user.setUsername(wxMpUser.getOpenId()); - } - user.setPassword(passwordEncoder.encode(ShopConstants.YSHOP_DEFAULT_PWD)); - user.setPwd(passwordEncoder.encode(ShopConstants.YSHOP_DEFAULT_PWD)); - user.setPhone(""); - user.setUserType(AppFromEnum.WECHAT.getValue()); - user.setLoginType(AppFromEnum.WECHAT.getValue()); - user.setAddTime(OrderUtil.getSecondTimestampTwo()); - user.setLastTime(OrderUtil.getSecondTimestampTwo()); - user.setNickname(nickname); - user.setAvatar(wxMpUser.getHeadImgUrl()); - user.setNowMoney(BigDecimal.ZERO); - user.setBrokeragePrice(BigDecimal.ZERO); - user.setIntegral(BigDecimal.ZERO); - - userService.save(user); - - - //保存微信用户 - YxWechatUser yxWechatUser = new YxWechatUser(); - yxWechatUser.setAddTime(OrderUtil.getSecondTimestampTwo()); - yxWechatUser.setNickname(nickname); - yxWechatUser.setOpenid(wxMpUser.getOpenId()); - int sub = 0; - if (ObjectUtil.isNotNull(wxMpUser.getSubscribe()) && wxMpUser.getSubscribe()) sub = 1; - yxWechatUser.setSubscribe(sub); - yxWechatUser.setSex(wxMpUser.getSex()); - yxWechatUser.setLanguage(wxMpUser.getLanguage()); - yxWechatUser.setCity(wxMpUser.getCity()); - yxWechatUser.setProvince(wxMpUser.getProvince()); - yxWechatUser.setCountry(wxMpUser.getCountry()); - yxWechatUser.setHeadimgurl(wxMpUser.getHeadImgUrl()); - if (ObjectUtil.isNotNull(wxMpUser.getSubscribeTime())) { - yxWechatUser.setSubscribeTime(wxMpUser.getSubscribeTime().intValue()); - } - if (StrUtil.isNotBlank(wxMpUser.getUnionId())) { - yxWechatUser.setUnionid(wxMpUser.getUnionId()); - } - if (StrUtil.isNotEmpty(wxMpUser.getRemark())) { - yxWechatUser.setUnionid(wxMpUser.getRemark()); - } - if (ObjectUtil.isNotEmpty(wxMpUser.getGroupId())) { - yxWechatUser.setGroupid(wxMpUser.getGroupId()); - } - yxWechatUser.setUid(user.getUid()); - - wechatUserService.save(yxWechatUser); - - }else{ - username = yxUser.getUsername(); - if(StrUtil.isNotBlank(wxMpUser.getOpenId()) || StrUtil.isNotBlank(wxMpUser.getUnionId())){ - YxWechatUser wechatUser = new YxWechatUser(); - wechatUser.setUid(yxUser.getUid()); - wechatUser.setUnionid(wxMpUser.getUnionId()); - wechatUser.setOpenid(wxMpUser.getOpenId()); - - wechatUserService.updateById(wechatUser); - } - } - - - UsernamePasswordAuthenticationToken authenticationToken = - new UsernamePasswordAuthenticationToken(username, - ShopConstants.YSHOP_DEFAULT_PWD); - - Authentication authentication = authenticationManagerBuilder.getObject().authenticate(authenticationToken); - SecurityContextHolder.getContext().setAuthentication(authentication); - // 生成令牌 - String token = tokenProvider.createToken(authentication); - final JwtUser jwtUserT = (JwtUser) authentication.getPrincipal(); - // 保存在线信息 - onlineUserService.save(jwtUserT, token, request); - - Date expiresTime = tokenProvider.getExpirationDateFromToken(token); - String expiresTimeStr = DateUtil.formatDateTime(expiresTime); - - Map map = new LinkedHashMap<>(); - map.put("token", token); - map.put("expires_time", expiresTimeStr); - - if (singleLogin) { - //踢掉之前已经登录的token - onlineUserService.checkLoginOnUser(jwtUserT.getUsername(), token); - } - - //设置推广关系 - if (StrUtil.isNotEmpty(spread) && !spread.equals("NaN")) { - userService.setSpread(Integer.valueOf(spread), - jwtUserT.getId().intValue()); - } - - // 返回 token - return ApiResult.ok(map); - } catch (WxErrorException e) { - e.printStackTrace(); - log.error(e.getMessage()); - return ApiResult.fail("授权失败"); - } - + return ApiResult.ok(userService.authLogin(code,spread,request)); } @@ -304,135 +179,8 @@ public class AuthController { * 2、目前登陆授权打通方式适用于新项目(也就是你yx_user、yx_wechat_user都是空的) * 3、如果你以前已经有数据请自行处理 */ - String code = loginParam.getCode(); - String encryptedData = loginParam.getEncryptedData(); - String iv = loginParam.getIv(); - String spread = loginParam.getSpread(); - try { - //读取redis配置 - String appId = RedisUtil.get(RedisKeyEnum.WXAPP_APPID.getValue()); - String secret = RedisUtil.get(RedisKeyEnum.WXAPP_SECRET.getValue()); - if (StrUtil.isBlank(appId) || StrUtil.isBlank(secret)) { - throw new ErrorRequestException("请先配置小程序"); - } - WxMaDefaultConfigImpl wxMaConfig = new WxMaDefaultConfigImpl(); - wxMaConfig.setAppid(appId); - wxMaConfig.setSecret(secret); + return ApiResult.ok(userService.wxappAuth(loginParam,request)) ; - wxMaService.setWxMaConfig(wxMaConfig); - WxMaJscode2SessionResult session = wxMaService.getUserService().getSessionInfo(code); - String openid = session.getOpenid(); - //如果开启了UnionId - if (StrUtil.isNotBlank(session.getUnionid())) { - openid = session.getUnionid(); - } - - YxUser yxUser = userService.findByName(openid); - String username = ""; - if(ObjectUtil.isNull(yxUser)){ - - WxMaUserInfo wxMpUser = wxMaService.getUserService() - .getUserInfo(session.getSessionKey(), encryptedData, iv); - //过滤掉表情 - String nickname = EmojiParser.removeAllEmojis(wxMpUser.getNickName()); - //用户保存 - YxUser user = new YxUser(); - user.setAccount(nickname); - - //如果开启了UnionId - if (StrUtil.isNotBlank(wxMpUser.getUnionId())) { - username = wxMpUser.getUnionId(); - user.setUsername(wxMpUser.getUnionId()); - }else{ - username = wxMpUser.getOpenId(); - user.setUsername(wxMpUser.getOpenId()); - } - user.setPassword(passwordEncoder.encode(ShopConstants.YSHOP_DEFAULT_PWD)); - user.setPwd(passwordEncoder.encode(ShopConstants.YSHOP_DEFAULT_PWD)); - user.setPhone(""); - user.setUserType(AppFromEnum.ROUNTINE.getValue()); - user.setAddTime(OrderUtil.getSecondTimestampTwo()); - user.setLastTime(OrderUtil.getSecondTimestampTwo()); - user.setNickname(nickname); - user.setAvatar(wxMpUser.getAvatarUrl()); - user.setNowMoney(BigDecimal.ZERO); - user.setBrokeragePrice(BigDecimal.ZERO); - user.setIntegral(BigDecimal.ZERO); - - userService.save(user); - - - //保存微信用户 - YxWechatUser yxWechatUser = new YxWechatUser(); - // System.out.println("wxMpUser:"+wxMpUser); - yxWechatUser.setAddTime(OrderUtil.getSecondTimestampTwo()); - yxWechatUser.setNickname(nickname); - yxWechatUser.setRoutineOpenid(wxMpUser.getOpenId()); - int sub = 0; - yxWechatUser.setSubscribe(sub); - yxWechatUser.setSex(Integer.valueOf(wxMpUser.getGender())); - yxWechatUser.setLanguage(wxMpUser.getLanguage()); - yxWechatUser.setCity(wxMpUser.getCity()); - yxWechatUser.setProvince(wxMpUser.getProvince()); - yxWechatUser.setCountry(wxMpUser.getCountry()); - yxWechatUser.setHeadimgurl(wxMpUser.getAvatarUrl()); - if (StrUtil.isNotBlank(wxMpUser.getUnionId())) { - yxWechatUser.setUnionid(wxMpUser.getUnionId()); - } - yxWechatUser.setUid(user.getUid()); - - wechatUserService.save(yxWechatUser); - - }else{ - username = yxUser.getUsername(); - if(StrUtil.isNotBlank(session.getOpenid()) || StrUtil.isNotBlank(session.getUnionid())){ - YxWechatUser wechatUser = new YxWechatUser(); - wechatUser.setUid(yxUser.getUid()); - wechatUser.setUnionid(session.getUnionid()); - wechatUser.setRoutineOpenid(session.getOpenid()); - - wechatUserService.updateById(wechatUser); - } - } - - - UsernamePasswordAuthenticationToken authenticationToken = - new UsernamePasswordAuthenticationToken(username, - ShopConstants.YSHOP_DEFAULT_PWD); - - Authentication authentication = authenticationManagerBuilder.getObject().authenticate(authenticationToken); - SecurityContextHolder.getContext().setAuthentication(authentication); - // 生成令牌 - String token = tokenProvider.createToken(authentication); - final JwtUser jwtUserT = (JwtUser) authentication.getPrincipal(); - // 保存在线信息 - onlineUserService.save(jwtUserT, token, request); - - Date expiresTime = tokenProvider.getExpirationDateFromToken(token); - String expiresTimeStr = DateUtil.formatDateTime(expiresTime); - - - Map map = new LinkedHashMap<>(); - map.put("token", token); - map.put("expires_time", expiresTimeStr); - - if (singleLogin) { - //踢掉之前已经登录的token - onlineUserService.checkLoginOnUser(jwtUserT.getUsername(), token); - } - - //设置推广关系 - if (StrUtil.isNotEmpty(spread)) { - userService.setSpread(Integer.valueOf(spread), - jwtUserT.getId().intValue()); - } - - // 返回 token - return ApiResult.ok(map); - } catch (WxErrorException e) { - log.error(e.getMessage(), e); - return ApiResult.fail(e.toString()); - } } diff --git a/yshop-api/src/main/java/co/yixiang/modules/user/service/YxUserService.java b/yshop-api/src/main/java/co/yixiang/modules/user/service/YxUserService.java index 48dbbe00..c69d2e0b 100644 --- a/yshop-api/src/main/java/co/yixiang/modules/user/service/YxUserService.java +++ b/yshop-api/src/main/java/co/yixiang/modules/user/service/YxUserService.java @@ -11,12 +11,14 @@ package co.yixiang.modules.user.service; import co.yixiang.common.service.BaseService; import co.yixiang.common.web.vo.Paging; import co.yixiang.modules.order.web.vo.YxStoreOrderQueryVo; +import co.yixiang.modules.security.rest.param.LoginParam; import co.yixiang.modules.user.entity.YxUser; import co.yixiang.modules.user.web.dto.PromUserDTO; import co.yixiang.modules.user.web.param.PromParam; import co.yixiang.modules.user.web.param.YxUserQueryParam; import co.yixiang.modules.user.web.vo.YxUserQueryVo; +import javax.servlet.http.HttpServletRequest; import java.io.Serializable; import java.util.List; @@ -71,4 +73,7 @@ public interface YxUserService extends BaseService { */ Paging getYxUserPageList(YxUserQueryParam yxUserQueryParam) throws Exception; + Object authLogin(String code, String spread, HttpServletRequest request); + + Object wxappAuth(LoginParam loginParam, HttpServletRequest request); } diff --git a/yshop-api/src/main/java/co/yixiang/modules/user/service/impl/YxUserServiceImpl.java b/yshop-api/src/main/java/co/yixiang/modules/user/service/impl/YxUserServiceImpl.java index 27010c01..91fcd08e 100644 --- a/yshop-api/src/main/java/co/yixiang/modules/user/service/impl/YxUserServiceImpl.java +++ b/yshop-api/src/main/java/co/yixiang/modules/user/service/impl/YxUserServiceImpl.java @@ -8,42 +8,71 @@ */ package co.yixiang.modules.user.service.impl; +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; +import cn.binarywang.wx.miniapp.bean.WxMaUserInfo; +import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import co.yixiang.common.api.ApiResult; import co.yixiang.common.service.impl.BaseServiceImpl; import co.yixiang.common.web.vo.Paging; +import co.yixiang.constant.ShopConstants; +import co.yixiang.enums.AppFromEnum; +import co.yixiang.enums.RedisKeyEnum; +import co.yixiang.exception.BadRequestException; import co.yixiang.exception.ErrorRequestException; import co.yixiang.modules.order.service.YxStoreOrderService; import co.yixiang.modules.order.web.vo.YxStoreOrderQueryVo; +import co.yixiang.modules.security.rest.param.LoginParam; +import co.yixiang.modules.security.security.TokenProvider; +import co.yixiang.modules.security.security.vo.JwtUser; +import co.yixiang.modules.security.service.OnlineUserService; import co.yixiang.modules.shop.service.YxStoreCouponUserService; import co.yixiang.modules.shop.service.YxSystemConfigService; import co.yixiang.modules.shop.service.YxSystemStoreStaffService; import co.yixiang.modules.user.entity.YxUser; import co.yixiang.modules.user.entity.YxUserBill; import co.yixiang.modules.user.entity.YxUserLevel; +import co.yixiang.modules.user.entity.YxWechatUser; import co.yixiang.modules.user.mapper.YxUserMapper; import co.yixiang.modules.user.service.YxUserBillService; import co.yixiang.modules.user.service.YxUserLevelService; import co.yixiang.modules.user.service.YxUserService; +import co.yixiang.modules.user.service.YxWechatUserService; import co.yixiang.modules.user.web.dto.PromUserDTO; import co.yixiang.modules.user.web.param.PromParam; import co.yixiang.modules.user.web.param.YxUserQueryParam; import co.yixiang.modules.user.web.vo.YxUserQueryVo; +import co.yixiang.mp.config.WxMpConfiguration; import co.yixiang.utils.OrderUtil; +import co.yixiang.utils.RedisUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.vdurmont.emoji.EmojiParser; import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken; +import me.chanjar.weixin.mp.bean.result.WxMpUser; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import javax.servlet.http.HttpServletRequest; import java.io.Serializable; import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; @@ -75,7 +104,22 @@ public class YxUserServiceImpl extends BaseServiceImpl imp private YxStoreCouponUserService storeCouponUserService; @Autowired private YxSystemStoreStaffService systemStoreStaffService; - + @Autowired + private PasswordEncoder passwordEncoder; + @Autowired + private OnlineUserService onlineUserService; + @Autowired + private TokenProvider tokenProvider; + @Autowired + private AuthenticationManagerBuilder authenticationManagerBuilder; + @Autowired + private WxMaService wxMaService; + @Autowired + private YxWechatUserService wechatUserService; + @Value("${single.login:true}") + private Boolean singleLogin; + @Value("${yshop.notify.sms.enable}") + private Boolean enableSms; /** @@ -465,4 +509,265 @@ public class YxUserServiceImpl extends BaseServiceImpl imp wrapper.eq("username",name); return getOne(wrapper); } + @Override + @Transactional(rollbackFor = Exception.class) + public Object authLogin(String code, String spread, HttpServletRequest request){ + try { + WxMpService wxService = WxMpConfiguration.getWxMpService(); + WxMpOAuth2AccessToken wxMpOAuth2AccessToken = wxService.oauth2getAccessToken(code); + WxMpUser wxMpUser = wxService.oauth2getUserInfo(wxMpOAuth2AccessToken, null); + String openid = wxMpUser.getOpenId(); + + //如果开启了UnionId + if (StrUtil.isNotBlank(wxMpUser.getUnionId())) { + openid = wxMpUser.getUnionId(); + } + YxUser yxUser = this.findByName(openid); + + String username = ""; + if(ObjectUtil.isNull(yxUser)){ + //过滤掉表情 + String nickname = EmojiParser.removeAllEmojis(wxMpUser.getNickname()); + log.info("昵称:{}", nickname); + //用户保存 + YxUser user = new YxUser(); + user.setAccount(nickname); + //如果开启了UnionId + if (StrUtil.isNotBlank(wxMpUser.getUnionId())) { + username = wxMpUser.getUnionId(); + user.setUsername(wxMpUser.getUnionId()); + }else{ + username = wxMpUser.getOpenId(); + user.setUsername(wxMpUser.getOpenId()); + } + user.setPassword(passwordEncoder.encode(ShopConstants.YSHOP_DEFAULT_PWD)); + user.setPwd(passwordEncoder.encode(ShopConstants.YSHOP_DEFAULT_PWD)); + user.setPhone(""); + user.setUserType(AppFromEnum.WECHAT.getValue()); + user.setLoginType(AppFromEnum.WECHAT.getValue()); + user.setAddTime(OrderUtil.getSecondTimestampTwo()); + user.setLastTime(OrderUtil.getSecondTimestampTwo()); + user.setNickname(nickname); + user.setAvatar(wxMpUser.getHeadImgUrl()); + user.setNowMoney(BigDecimal.ZERO); + user.setBrokeragePrice(BigDecimal.ZERO); + user.setIntegral(BigDecimal.ZERO); + + this.save(user); + + + //保存微信用户 + YxWechatUser yxWechatUser = new YxWechatUser(); + yxWechatUser.setAddTime(OrderUtil.getSecondTimestampTwo()); + yxWechatUser.setNickname(nickname); + yxWechatUser.setOpenid(wxMpUser.getOpenId()); + int sub = 0; + if (ObjectUtil.isNotNull(wxMpUser.getSubscribe()) && wxMpUser.getSubscribe()) sub = 1; + yxWechatUser.setSubscribe(sub); + yxWechatUser.setSex(wxMpUser.getSex()); + yxWechatUser.setLanguage(wxMpUser.getLanguage()); + yxWechatUser.setCity(wxMpUser.getCity()); + yxWechatUser.setProvince(wxMpUser.getProvince()); + yxWechatUser.setCountry(wxMpUser.getCountry()); + yxWechatUser.setHeadimgurl(wxMpUser.getHeadImgUrl()); + if (ObjectUtil.isNotNull(wxMpUser.getSubscribeTime())) { + yxWechatUser.setSubscribeTime(wxMpUser.getSubscribeTime().intValue()); + } + if (StrUtil.isNotBlank(wxMpUser.getUnionId())) { + yxWechatUser.setUnionid(wxMpUser.getUnionId()); + } + if (StrUtil.isNotEmpty(wxMpUser.getRemark())) { + yxWechatUser.setUnionid(wxMpUser.getRemark()); + } + if (ObjectUtil.isNotEmpty(wxMpUser.getGroupId())) { + yxWechatUser.setGroupid(wxMpUser.getGroupId()); + } + yxWechatUser.setUid(user.getUid()); + + wechatUserService.save(yxWechatUser); + + }else{ + username = yxUser.getUsername(); + if(StrUtil.isNotBlank(wxMpUser.getOpenId()) || StrUtil.isNotBlank(wxMpUser.getUnionId())){ + YxWechatUser wechatUser = new YxWechatUser(); + wechatUser.setUid(yxUser.getUid()); + wechatUser.setUnionid(wxMpUser.getUnionId()); + wechatUser.setOpenid(wxMpUser.getOpenId()); + + wechatUserService.updateById(wechatUser); + } + } + + + UsernamePasswordAuthenticationToken authenticationToken = + new UsernamePasswordAuthenticationToken(username, + ShopConstants.YSHOP_DEFAULT_PWD); + + Authentication authentication = authenticationManagerBuilder.getObject().authenticate(authenticationToken); + SecurityContextHolder.getContext().setAuthentication(authentication); + // 生成令牌 + String token = tokenProvider.createToken(authentication); + final JwtUser jwtUserT = (JwtUser) authentication.getPrincipal(); + // 保存在线信息 + onlineUserService.save(jwtUserT, token, request); + + Date expiresTime = tokenProvider.getExpirationDateFromToken(token); + String expiresTimeStr = DateUtil.formatDateTime(expiresTime); + + Map map = new LinkedHashMap<>(); + map.put("token", token); + map.put("expires_time", expiresTimeStr); + + if (singleLogin) { + //踢掉之前已经登录的token + onlineUserService.checkLoginOnUser(jwtUserT.getUsername(), token); + } + + //设置推广关系 + if (StrUtil.isNotEmpty(spread) && !spread.equals("NaN")) { + this.setSpread(Integer.valueOf(spread), + jwtUserT.getId().intValue()); + } + + // 返回 token + return map; + } catch (WxErrorException e) { + e.printStackTrace(); + log.error(e.getMessage()); + throw new BadRequestException(e.toString()); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Object wxappAuth(LoginParam loginParam, HttpServletRequest request){ + String code = loginParam.getCode(); + String encryptedData = loginParam.getEncryptedData(); + String iv = loginParam.getIv(); + String spread = loginParam.getSpread(); + try { + //读取redis配置 + String appId = RedisUtil.get(RedisKeyEnum.WXAPP_APPID.getValue()); + String secret = RedisUtil.get(RedisKeyEnum.WXAPP_SECRET.getValue()); + if (StrUtil.isBlank(appId) || StrUtil.isBlank(secret)) { + throw new ErrorRequestException("请先配置小程序"); + } + WxMaDefaultConfigImpl wxMaConfig = new WxMaDefaultConfigImpl(); + wxMaConfig.setAppid(appId); + wxMaConfig.setSecret(secret); + + wxMaService.setWxMaConfig(wxMaConfig); + WxMaJscode2SessionResult session = wxMaService.getUserService().getSessionInfo(code); + String openid = session.getOpenid(); + //如果开启了UnionId + if (StrUtil.isNotBlank(session.getUnionid())) { + openid = session.getUnionid(); + } + + YxUser yxUser = this.findByName(openid); + String username = ""; + if(ObjectUtil.isNull(yxUser)){ + + WxMaUserInfo wxMpUser = wxMaService.getUserService() + .getUserInfo(session.getSessionKey(), encryptedData, iv); + //过滤掉表情 + String nickname = EmojiParser.removeAllEmojis(wxMpUser.getNickName()); + //用户保存 + YxUser user = new YxUser(); + user.setAccount(nickname); + + //如果开启了UnionId + if (StrUtil.isNotBlank(wxMpUser.getUnionId())) { + username = wxMpUser.getUnionId(); + user.setUsername(wxMpUser.getUnionId()); + }else{ + username = wxMpUser.getOpenId(); + user.setUsername(wxMpUser.getOpenId()); + } + user.setPassword(passwordEncoder.encode(ShopConstants.YSHOP_DEFAULT_PWD)); + user.setPwd(passwordEncoder.encode(ShopConstants.YSHOP_DEFAULT_PWD)); + user.setPhone(""); + user.setUserType(AppFromEnum.ROUNTINE.getValue()); + user.setAddTime(OrderUtil.getSecondTimestampTwo()); + user.setLastTime(OrderUtil.getSecondTimestampTwo()); + user.setNickname(nickname); + user.setAvatar(wxMpUser.getAvatarUrl()); + user.setNowMoney(BigDecimal.ZERO); + user.setBrokeragePrice(BigDecimal.ZERO); + user.setIntegral(BigDecimal.ZERO); + + this.save(user); + + + //保存微信用户 + YxWechatUser yxWechatUser = new YxWechatUser(); + // System.out.println("wxMpUser:"+wxMpUser); + yxWechatUser.setAddTime(OrderUtil.getSecondTimestampTwo()); + yxWechatUser.setNickname(nickname); + yxWechatUser.setRoutineOpenid(wxMpUser.getOpenId()); + int sub = 0; + yxWechatUser.setSubscribe(sub); + yxWechatUser.setSex(Integer.valueOf(wxMpUser.getGender())); + yxWechatUser.setLanguage(wxMpUser.getLanguage()); + yxWechatUser.setCity(wxMpUser.getCity()); + yxWechatUser.setProvince(wxMpUser.getProvince()); + yxWechatUser.setCountry(wxMpUser.getCountry()); + yxWechatUser.setHeadimgurl(wxMpUser.getAvatarUrl()); + if (StrUtil.isNotBlank(wxMpUser.getUnionId())) { + yxWechatUser.setUnionid(wxMpUser.getUnionId()); + } + yxWechatUser.setUid(user.getUid()); + + wechatUserService.save(yxWechatUser); + + }else{ + username = yxUser.getUsername(); + if(StrUtil.isNotBlank(session.getOpenid()) || StrUtil.isNotBlank(session.getUnionid())){ + YxWechatUser wechatUser = new YxWechatUser(); + wechatUser.setUid(yxUser.getUid()); + wechatUser.setUnionid(session.getUnionid()); + wechatUser.setRoutineOpenid(session.getOpenid()); + + wechatUserService.updateById(wechatUser); + } + } + + + UsernamePasswordAuthenticationToken authenticationToken = + new UsernamePasswordAuthenticationToken(username, + ShopConstants.YSHOP_DEFAULT_PWD); + + Authentication authentication = authenticationManagerBuilder.getObject().authenticate(authenticationToken); + SecurityContextHolder.getContext().setAuthentication(authentication); + // 生成令牌 + String token = tokenProvider.createToken(authentication); + final JwtUser jwtUserT = (JwtUser) authentication.getPrincipal(); + // 保存在线信息 + onlineUserService.save(jwtUserT, token, request); + + Date expiresTime = tokenProvider.getExpirationDateFromToken(token); + String expiresTimeStr = DateUtil.formatDateTime(expiresTime); + + + Map map = new LinkedHashMap<>(); + map.put("token", token); + map.put("expires_time", expiresTimeStr); + + if (singleLogin) { + //踢掉之前已经登录的token + onlineUserService.checkLoginOnUser(jwtUserT.getUsername(), token); + } + + //设置推广关系 + if (StrUtil.isNotEmpty(spread)) { + this.setSpread(Integer.valueOf(spread), + jwtUserT.getId().intValue()); + } + // 返回 token + return map; + } catch (WxErrorException e) { + log.error(e.getMessage(), e); + throw new BadRequestException(e.toString()); + } + } }