APP第三方信任登录通过unionid进行登录

This commit is contained in:
pikachu1995@126.com 2023-03-09 15:39:50 +08:00
parent 6f746e3aff
commit f506fa86cc
9 changed files with 80 additions and 41 deletions

View File

@ -75,25 +75,14 @@ public class ConnectBuyerWebController {
return connectUtil.getResult(state);
}
// @GetMapping("/register/auto")
// @ApiOperation(value = "WEB信任登录授权")
// public ResultMessage<Token> webAuthorize() {
// Token token = memberService.autoRegister();
// return ResultUtil.data(token);
// }
@ApiOperation(value = "unionID登录")
@ApiImplicitParams({
@ApiImplicitParam(name = "openId", value = "openid", required = true, paramType = "query"),
@ApiImplicitParam(name = "type", value = "联合类型", required = true,
allowableValues = "WECHAT,QQ,ALIPAY,WEIBO,APPLE", paramType = "query"),
@ApiImplicitParam(name = "uniAccessToken", value = "联合登陆返回的accessToken", required = true, paramType = "query")
})
@ApiOperation(value = "APP-unionID登录")
@GetMapping("/app/login")
public ResultMessage<Token> unionLogin(ConnectAuthUser authUser, @RequestHeader("uuid") String uuid) {
try {
System.out.println(1);
return ResultUtil.data(connectService.unionLoginCallback(authUser, uuid));
} catch (Exception e) {
e.printStackTrace();
log.error("unionID登录错误", e);
}
return null;

View File

@ -1,9 +1,12 @@
package cn.lili.event.impl;
import cn.hutool.core.util.StrUtil;
import cn.lili.common.enums.ClientTypeEnum;
import cn.lili.event.MemberConnectLoginEvent;
import cn.lili.event.MemberLoginEvent;
import cn.lili.modules.connect.entity.dto.ConnectAuthUser;
import cn.lili.modules.connect.entity.enums.ConnectEnum;
import cn.lili.modules.connect.entity.enums.SourceEnum;
import cn.lili.modules.connect.service.ConnectService;
import cn.lili.modules.member.entity.dos.Member;
import cn.lili.modules.member.service.MemberService;
@ -38,11 +41,12 @@ public class MemberExecute implements MemberLoginEvent, MemberConnectLoginEvent
//保存UnionID
if (StrUtil.isNotBlank(authUser.getToken().getUnionId())) {
connectService.loginBindUser(member.getId(), authUser.getToken().getUnionId(), authUser.getType());
connectService.loginBindUser(member.getId(), authUser.getToken().getUnionId(), authUser.getSource());
}
//保存OpenID
if (StrUtil.isNotBlank(authUser.getUuid())) {
connectService.loginBindUser(member.getId(), authUser.getUuid(), authUser.getType());
SourceEnum sourceEnum = SourceEnum.getSourceEnum(ConnectEnum.valueOf(authUser.getSource()), ClientTypeEnum.valueOf(authUser.getType()));
connectService.loginBindUser(member.getId(), authUser.getUuid(), sourceEnum.name());
}
}

View File

@ -31,7 +31,7 @@ public enum ClientTypeEnum {
*/
UNKNOWN("未知");
private final String clientName;
private String clientName;
ClientTypeEnum(String des) {
this.clientName = des;

View File

@ -67,11 +67,7 @@ public class ConnectAuthUser implements Serializable {
* 用户来源
*/
private String source;
/**
* 用户来源
* 例如微信支付宝微博
*/
private String source1;
/**
* 类型
* 例如PCWAP小程序

View File

@ -1,5 +1,7 @@
package cn.lili.modules.connect.entity.enums;
import cn.lili.common.enums.ClientTypeEnum;
/**
* 联合登陆-渠道枚举
*
@ -13,6 +15,12 @@ public enum SourceEnum {
WECHAT_OFFIACCOUNT_OPEN_ID("微信公众号 openid登录"),
WECHAT_MP_OPEN_ID("微信小程序 openid登录"),
WECHAT_APP_OPEN_ID("微信APP openid登录"),
QQ_APP_OPEN_ID("QQ APP openid登录"),
QQ_PC_OPEN_ID("QQ PC应用 openid登录"),
QQ_H5_OPEN_ID("QQ H5应用 openid登录"),
APPLE_OPEN_ID("苹果 openid登录"),
;
@ -21,4 +29,34 @@ public enum SourceEnum {
SourceEnum(String description) {
this.description = description;
}
public static SourceEnum getSourceEnum(ConnectEnum source, ClientTypeEnum type) {
switch (source) {
case WECHAT:
switch (type) {
case APP:
return WECHAT_APP_OPEN_ID;
case WECHAT_MP:
return WECHAT_MP_OPEN_ID;
case PC:
return WECHAT_PC_OPEN_ID;
case H5:
return WECHAT_OFFIACCOUNT_OPEN_ID;
}
break;
case QQ:
switch (type) {
case APP:
return QQ_APP_OPEN_ID;
case PC:
return QQ_PC_OPEN_ID;
case H5:
return QQ_H5_OPEN_ID;
}
break;
case APPLE:
return APPLE_OPEN_ID;
}
return null;
}
}

View File

@ -2,6 +2,8 @@ package cn.lili.modules.connect.request;
import cn.hutool.core.convert.Convert;
import cn.lili.cache.Cache;
import cn.lili.common.enums.ClientTypeEnum;
import cn.lili.common.utils.HttpUtils;
import cn.lili.common.utils.StringUtils;
import cn.lili.common.utils.UrlBuilder;
import cn.lili.modules.connect.config.AuthConfig;
@ -12,9 +14,9 @@ import cn.lili.modules.connect.entity.dto.AuthToken;
import cn.lili.modules.connect.entity.dto.ConnectAuthUser;
import cn.lili.modules.connect.entity.enums.AuthResponseStatus;
import cn.lili.modules.connect.entity.enums.AuthUserGender;
import cn.lili.modules.connect.entity.enums.ConnectEnum;
import cn.lili.modules.connect.exception.AuthException;
import cn.lili.modules.connect.util.GlobalAuthUtils;
import cn.lili.common.utils.HttpUtils;
import com.alibaba.fastjson.JSONObject;
import java.util.Map;
@ -67,7 +69,8 @@ public class BaseAuthQQRequest extends BaseAuthRequest {
.uuid(openId)
.gender(AuthUserGender.getRealGender(object.getString("gender")))
.token(authToken)
.source(source.toString())
.source(ConnectEnum.QQ.name())
.type(ClientTypeEnum.PC.name())
.build();
}

View File

@ -1,6 +1,8 @@
package cn.lili.modules.connect.request;
import cn.lili.cache.Cache;
import cn.lili.common.enums.ClientTypeEnum;
import cn.lili.common.utils.HttpUtils;
import cn.lili.common.utils.UrlBuilder;
import cn.lili.modules.connect.config.AuthConfig;
import cn.lili.modules.connect.config.ConnectAuthEnum;
@ -13,7 +15,6 @@ import cn.lili.modules.connect.entity.enums.AuthUserGender;
import cn.lili.modules.connect.entity.enums.ConnectEnum;
import cn.lili.modules.connect.entity.enums.SourceEnum;
import cn.lili.modules.connect.exception.AuthException;
import cn.lili.common.utils.HttpUtils;
import com.alibaba.fastjson.JSONObject;
/**
@ -61,8 +62,8 @@ public class BaseAuthWeChatPCRequest extends BaseAuthRequest {
.uuid(authToken.getOpenId())
.gender(AuthUserGender.getWechatRealGender(object.getString("sex")))
.token(authToken)
.source(source.toString())
.source1(ConnectEnum.WECHAT.name())
.source(ConnectEnum.WECHAT.name())
.type(ClientTypeEnum.H5.name())
.type(SourceEnum.WECHAT_PC_OPEN_ID.name())
.build();
}
@ -116,6 +117,7 @@ public class BaseAuthWeChatPCRequest extends BaseAuthRequest {
*/
@Override
public String authorize(String state) {
return UrlBuilder.fromBaseUrl(source.authorize())
.queryParam("response_type", "code")
.queryParam("appid", config.getClientId())

View File

@ -1,6 +1,8 @@
package cn.lili.modules.connect.request;
import cn.lili.cache.Cache;
import cn.lili.common.enums.ClientTypeEnum;
import cn.lili.common.utils.HttpUtils;
import cn.lili.common.utils.UrlBuilder;
import cn.lili.modules.connect.config.AuthConfig;
import cn.lili.modules.connect.config.ConnectAuthEnum;
@ -14,7 +16,6 @@ import cn.lili.modules.connect.entity.enums.ConnectEnum;
import cn.lili.modules.connect.entity.enums.SourceEnum;
import cn.lili.modules.connect.exception.AuthException;
import cn.lili.modules.connect.util.GlobalAuthUtils;
import cn.lili.common.utils.HttpUtils;
import com.alibaba.fastjson.JSONObject;
/**
@ -63,8 +64,8 @@ public class BaseAuthWeChatRequest extends BaseAuthRequest {
.uuid(openId)
.gender(AuthUserGender.getWechatRealGender(object.getString("sex")))
.token(authToken)
.source(source.toString())
.source1(ConnectEnum.WECHAT.name())
.source(ConnectEnum.WECHAT.name())
.type(ClientTypeEnum.H5.name())
.type(SourceEnum.WECHAT_OFFIACCOUNT_OPEN_ID.name())
.build();
}

View File

@ -1,26 +1,25 @@
package cn.lili.modules.connect.serviceimpl;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import cn.lili.cache.Cache;
import cn.lili.cache.CachePrefix;
import cn.lili.common.context.ThreadContextHolder;
import cn.lili.common.enums.ClientTypeEnum;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.event.TransactionCommitSendMQEvent;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.properties.RocketmqCustomProperties;
import cn.lili.common.security.AuthUser;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.security.token.Token;
import cn.lili.common.utils.CookieUtil;
import cn.lili.common.utils.HttpUtils;
import cn.lili.modules.connect.entity.Connect;
import cn.lili.modules.connect.entity.dto.ConnectAuthUser;
import cn.lili.modules.connect.entity.dto.MemberConnectLoginMessage;
import cn.lili.modules.connect.entity.dto.WechatMPLoginParams;
import cn.lili.modules.connect.entity.enums.ConnectEnum;
import cn.lili.modules.connect.entity.enums.SourceEnum;
import cn.lili.modules.connect.mapper.ConnectMapper;
import cn.lili.modules.connect.service.ConnectService;
import cn.lili.modules.member.entity.dos.Member;
@ -33,7 +32,6 @@ import cn.lili.modules.system.entity.dto.connect.dto.WechatConnectSettingItem;
import cn.lili.modules.system.entity.enums.SettingEnum;
import cn.lili.modules.system.service.SettingService;
import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
import cn.lili.rocketmq.tags.GoodsTagsEnum;
import cn.lili.rocketmq.tags.MemberTagsEnum;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@ -41,7 +39,6 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -53,7 +50,6 @@ import java.nio.charset.StandardCharsets;
import java.security.AlgorithmParameters;
import java.security.Security;
import java.util.*;
import java.util.concurrent.TimeUnit;
/**
* 联合登陆接口实现
@ -88,7 +84,6 @@ public class ConnectServiceImpl extends ServiceImpl<ConnectMapper, Connect> impl
@Override
@Transactional(rollbackFor = Exception.class)
public Token unionLoginCallback(ConnectAuthUser authUser, String uuid) {
return this.unionLoginCallback(authUser, false);
}
@ -249,11 +244,20 @@ public class ConnectServiceImpl extends ServiceImpl<ConnectMapper, Connect> impl
*/
private Token unionLoginCallback(ConnectAuthUser authUser, boolean longTerm) {
//使用UnionId登录
try {
LambdaQueryWrapper<Connect> queryWrapper = new LambdaQueryWrapper<Connect>()
.eq(Connect::getUnionId, authUser.getToken().getUnionId())
.eq(Connect::getUnionType, authUser.getSource1());
LambdaQueryWrapper<Connect> queryWrapper = new LambdaQueryWrapper<Connect>();
//使用UnionId登录
if (StrUtil.isNotBlank(authUser.getToken().getUnionId())) {
queryWrapper.eq(Connect::getUnionId, authUser.getToken().getUnionId())
.eq(Connect::getUnionType, authUser.getSource());
} else {
//使用OpenID登录
SourceEnum sourceEnum = SourceEnum.getSourceEnum(ConnectEnum.valueOf(authUser.getType()), ClientTypeEnum.valueOf(authUser.getSource()));
queryWrapper.eq(Connect::getUnionId, authUser.getToken().getUnionId())
.eq(Connect::getUnionType, sourceEnum.name());
}
//查询绑定关系
Connect connect = this.getOne(queryWrapper);
Member member = new Member();
@ -353,4 +357,6 @@ public class ConnectServiceImpl extends ServiceImpl<ConnectMapper, Connect> impl
}
throw new ServiceException(ResultCode.USER_CONNECT_ERROR);
}
}