记得上下班打卡 | git大法好,push需谨慎

Commit a23e2f45 authored by 张国柄's avatar 张国柄

+API:adam:第三方平台账号授权登录/注册、绑定;

parent d333e013
package com.liquidnet.service.adam.constant;
public class AdamEnum {
/**
* 第三方平台应用类型
* 用户第三方账号登录注册,适用于同一平台多个应用服务,例如微信的公众号、小程序等
*/
public enum OpenType {
WXS01("WECHAT", "正在现场公众号"),
WXS02("WECHAT", "MDSK公众号"),
WXM01("WECHAT", "正在现场移动应用"),
WXA01("WECHAT", "正在现场小程序"),
WXA02("WECHAT", "草莓音乐节小程序"),
WXA03("WECHAT", "MDSK音乐节"),
;
private final String platform;
private final String desc;
OpenType(String platform, String desc) {
this.platform = platform;
this.desc = desc;
}
public String getPlatform() {
return platform;
}
public String getDesc() {
return desc;
}
}
}
...@@ -3,7 +3,6 @@ package com.liquidnet.service.adam.dto; ...@@ -3,7 +3,6 @@ package com.liquidnet.service.adam.dto;
import com.liquidnet.commons.lang.constant.LnsRegex; import com.liquidnet.commons.lang.constant.LnsRegex;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern; import javax.validation.constraints.Pattern;
...@@ -11,11 +10,10 @@ import javax.validation.constraints.Size; ...@@ -11,11 +10,10 @@ import javax.validation.constraints.Size;
import java.io.Serializable; import java.io.Serializable;
@ApiModel(value = "AdamThirdPartParam", description = "第三方账号登录注册入参") @ApiModel(value = "AdamThirdPartParam", description = "第三方账号登录注册入参")
@Data
public class AdamThirdPartParam implements Serializable { public class AdamThirdPartParam implements Serializable {
private static final long serialVersionUID = 675588088506034208L; private static final long serialVersionUID = 675588088506034208L;
@ApiModelProperty(position = 11, required = true, value = "第三方账号唯一标识[64]") @ApiModelProperty(position = 11, required = true, value = "第三方账号唯一标识[64]")
@NotBlank(message = "OPENID不能为空") // @NotBlank(message = "OPENID不能为空")
private String openId; private String openId;
@ApiModelProperty(position = 12, required = true, value = "昵称[64]", example = "Swagger") @ApiModelProperty(position = 12, required = true, value = "昵称[64]", example = "Swagger")
private String nickname; private String nickname;
...@@ -30,6 +28,75 @@ public class AdamThirdPartParam implements Serializable { ...@@ -30,6 +28,75 @@ public class AdamThirdPartParam implements Serializable {
private String mobile; private String mobile;
@ApiModelProperty(position = 16, required = false, value = "验证码[新账号时必传]") @ApiModelProperty(position = 16, required = false, value = "验证码[新账号时必传]")
private String code; private String code;
// @ApiModelProperty(position = 17, required = false, value = "强制绑定[第三方账号已绑定其他手机号时]", example = "false") @ApiModelProperty(position = 17, required = true, value = "第三方应用标识[64],WXS01-正在现场公众号|WXS02-MDSK公众号|WXM01-正在现场移动应用|WXA01-正在现场小程序|WXA02-草莓音乐节小程序|WXA03-MDSK音乐节(适用于同一平台多个应用服务,例如微信的公众号、小程序等)")
@Pattern(regexp = LnsRegex.Valid.TRIPLE_AT_FOR_ULGOIN, message = "平台应用类型无效")
private String openType;
@ApiModelProperty(position = 18, required = true, value = "第三方账号应用标识[64],适用于同一平台多个应用服务(例如微信的openid对应接口属性openid、unionid对应接口属性openId)")
private String openid;
// @ApiModelProperty(position = 19, required = false, value = "强制绑定[第三方账号已绑定其他手机号时]", example = "false")
// private Boolean force; // private Boolean force;
public String getOpenType() {
return openType;
}
public void setOpenType(String openType) {
this.openType = openType;
}
public String getOpenid() {
return openid;
}
public void setOpenid(String openid) {
this.openid = openid;
}
public String getOpenId() {
return openId;
}
public void setOpenId(String openId) {
this.openId = openId;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getAvatar() {
return avatar;
}
public void setAvatar(String avatar) {
this.avatar = avatar;
}
public String getPlatform() {
return platform;
}
public void setPlatform(String platform) {
this.platform = platform;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
} }
...@@ -9,12 +9,11 @@ import lombok.Data; ...@@ -9,12 +9,11 @@ import lombok.Data;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@ApiModel(value = "ThirdPartInfoVo", description = "用户第三方信息") @ApiModel(value = "ThirdPartInfoVo", description = "用户第三方信息")
@Data
public class AdamThirdPartInfoVo implements java.io.Serializable, Cloneable { public class AdamThirdPartInfoVo implements java.io.Serializable, Cloneable {
private static final long serialVersionUID = -3239086191919676121L; private static final long serialVersionUID = -3239086191919676121L;
@ApiModelProperty(position = 11, value = "用户ID[64]") @ApiModelProperty(position = 11, value = "用户ID[64]")
private String uid; private String uid;
@ApiModelProperty(position = 12, value = "第三方ID[64]") @ApiModelProperty(position = 12, value = "第三方平台账号唯一标识ID[64]")
private String openId; private String openId;
@ApiModelProperty(position = 13, value = "昵称[64]") @ApiModelProperty(position = 13, value = "昵称[64]")
private String nickname; private String nickname;
...@@ -28,6 +27,10 @@ public class AdamThirdPartInfoVo implements java.io.Serializable, Cloneable { ...@@ -28,6 +27,10 @@ public class AdamThirdPartInfoVo implements java.io.Serializable, Cloneable {
private LocalDateTime createdAt; private LocalDateTime createdAt;
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern= DateUtil.DATE_FULL_STR) @JsonFormat(shape=JsonFormat.Shape.STRING, pattern= DateUtil.DATE_FULL_STR)
private LocalDateTime updatedAt; private LocalDateTime updatedAt;
@ApiModelProperty(position = 19, value = "第三方平台应用账号标识[64]")
private String openid;
@ApiModelProperty(position = 20, value = "第三方平台应用类型标识[64]")
private String openType;
private static final AdamThirdPartInfoVo obj = new AdamThirdPartInfoVo(); private static final AdamThirdPartInfoVo obj = new AdamThirdPartInfoVo();
...@@ -39,4 +42,84 @@ public class AdamThirdPartInfoVo implements java.io.Serializable, Cloneable { ...@@ -39,4 +42,84 @@ public class AdamThirdPartInfoVo implements java.io.Serializable, Cloneable {
} }
return new AdamThirdPartInfoVo(); return new AdamThirdPartInfoVo();
} }
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public String getOpenId() {
return openId;
}
public void setOpenId(String openId) {
this.openId = openId;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getAvatar() {
return avatar;
}
public void setAvatar(String avatar) {
this.avatar = avatar;
}
public String getPlatform() {
return platform;
}
public void setPlatform(String platform) {
this.platform = platform;
}
public Integer getState() {
return state;
}
public void setState(Integer state) {
this.state = state;
}
public LocalDateTime getCreatedAt() {
return createdAt;
}
public void setCreatedAt(LocalDateTime createdAt) {
this.createdAt = createdAt;
}
public LocalDateTime getUpdatedAt() {
return updatedAt;
}
public void setUpdatedAt(LocalDateTime updatedAt) {
this.updatedAt = updatedAt;
}
public String getOpenid() {
return openid;
}
public void setOpenid(String openid) {
this.openid = openid;
}
public String getOpenType() {
return openType;
}
public void setOpenType(String openType) {
this.openType = openType;
}
} }
...@@ -30,6 +30,17 @@ public interface IAdamUserService { ...@@ -30,6 +30,17 @@ public interface IAdamUserService {
* @return ResponseDto<AdamUserInfoVo> * @return ResponseDto<AdamUserInfoVo>
*/ */
ResponseDto<AdamUserInfoVo> register(AdamThirdPartParam param); ResponseDto<AdamUserInfoVo> register(AdamThirdPartParam param);
/**
* IOS端用户微信唯一标识处理(redis、mongo、mq)
* 原对应关系
* - 安卓端、IOS端:微信openid|unionid~当前API接收参数openId
* 接收参数新增openid字段后
* - 安卓端、IOS端统一:微信unionid~当前API接收参数openId,微信openid~当前API接收参数openid
*
* @param param
* @return ResponseDto<AdamUserInfoVo>
*/
ResponseDto<AdamUserInfoVo> registerV1(AdamThirdPartParam param);
/** /**
* 第三方账号绑定(不存在已绑定账号) * 第三方账号绑定(不存在已绑定账号)
...@@ -38,6 +49,7 @@ public interface IAdamUserService { ...@@ -38,6 +49,7 @@ public interface IAdamUserService {
* @param param * @param param
*/ */
void bindTpa(String uid, AdamThirdPartParam param); void bindTpa(String uid, AdamThirdPartParam param);
void bindTpaV1(String uid, AdamThirdPartParam param);
/** /**
* 第三方账号绑定(存在已绑定账号) * 第三方账号绑定(存在已绑定账号)
......
...@@ -68,6 +68,10 @@ public class LnsRegex { ...@@ -68,6 +68,10 @@ public class LnsRegex {
/* ======================================================================= | 第三方平台类 */ /* ======================================================================= | 第三方平台类 */
/**
* 支持的第三方平台应用类型(用户中心:登录注册)
*/
public static final String TRIPLE_AT_FOR_ULGOIN = "\\b(WXS01|WXS02|WXM01|WXA01|WXA02|WXA03)\\b";
/** /**
* 支持的第三方账号平台类型(用户中心:登录注册) * 支持的第三方账号平台类型(用户中心:登录注册)
*/ */
......
...@@ -9,6 +9,7 @@ import com.fasterxml.jackson.databind.node.ObjectNode; ...@@ -9,6 +9,7 @@ import com.fasterxml.jackson.databind.node.ObjectNode;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSupport; import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.liquidnet.common.cache.redis.util.RedisUtil; import com.liquidnet.common.cache.redis.util.RedisUtil;
import com.liquidnet.common.exception.constant.ErrorCode;
import com.liquidnet.common.sms.constant.SmsEnum; import com.liquidnet.common.sms.constant.SmsEnum;
import com.liquidnet.common.sms.processor.SmsProcessor; import com.liquidnet.common.sms.processor.SmsProcessor;
import com.liquidnet.commons.lang.constant.LnsEnum; import com.liquidnet.commons.lang.constant.LnsEnum;
...@@ -299,14 +300,26 @@ public class AdamLoginController { ...@@ -299,14 +300,26 @@ public class AdamLoginController {
} }
@ApiOperationSupport(order = 6) @ApiOperationSupport(order = 6)
@ApiOperation(value = "第三方账号登录v1") @ApiOperation(value = "第三方账号登录V1")
@PostMapping(value = {"login/tpa_v1"}) @PostMapping(value = {"login/tpa_v1"})
public ResponseDto<AdamLoginInfoVo> loginByTpaV1(@Valid @RequestBody AdamThirdPartParam parameter) { public ResponseDto<AdamLoginInfoVo> loginByTpaV1(@Valid @RequestBody AdamThirdPartParam parameter) {
log.debug("login by tpa:{}", JsonUtils.toJson(parameter)); log.debug("login by tpa:{}", JsonUtils.toJson(parameter));
String uid;
switch (parameter.getPlatform()) {
case "WECHAT":
if (StringUtils.isEmpty(parameter.getOpenType()) || StringUtils.isEmpty(parameter.getOpenid())) {
return ResponseDto.failure(ErrorCode.HTTP_PARAM_ERROR.getCode(), "第三方账号应用标识有误");
}
uid = adamRdmService.getUidByPlatformOpenId(parameter.getPlatform(), parameter.getOpenId(), parameter.getOpenid(), parameter.getOpenType());
break;
default:
uid = adamRdmService.getUidByPlatformOpenId(parameter.getPlatform(), parameter.getOpenId());
break;
}
boolean toRegister = false; boolean toRegister = false;
AdamLoginInfoVo loginInfoVo = AdamLoginInfoVo.getNew(); AdamLoginInfoVo loginInfoVo = AdamLoginInfoVo.getNew();
if (StringUtils.isEmpty(parameter.getMobile())) { if (StringUtils.isEmpty(parameter.getMobile())) {
String uid = adamRdmService.getUidByPlatformOpenId(parameter.getPlatform(), parameter.getOpenId()); // String uid = adamRdmService.getUidByPlatformOpenId(parameter.getPlatform(), parameter.getOpenId());
if (StringUtils.isEmpty(uid)) return ResponseDto.failure(ErrorMapping.get("10006")); if (StringUtils.isEmpty(uid)) return ResponseDto.failure(ErrorMapping.get("10006"));
loginInfoVo.setUserInfo(adamRdmService.getUserInfoVoByUid(uid)); loginInfoVo.setUserInfo(adamRdmService.getUserInfoVoByUid(uid));
...@@ -315,20 +328,25 @@ public class AdamLoginController { ...@@ -315,20 +328,25 @@ public class AdamLoginController {
loginInfoVo.setUserMemberVo(adamRdmService.getUserMemberVoByUid(uid)); loginInfoVo.setUserMemberVo(adamRdmService.getUserMemberVoByUid(uid));
// loginInfoVo.setMemberVo(adamRdmService.getMemberSimpleVo()); // loginInfoVo.setMemberVo(adamRdmService.getMemberSimpleVo());
} else {// 新账号注册 } else {// 新账号注册
ResponseDto<AdamLoginInfoVo> checkSmsCodeDto = this.checkSmsCode(parameter.getMobile(), parameter.getCode()); if (StringUtils.isNotEmpty(uid)) {
if (!checkSmsCodeDto.isSuccess()) { loginInfoVo.setUserInfo(adamRdmService.getUserInfoVoByUid(uid));
return checkSmsCodeDto; loginInfoVo.setUserMemberVo(adamRdmService.getUserMemberVoByUid(uid));
}
ResponseDto<AdamUserInfoVo> registerRespDto = adamUserService.register(parameter);
if (!registerRespDto.isSuccess()) {
return ResponseDto.failure(registerRespDto.getCode(), registerRespDto.getMessage());
} else { } else {
AdamUserInfoVo registerUserInfo = registerRespDto.getData(); ResponseDto<AdamLoginInfoVo> checkSmsCodeDto = this.checkSmsCode(parameter.getMobile(), parameter.getCode());
loginInfoVo.setUserInfo(registerUserInfo); if (!checkSmsCodeDto.isSuccess()) {
loginInfoVo.setThirdPartInfo(adamRdmService.getThirdPartVoListByUid(registerUserInfo.getUid())); return checkSmsCodeDto;
}
ResponseDto<AdamUserInfoVo> registerRespDto = adamUserService.registerV1(parameter);
if (!registerRespDto.isSuccess()) {
return ResponseDto.failure(registerRespDto.getCode(), registerRespDto.getMessage());
} else {
AdamUserInfoVo registerUserInfo = registerRespDto.getData();
loginInfoVo.setUserInfo(registerUserInfo);
loginInfoVo.setThirdPartInfo(adamRdmService.getThirdPartVoListByUid(registerUserInfo.getUid()));
// loginInfoVo.setMemberVo(adamRdmService.getMemberSimpleVo()); // loginInfoVo.setMemberVo(adamRdmService.getMemberSimpleVo());
}
toRegister = true;
} }
toRegister = true;
} }
loginInfoVo.setToken(this.ssoProcess(loginInfoVo.getUserInfo())); loginInfoVo.setToken(this.ssoProcess(loginInfoVo.getUserInfo()));
loginInfoVo.getUserInfo().setMobile(SensitizeUtil.custom(loginInfoVo.getUserInfo().getMobile(), 3, 4)); loginInfoVo.getUserInfo().setMobile(SensitizeUtil.custom(loginInfoVo.getUserInfo().getMobile(), 3, 4));
......
...@@ -2,6 +2,7 @@ package com.liquidnet.service.adam.controller; ...@@ -2,6 +2,7 @@ package com.liquidnet.service.adam.controller;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSupport; import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.liquidnet.common.exception.constant.ErrorCode;
import com.liquidnet.commons.lang.constant.LnsEnum; import com.liquidnet.commons.lang.constant.LnsEnum;
import com.liquidnet.commons.lang.constant.LnsRegex; import com.liquidnet.commons.lang.constant.LnsRegex;
import com.liquidnet.commons.lang.util.CollectionUtil; import com.liquidnet.commons.lang.util.CollectionUtil;
...@@ -288,6 +289,45 @@ public class AdamUserController { ...@@ -288,6 +289,45 @@ public class AdamUserController {
} }
@ApiOperationSupport(order = 8) @ApiOperationSupport(order = 8)
@ApiOperation(value = "绑定第三方账号V1")
@PostMapping(value = {"tpa/bind_v1"})
public ResponseDto<List<AdamThirdPartInfoVo>> bindTpaV1(@Valid @RequestBody AdamThirdPartParam parameter) {
String currentUid = CurrentUtil.getCurrentUid();
// String existUid = adamRdmService.getUidByPlatformOpenId(parameter.getPlatform(), parameter.getOpenId());
String existUid;
switch (parameter.getPlatform()) {
case "WECHAT":
if (StringUtils.isEmpty(parameter.getOpenType()) || StringUtils.isEmpty(parameter.getOpenid())) {
return ResponseDto.failure(ErrorCode.HTTP_PARAM_ERROR.getCode(), "第三方账号应用标识有误");
}
existUid = adamRdmService.getUidByPlatformOpenId(parameter.getPlatform(), parameter.getOpenId(), parameter.getOpenid(), parameter.getOpenType());
break;
default:
existUid = adamRdmService.getUidByPlatformOpenId(parameter.getPlatform(), parameter.getOpenId());
break;
}
if (StringUtils.isNotEmpty(existUid)) {
if (existUid.equals(currentUid)) {
return ResponseDto.success(adamRdmService.getThirdPartVoListByUid(currentUid));
}
// Boolean force = parameter.getForce();
// if (null != force && force) {// 强制解绑,并重新绑定当前账号
// adamUserService.bindTpaForce(currentUid, existUid, parameter);
// return ResponseDto.success();
// }
return ResponseDto.failure(ErrorMapping.get("10007"));
}
// 判断该用户是否已绑定同类型第三方账号
AdamThirdPartInfoVo bindThirdPartVo = adamRdmService.getThirdPartVoByUidPlatform(currentUid, parameter.getPlatform());
if (null != bindThirdPartVo) return ResponseDto.failure(ErrorMapping.get("10008"));
adamUserService.bindTpaV1(currentUid, parameter);
return ResponseDto.success(adamRdmService.getThirdPartVoListByUid(currentUid));
}
@ApiOperationSupport(order = 9)
@ApiOperation(value = "解绑第三方账号") @ApiOperation(value = "解绑第三方账号")
@ApiImplicitParams({ @ApiImplicitParams({
@ApiImplicitParam(type = "form", required = true, dataType = "String", name = "platform", value = "平台类型", allowableValues = "WEIBO,WECHAT,QQ"), @ApiImplicitParam(type = "form", required = true, dataType = "String", name = "platform", value = "平台类型", allowableValues = "WEIBO,WECHAT,QQ"),
...@@ -303,7 +343,7 @@ public class AdamUserController { ...@@ -303,7 +343,7 @@ public class AdamUserController {
return ResponseDto.success(adamRdmService.getThirdPartVoListByUid(currentUid)); return ResponseDto.success(adamRdmService.getThirdPartVoListByUid(currentUid));
} }
@ApiOperationSupport(order = 9) @ApiOperationSupport(order = 10)
@ApiOperation(value = "个人信息") @ApiOperation(value = "个人信息")
@PostMapping(value = {"info"}) @PostMapping(value = {"info"})
public ResponseDto<Map<String, Object>> info() { public ResponseDto<Map<String, Object>> info() {
......
...@@ -2,10 +2,13 @@ package com.liquidnet.service.adam.service; ...@@ -2,10 +2,13 @@ package com.liquidnet.service.adam.service;
import com.liquidnet.common.cache.redis.util.RedisUtil; import com.liquidnet.common.cache.redis.util.RedisUtil;
import com.liquidnet.commons.lang.util.SensitizeUtil; import com.liquidnet.commons.lang.util.SensitizeUtil;
import com.liquidnet.service.adam.constant.AdamEnum;
import com.liquidnet.service.adam.constant.AdamRedisConst; import com.liquidnet.service.adam.constant.AdamRedisConst;
import com.liquidnet.service.adam.dto.vo.*; import com.liquidnet.service.adam.dto.vo.*;
import com.liquidnet.service.adam.util.NknameUtil;
import com.liquidnet.service.adam.util.ObjectUtil; import com.liquidnet.service.adam.util.ObjectUtil;
import com.liquidnet.service.adam.util.QueueUtils;
import com.liquidnet.service.base.SqlMapping;
import com.liquidnet.service.base.constant.MQConst;
import com.liquidnet.service.kylin.constant.KylinRedisConst; import com.liquidnet.service.kylin.constant.KylinRedisConst;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinPerformanceVo; import com.liquidnet.service.kylin.dto.vo.mongo.KylinPerformanceVo;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
...@@ -25,6 +28,8 @@ public class AdamRdmService { ...@@ -25,6 +28,8 @@ public class AdamRdmService {
// MongoTemplate mongoTemplate; // MongoTemplate mongoTemplate;
@Autowired @Autowired
RedisUtil redisUtil; RedisUtil redisUtil;
@Autowired
QueueUtils queueUtils;
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | Switch config */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | Switch config */
...@@ -81,6 +86,10 @@ public class AdamRdmService { ...@@ -81,6 +86,10 @@ public class AdamRdmService {
return redisUtil.set(AdamRedisConst.IDENTITY_THIRD_PARTY + platform + ":" + openId, uid); return redisUtil.set(AdamRedisConst.IDENTITY_THIRD_PARTY + platform + ":" + openId, uid);
} }
public boolean setUidByPlatformOpenId(String platform, String openId, String uid, String openType) {
return redisUtil.set(AdamRedisConst.IDENTITY_THIRD_PARTY + platform + ":" + openId, uid.concat(",").concat(openType));
}
public String getUidByPlatformOpenId(String platform, String openId) { public String getUidByPlatformOpenId(String platform, String openId) {
String key = AdamRedisConst.IDENTITY_THIRD_PARTY + platform + ":" + openId; String key = AdamRedisConst.IDENTITY_THIRD_PARTY + platform + ":" + openId;
long s = System.currentTimeMillis(); long s = System.currentTimeMillis();
...@@ -100,6 +109,59 @@ public class AdamRdmService { ...@@ -100,6 +109,59 @@ public class AdamRdmService {
return val; return val;
} }
/**
* openId为用户第三方平台账号的唯一标识,该平台下不同openType之间以openid区分(注意区分openId与openid大小写)
*
* @param platform
* @param openId
* @param openid
* @param openType
* @return
*/
public String getUidByPlatformOpenId(String platform, String openId, String openid, String openType) {
String val = (String) redisUtil.get(AdamRedisConst.IDENTITY_THIRD_PARTY + platform + ":" + openId);
if (!StringUtils.isEmpty(val)) {// openId(即unionid)标记的uid
return val;
}
val = (String) redisUtil.get(AdamRedisConst.IDENTITY_THIRD_PARTY + platform + ":" + openid);
if (!StringUtils.isEmpty(val)) {// openid标记的uid
String[] valArr = val.split(",");
boolean openIdIsEmpty = StringUtils.isEmpty(openId);
switch (valArr.length) {
case 1:// TODO: 2021/8/4 这里微信openid标记的用户默认为'WXM01-正在现场移动应用'的用户(截止当前第三方登录只有APP端支持,所以截止当前存量用户默认都是WXM01)
if (openType.equals(AdamEnum.OpenType.WXM01.name())) {
if (openIdIsEmpty) {// openId为空,则补充openType到<openid:uid,openType>
this.setUidByPlatformOpenId(platform, openid, valArr[0], openType);
} else {// openId不为空,修改原<openid:uid>映射关系重置为<openId:uid>
this.setUidByPlatformOpenId(platform, openId, valArr[0]);
queueUtils.sendMsgByRedis(
MQConst.AdamQueue.SQL_UCENTER.getKey(),
SqlMapping.get("adam_third_party.update_open_id", openId, valArr[0], platform)
);
}
return valArr[0];
}
break;
case 2:// 比对openType是否一致,保证openid为同一个用户(openid在不同openType下不唯一)
if (org.apache.commons.lang3.StringUtils.equals(openType, valArr[1])) {
if (!openIdIsEmpty) {// openId不为空,修改原<openid:uid>映射关系重置为<openId:uid>
this.setUidByPlatformOpenId(platform, openId, valArr[0]);
queueUtils.sendMsgByRedis(
MQConst.AdamQueue.SQL_UCENTER.getKey(),
SqlMapping.get("adam_third_party.update_open_id", openId, valArr[0], platform)
);
}
return valArr[0];
}
break;
}
return null;
}
return val;
}
public void delUidByPlatformOpenId(String platform, String openId) { public void delUidByPlatformOpenId(String platform, String openId) {
redisUtil.del(AdamRedisConst.IDENTITY_THIRD_PARTY + platform + ":" + openId); redisUtil.del(AdamRedisConst.IDENTITY_THIRD_PARTY + platform + ":" + openId);
} }
......
...@@ -126,13 +126,74 @@ public class AdamUserServiceImpl implements IAdamUserService { ...@@ -126,13 +126,74 @@ public class AdamUserServiceImpl implements IAdamUserService {
userInfoVo.setQrCode("lN".concat(userInfoVo.getUid()).concat(RandomStringUtils.randomAlphanumeric(5).toUpperCase())); userInfoVo.setQrCode("lN".concat(userInfoVo.getUid()).concat(RandomStringUtils.randomAlphanumeric(5).toUpperCase()));
userInfoVo.setCreateAt(now); userInfoVo.setCreateAt(now);
// s = System.currentTimeMillis(); toMqSqls.add(SqlMapping.get("adam_user.add"));
// mongoTemplate.insert(userInfoVo, AdamUserInfoVo.class.getSimpleName()); initUserObjs.add(new Object[]{userInfoVo.getUid(), userInfoVo.getMobile(), userInfoVo.getState(), 0, now});
// log.debug("#MDB耗时:{}ms", System.currentTimeMillis() - s); toMqSqls.add(SqlMapping.get("adam_user_info.add"));
initUserInfoObjs.add(new Object[]{userInfoVo.getUid(), userInfoVo.getNickname(), userInfoVo.getAvatar(), userInfoVo.getQrCode()});
// userInfoVo.setMobile(SensitizeUtil.custom(param.getMobile(), 3, 4)); AdamThirdPartInfoVo thirdPartInfoVo = AdamThirdPartInfoVo.getNew();
thirdPartInfoVo.setUid(userInfoVo.getUid());
thirdPartInfoVo.setOpenId(param.getOpenId());
thirdPartInfoVo.setNickname(param.getNickname());
thirdPartInfoVo.setAvatar(param.getAvatar());
thirdPartInfoVo.setPlatform(param.getPlatform());
thirdPartInfoVo.setState(1);// 1-绑定
thirdPartInfoVo.setCreatedAt(now);
toMqSqls.add(SqlMapping.get("adam_third_party.add"));
initThirdPartObjs.add(new Object[]{thirdPartInfoVo.getUid(), thirdPartInfoVo.getOpenId(), thirdPartInfoVo.getAvatar(), thirdPartInfoVo.getNickname(), thirdPartInfoVo.getPlatform(), thirdPartInfoVo.getState(), thirdPartInfoVo.getCreatedAt()});
s = System.currentTimeMillis();
adamRdmService.setUserInfoVoByUid(userInfoVo.getUid(), userInfoVo); adamRdmService.setUserInfoVoByUid(userInfoVo.getUid(), userInfoVo);
adamRdmService.addThirdPartVoListByUid(thirdPartInfoVo.getUid(), null, thirdPartInfoVo);
adamRdmService.setUidByPlatformOpenId(param.getPlatform(), param.getOpenId(), thirdPartInfoVo.getUid());
adamRdmService.setUidByMobile(param.getMobile(), thirdPartInfoVo.getUid());
log.debug("#RDS耗时:{}ms", System.currentTimeMillis() - s);
s = System.currentTimeMillis();
queueUtils.sendMsgByRedis(MQConst.AdamQueue.SQL_UREGISTER.getKey(),
SqlMapping.gets(toMqSqls, initUserObjs, initUserInfoObjs, initThirdPartObjs)
);
log.debug("#MQ耗时:{}ms", System.currentTimeMillis() - s);
} else {// 手机号已注册
// 判断已注册用户是否绑定同平台的第三方账号
AdamThirdPartInfoVo thirdPartVo = adamRdmService.getThirdPartVoByUidPlatform(uid, param.getPlatform());
if (null == thirdPartVo) {// 未绑定
this.bindTpa(uid, param);
userInfoVo = adamRdmService.getUserInfoVoByUid(uid);
} else if (thirdPartVo.getOpenId().equals(param.getOpenId())) {
userInfoVo = adamRdmService.getUserInfoVoByUid(uid);
} else {
return ResponseDto.failure(ErrorMapping.get("10010"));
}
}
return ResponseDto.success(userInfoVo);
}
@Override
public ResponseDto<AdamUserInfoVo> registerV1(AdamThirdPartParam param) {
LocalDateTime now = LocalDateTime.now();
AdamUserInfoVo userInfoVo;
long s = System.currentTimeMillis();
String uid = adamRdmService.getUidByMobile(param.getMobile());
log.debug("#RDS耗时:{}ms", System.currentTimeMillis() - s);
LinkedList<String> toMqSqls = CollectionUtil.linkedListString();
LinkedList<Object[]> initUserObjs = CollectionUtil.linkedListObjectArr(),
initUserInfoObjs = CollectionUtil.linkedListObjectArr(),
initThirdPartObjs = CollectionUtil.linkedListObjectArr();
if (StringUtils.isEmpty(uid)) {// 手机号未注册
userInfoVo = AdamUserInfoVo.getNew();
userInfoVo.setUid(IDGenerator.nextSnowId() + "");
userInfoVo.setMobile(param.getMobile());
userInfoVo.setNickname(param.getNickname());
userInfoVo.setAvatar(param.getAvatar());
userInfoVo.setIsComplete(0);
userInfoVo.setState(1);
userInfoVo.setQrCode("lN".concat(userInfoVo.getUid()).concat(RandomStringUtils.randomAlphanumeric(5).toUpperCase()));
userInfoVo.setCreateAt(now);
toMqSqls.add(SqlMapping.get("adam_user.add")); toMqSqls.add(SqlMapping.get("adam_user.add"));
initUserObjs.add(new Object[]{userInfoVo.getUid(), userInfoVo.getMobile(), userInfoVo.getState(), 0, now}); initUserObjs.add(new Object[]{userInfoVo.getUid(), userInfoVo.getMobile(), userInfoVo.getState(), 0, now});
...@@ -140,21 +201,43 @@ public class AdamUserServiceImpl implements IAdamUserService { ...@@ -140,21 +201,43 @@ public class AdamUserServiceImpl implements IAdamUserService {
initUserInfoObjs.add(new Object[]{userInfoVo.getUid(), userInfoVo.getNickname(), userInfoVo.getAvatar(), userInfoVo.getQrCode()}); initUserInfoObjs.add(new Object[]{userInfoVo.getUid(), userInfoVo.getNickname(), userInfoVo.getAvatar(), userInfoVo.getQrCode()});
AdamThirdPartInfoVo thirdPartInfoVo = AdamThirdPartInfoVo.getNew(); AdamThirdPartInfoVo thirdPartInfoVo = AdamThirdPartInfoVo.getNew();
BeanUtils.copyProperties(param, thirdPartInfoVo);
thirdPartInfoVo.setCreatedAt(now);
thirdPartInfoVo.setUid(userInfoVo.getUid()); thirdPartInfoVo.setUid(userInfoVo.getUid());
thirdPartInfoVo.setOpenId(param.getOpenId());
thirdPartInfoVo.setNickname(param.getNickname());
thirdPartInfoVo.setAvatar(param.getAvatar());
thirdPartInfoVo.setPlatform(param.getPlatform());
thirdPartInfoVo.setState(1);// 1-绑定 thirdPartInfoVo.setState(1);// 1-绑定
thirdPartInfoVo.setCreatedAt(now);
thirdPartInfoVo.setOpenid(param.getOpenid());
thirdPartInfoVo.setOpenType(param.getOpenType());
switch (param.getPlatform()) {
case "WECHAT":
if (StringUtils.isEmpty(param.getOpenId())) {// openId为空,设置映射关系<openid:uid,openType>
thirdPartInfoVo.setOpenId(param.getOpenid());
adamRdmService.setUidByPlatformOpenId(param.getPlatform(), param.getOpenid(), thirdPartInfoVo.getUid(), param.getOpenType());
} else {// openId不为空,设置映射关系<openId:uid>
adamRdmService.setUidByPlatformOpenId(param.getPlatform(), param.getOpenId(), thirdPartInfoVo.getUid());
}
break;
default:
adamRdmService.setUidByPlatformOpenId(param.getPlatform(), param.getOpenId(), thirdPartInfoVo.getUid());
break;
}
// s = System.currentTimeMillis();
// mongoTemplate.insert(thirdPartInfoVo, AdamThirdPartInfoVo.class.getSimpleName());
// log.debug("#MDB耗时:{}ms", System.currentTimeMillis() - s);
toMqSqls.add(SqlMapping.get("adam_third_party.add")); toMqSqls.add(SqlMapping.get("adam_third_party.addV1"));
initThirdPartObjs.add(new Object[]{thirdPartInfoVo.getUid(), thirdPartInfoVo.getOpenId(), thirdPartInfoVo.getAvatar(), thirdPartInfoVo.getNickname(), thirdPartInfoVo.getPlatform(), thirdPartInfoVo.getState(), thirdPartInfoVo.getCreatedAt()}); initThirdPartObjs.add(
new Object[]{thirdPartInfoVo.getUid(), thirdPartInfoVo.getOpenId(), thirdPartInfoVo.getAvatar(),
thirdPartInfoVo.getNickname(), thirdPartInfoVo.getPlatform(), thirdPartInfoVo.getState(),
thirdPartInfoVo.getCreatedAt(), thirdPartInfoVo.getOpenType()}
);
s = System.currentTimeMillis(); s = System.currentTimeMillis();
adamRdmService.setUserInfoVoByUid(userInfoVo.getUid(), userInfoVo);
adamRdmService.addThirdPartVoListByUid(thirdPartInfoVo.getUid(), null, thirdPartInfoVo); adamRdmService.addThirdPartVoListByUid(thirdPartInfoVo.getUid(), null, thirdPartInfoVo);
adamRdmService.setUidByPlatformOpenId(param.getPlatform(), param.getOpenId(), thirdPartInfoVo.getUid()); // adamRdmService.setUidByPlatformOpenId(param.getPlatform(), param.getOpenId(), thirdPartInfoVo.getUid());
adamRdmService.setUidByMobile(param.getMobile(), thirdPartInfoVo.getUid()); adamRdmService.setUidByMobile(param.getMobile(), thirdPartInfoVo.getUid());
log.debug("#RDS耗时:{}ms", System.currentTimeMillis() - s); log.debug("#RDS耗时:{}ms", System.currentTimeMillis() - s);
...@@ -185,10 +268,13 @@ public class AdamUserServiceImpl implements IAdamUserService { ...@@ -185,10 +268,13 @@ public class AdamUserServiceImpl implements IAdamUserService {
LocalDateTime now = LocalDateTime.now(); LocalDateTime now = LocalDateTime.now();
AdamThirdPartInfoVo thirdPartInfoVo = AdamThirdPartInfoVo.getNew(); AdamThirdPartInfoVo thirdPartInfoVo = AdamThirdPartInfoVo.getNew();
BeanUtils.copyProperties(param, thirdPartInfoVo);
thirdPartInfoVo.setCreatedAt(now);
thirdPartInfoVo.setUid(uid); thirdPartInfoVo.setUid(uid);
thirdPartInfoVo.setOpenId(param.getOpenId());
thirdPartInfoVo.setNickname(param.getNickname());
thirdPartInfoVo.setAvatar(param.getAvatar());
thirdPartInfoVo.setPlatform(param.getPlatform());
thirdPartInfoVo.setState(1);// 1-绑定 thirdPartInfoVo.setState(1);// 1-绑定
thirdPartInfoVo.setCreatedAt(now);
// long s = System.currentTimeMillis(); // long s = System.currentTimeMillis();
// mongoTemplate.insert(thirdPartInfoVo, AdamThirdPartInfoVo.class.getSimpleName()); // mongoTemplate.insert(thirdPartInfoVo, AdamThirdPartInfoVo.class.getSimpleName());
...@@ -213,6 +299,54 @@ public class AdamUserServiceImpl implements IAdamUserService { ...@@ -213,6 +299,54 @@ public class AdamUserServiceImpl implements IAdamUserService {
log.debug("#MQ耗时:{}ms", System.currentTimeMillis() - s); log.debug("#MQ耗时:{}ms", System.currentTimeMillis() - s);
} }
@Override
// @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public void bindTpaV1(String uid, AdamThirdPartParam param) {
LocalDateTime now = LocalDateTime.now();
AdamThirdPartInfoVo thirdPartInfoVo = AdamThirdPartInfoVo.getNew();
thirdPartInfoVo.setUid(uid);
thirdPartInfoVo.setOpenId(param.getOpenId());
thirdPartInfoVo.setNickname(param.getNickname());
thirdPartInfoVo.setAvatar(param.getAvatar());
thirdPartInfoVo.setPlatform(param.getPlatform());
thirdPartInfoVo.setState(1);// 1-绑定
thirdPartInfoVo.setCreatedAt(now);
thirdPartInfoVo.setOpenid(param.getOpenid());
thirdPartInfoVo.setOpenType(param.getOpenType());
long s = System.currentTimeMillis();
// adamRdmService.setUidByPlatformOpenId(param.getPlatform(), param.getOpenId(), uid);
switch (param.getPlatform()) {
case "WECHAT":
if (StringUtils.isEmpty(param.getOpenId())) {// openId为空,设置映射关系<openid:uid,openType>
thirdPartInfoVo.setOpenId(param.getOpenid());
adamRdmService.setUidByPlatformOpenId(param.getPlatform(), param.getOpenid(), thirdPartInfoVo.getUid(), param.getOpenType());
} else {// openId不为空,设置映射关系<openId:uid>
adamRdmService.setUidByPlatformOpenId(param.getPlatform(), param.getOpenId(), thirdPartInfoVo.getUid());
}
break;
default:
adamRdmService.setUidByPlatformOpenId(param.getPlatform(), param.getOpenId(), thirdPartInfoVo.getUid());
break;
}
log.debug("#RDS耗时:{}ms", System.currentTimeMillis() - s);
s = System.currentTimeMillis();
// adamRdmService.delThirdPartVoListByUid(uid);
adamRdmService.addThirdPartVoListByUid(uid, adamRdmService.getThirdPartVoListByUid(uid), thirdPartInfoVo);
log.debug("#RDS耗时:{}ms", System.currentTimeMillis() - s);
s = System.currentTimeMillis();
queueUtils.sendMsgByRedis(MQConst.AdamQueue.SQL_UCENTER.getKey(),
SqlMapping.get(
"adam_third_party.add",
thirdPartInfoVo.getUid(), thirdPartInfoVo.getOpenId(), thirdPartInfoVo.getAvatar(), thirdPartInfoVo.getNickname(), thirdPartInfoVo.getPlatform(), thirdPartInfoVo.getState(), thirdPartInfoVo.getCreatedAt()
)
);
log.debug("#MQ耗时:{}ms", System.currentTimeMillis() - s);
}
@Override @Override
// @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) // @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public void bindTpaForce(String bindUid, String unBindUid, AdamThirdPartParam param) { public void bindTpaForce(String bindUid, String unBindUid, AdamThirdPartParam param) {
......
...@@ -12,6 +12,8 @@ adam_real_name.add=INSERT INTO adam_real_name (real_name_id, `uid`, `type`, `nam ...@@ -12,6 +12,8 @@ adam_real_name.add=INSERT INTO adam_real_name (real_name_id, `uid`, `type`, `nam
# ---------------------------------------------------- # ----------------------------------------------------
adam_third_party.add=INSERT INTO adam_third_party (`uid`, open_id, avatar, nickname, platform, `state`, created_at) values (?,?,?,?,?,?,?) adam_third_party.add=INSERT INTO adam_third_party (`uid`, open_id, avatar, nickname, platform, `state`, created_at) values (?,?,?,?,?,?,?)
adam_third_party.addV1=INSERT INTO adam_third_party (`uid`, open_id, avatar, nickname, platform, `state`, created_at, `comment`) values (?,?,?,?,?,?,?,?)
adam_third_party.update_open_id=UPDATE adam_third_party SET open_id=?, updated_at=now(), comment=concat(comment, curdate()) WHERE `uid`=? AND platform=?
adam_third_party.unbind=UPDATE adam_third_party SET `state`=2, updated_at=? WHERE `uid`=? AND platform=? adam_third_party.unbind=UPDATE adam_third_party SET `state`=2, updated_at=? WHERE `uid`=? AND platform=?
adam_third_party.close=UPDATE adam_third_party SET `state`=2, open_id=concat(open_id, curdate()), updated_at=?, comment='close' WHERE `uid`=? adam_third_party.close=UPDATE adam_third_party SET `state`=2, open_id=concat(open_id, curdate()), updated_at=?, comment='close' WHERE `uid`=?
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment