微信公众号与小程序授权添加事务控制
This commit is contained in:
@ -101,7 +101,7 @@ public class AuthController {
|
|||||||
private final YxUserService userService;
|
private final YxUserService userService;
|
||||||
private final PasswordEncoder passwordEncoder;
|
private final PasswordEncoder passwordEncoder;
|
||||||
private final YxWechatUserService wechatUserService;
|
private final YxWechatUserService wechatUserService;
|
||||||
private final WxMaService wxMaService;
|
|
||||||
private final NotifyService notifyService;
|
private final NotifyService notifyService;
|
||||||
private final YxSystemAttachmentService systemAttachmentService;
|
private final YxSystemAttachmentService systemAttachmentService;
|
||||||
|
|
||||||
@ -161,132 +161,7 @@ public class AuthController {
|
|||||||
* 2、目前登陆授权打通方式适用于新项目(也就是你yx_user、yx_wechat_user都是空的)
|
* 2、目前登陆授权打通方式适用于新项目(也就是你yx_user、yx_wechat_user都是空的)
|
||||||
* 3、如果你以前已经有数据请自行处理
|
* 3、如果你以前已经有数据请自行处理
|
||||||
*/
|
*/
|
||||||
|
return ApiResult.ok(userService.authLogin(code,spread,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 = 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<String, String> 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("授权失败");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -304,135 +179,8 @@ public class AuthController {
|
|||||||
* 2、目前登陆授权打通方式适用于新项目(也就是你yx_user、yx_wechat_user都是空的)
|
* 2、目前登陆授权打通方式适用于新项目(也就是你yx_user、yx_wechat_user都是空的)
|
||||||
* 3、如果你以前已经有数据请自行处理
|
* 3、如果你以前已经有数据请自行处理
|
||||||
*/
|
*/
|
||||||
String code = loginParam.getCode();
|
return ApiResult.ok(userService.wxappAuth(loginParam,request)) ;
|
||||||
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 = 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<String, String> 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());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -11,12 +11,14 @@ package co.yixiang.modules.user.service;
|
|||||||
import co.yixiang.common.service.BaseService;
|
import co.yixiang.common.service.BaseService;
|
||||||
import co.yixiang.common.web.vo.Paging;
|
import co.yixiang.common.web.vo.Paging;
|
||||||
import co.yixiang.modules.order.web.vo.YxStoreOrderQueryVo;
|
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.entity.YxUser;
|
||||||
import co.yixiang.modules.user.web.dto.PromUserDTO;
|
import co.yixiang.modules.user.web.dto.PromUserDTO;
|
||||||
import co.yixiang.modules.user.web.param.PromParam;
|
import co.yixiang.modules.user.web.param.PromParam;
|
||||||
import co.yixiang.modules.user.web.param.YxUserQueryParam;
|
import co.yixiang.modules.user.web.param.YxUserQueryParam;
|
||||||
import co.yixiang.modules.user.web.vo.YxUserQueryVo;
|
import co.yixiang.modules.user.web.vo.YxUserQueryVo;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -71,4 +73,7 @@ public interface YxUserService extends BaseService<YxUser> {
|
|||||||
*/
|
*/
|
||||||
Paging<YxUserQueryVo> getYxUserPageList(YxUserQueryParam yxUserQueryParam) throws Exception;
|
Paging<YxUserQueryVo> getYxUserPageList(YxUserQueryParam yxUserQueryParam) throws Exception;
|
||||||
|
|
||||||
|
Object authLogin(String code, String spread, HttpServletRequest request);
|
||||||
|
|
||||||
|
Object wxappAuth(LoginParam loginParam, HttpServletRequest request);
|
||||||
}
|
}
|
||||||
|
@ -8,42 +8,71 @@
|
|||||||
*/
|
*/
|
||||||
package co.yixiang.modules.user.service.impl;
|
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.NumberUtil;
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import co.yixiang.common.api.ApiResult;
|
||||||
import co.yixiang.common.service.impl.BaseServiceImpl;
|
import co.yixiang.common.service.impl.BaseServiceImpl;
|
||||||
import co.yixiang.common.web.vo.Paging;
|
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.exception.ErrorRequestException;
|
||||||
import co.yixiang.modules.order.service.YxStoreOrderService;
|
import co.yixiang.modules.order.service.YxStoreOrderService;
|
||||||
import co.yixiang.modules.order.web.vo.YxStoreOrderQueryVo;
|
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.YxStoreCouponUserService;
|
||||||
import co.yixiang.modules.shop.service.YxSystemConfigService;
|
import co.yixiang.modules.shop.service.YxSystemConfigService;
|
||||||
import co.yixiang.modules.shop.service.YxSystemStoreStaffService;
|
import co.yixiang.modules.shop.service.YxSystemStoreStaffService;
|
||||||
import co.yixiang.modules.user.entity.YxUser;
|
import co.yixiang.modules.user.entity.YxUser;
|
||||||
import co.yixiang.modules.user.entity.YxUserBill;
|
import co.yixiang.modules.user.entity.YxUserBill;
|
||||||
import co.yixiang.modules.user.entity.YxUserLevel;
|
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.mapper.YxUserMapper;
|
||||||
import co.yixiang.modules.user.service.YxUserBillService;
|
import co.yixiang.modules.user.service.YxUserBillService;
|
||||||
import co.yixiang.modules.user.service.YxUserLevelService;
|
import co.yixiang.modules.user.service.YxUserLevelService;
|
||||||
import co.yixiang.modules.user.service.YxUserService;
|
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.dto.PromUserDTO;
|
||||||
import co.yixiang.modules.user.web.param.PromParam;
|
import co.yixiang.modules.user.web.param.PromParam;
|
||||||
import co.yixiang.modules.user.web.param.YxUserQueryParam;
|
import co.yixiang.modules.user.web.param.YxUserQueryParam;
|
||||||
import co.yixiang.modules.user.web.vo.YxUserQueryVo;
|
import co.yixiang.modules.user.web.vo.YxUserQueryVo;
|
||||||
|
import co.yixiang.mp.config.WxMpConfiguration;
|
||||||
import co.yixiang.utils.OrderUtil;
|
import co.yixiang.utils.OrderUtil;
|
||||||
|
import co.yixiang.utils.RedisUtil;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import com.baomidou.mybatisplus.core.metadata.OrderItem;
|
import com.baomidou.mybatisplus.core.metadata.OrderItem;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
|
import com.vdurmont.emoji.EmojiParser;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
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.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.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.List;
|
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
|
||||||
@ -75,7 +104,22 @@ public class YxUserServiceImpl extends BaseServiceImpl<YxUserMapper, YxUser> imp
|
|||||||
private YxStoreCouponUserService storeCouponUserService;
|
private YxStoreCouponUserService storeCouponUserService;
|
||||||
@Autowired
|
@Autowired
|
||||||
private YxSystemStoreStaffService systemStoreStaffService;
|
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<YxUserMapper, YxUser> imp
|
|||||||
wrapper.eq("username",name);
|
wrapper.eq("username",name);
|
||||||
return getOne(wrapper);
|
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<String, String> 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<String, String> 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());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user