记得上下班打卡 | 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;
import com.liquidnet.commons.lang.constant.LnsRegex;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
......@@ -11,11 +10,10 @@ import javax.validation.constraints.Size;
import java.io.Serializable;
@ApiModel(value = "AdamThirdPartParam", description = "第三方账号登录注册入参")
@Data
public class AdamThirdPartParam implements Serializable {
private static final long serialVersionUID = 675588088506034208L;
@ApiModelProperty(position = 11, required = true, value = "第三方账号唯一标识[64]")
@NotBlank(message = "OPENID不能为空")
// @NotBlank(message = "OPENID不能为空")
private String openId;
@ApiModelProperty(position = 12, required = true, value = "昵称[64]", example = "Swagger")
private String nickname;
......@@ -30,6 +28,75 @@ public class AdamThirdPartParam implements Serializable {
private String mobile;
@ApiModelProperty(position = 16, required = false, value = "验证码[新账号时必传]")
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;
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;
import java.time.LocalDateTime;
@ApiModel(value = "ThirdPartInfoVo", description = "用户第三方信息")
@Data
public class AdamThirdPartInfoVo implements java.io.Serializable, Cloneable {
private static final long serialVersionUID = -3239086191919676121L;
@ApiModelProperty(position = 11, value = "用户ID[64]")
private String uid;
@ApiModelProperty(position = 12, value = "第三方ID[64]")
@ApiModelProperty(position = 12, value = "第三方平台账号唯一标识ID[64]")
private String openId;
@ApiModelProperty(position = 13, value = "昵称[64]")
private String nickname;
......@@ -28,6 +27,10 @@ public class AdamThirdPartInfoVo implements java.io.Serializable, Cloneable {
private LocalDateTime createdAt;
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern= DateUtil.DATE_FULL_STR)
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();
......@@ -39,4 +42,84 @@ public class AdamThirdPartInfoVo implements java.io.Serializable, Cloneable {
}
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 {
* @return ResponseDto<AdamUserInfoVo>
*/
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 {
* @param param
*/
void bindTpa(String uid, AdamThirdPartParam param);
void bindTpaV1(String uid, AdamThirdPartParam param);
/**
* 第三方账号绑定(存在已绑定账号)
......
......@@ -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;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
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.processor.SmsProcessor;
import com.liquidnet.commons.lang.constant.LnsEnum;
......@@ -299,14 +300,26 @@ public class AdamLoginController {
}
@ApiOperationSupport(order = 6)
@ApiOperation(value = "第三方账号登录v1")
@ApiOperation(value = "第三方账号登录V1")
@PostMapping(value = {"login/tpa_v1"})
public ResponseDto<AdamLoginInfoVo> loginByTpaV1(@Valid @RequestBody AdamThirdPartParam 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;
AdamLoginInfoVo loginInfoVo = AdamLoginInfoVo.getNew();
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"));
loginInfoVo.setUserInfo(adamRdmService.getUserInfoVoByUid(uid));
......@@ -315,11 +328,15 @@ public class AdamLoginController {
loginInfoVo.setUserMemberVo(adamRdmService.getUserMemberVoByUid(uid));
// loginInfoVo.setMemberVo(adamRdmService.getMemberSimpleVo());
} else {// 新账号注册
if (StringUtils.isNotEmpty(uid)) {
loginInfoVo.setUserInfo(adamRdmService.getUserInfoVoByUid(uid));
loginInfoVo.setUserMemberVo(adamRdmService.getUserMemberVoByUid(uid));
} else {
ResponseDto<AdamLoginInfoVo> checkSmsCodeDto = this.checkSmsCode(parameter.getMobile(), parameter.getCode());
if (!checkSmsCodeDto.isSuccess()) {
return checkSmsCodeDto;
}
ResponseDto<AdamUserInfoVo> registerRespDto = adamUserService.register(parameter);
ResponseDto<AdamUserInfoVo> registerRespDto = adamUserService.registerV1(parameter);
if (!registerRespDto.isSuccess()) {
return ResponseDto.failure(registerRespDto.getCode(), registerRespDto.getMessage());
} else {
......@@ -330,6 +347,7 @@ public class AdamLoginController {
}
toRegister = true;
}
}
loginInfoVo.setToken(this.ssoProcess(loginInfoVo.getUserInfo()));
loginInfoVo.getUserInfo().setMobile(SensitizeUtil.custom(loginInfoVo.getUserInfo().getMobile(), 3, 4));
log.info(UserPathDto.setData(toRegister ? "注册" : "登录", ServletUtils.getRequest().getParameterMap(), loginInfoVo));
......
......@@ -2,6 +2,7 @@ package com.liquidnet.service.adam.controller;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
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.LnsRegex;
import com.liquidnet.commons.lang.util.CollectionUtil;
......@@ -288,6 +289,45 @@ public class AdamUserController {
}
@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 = "解绑第三方账号")
@ApiImplicitParams({
@ApiImplicitParam(type = "form", required = true, dataType = "String", name = "platform", value = "平台类型", allowableValues = "WEIBO,WECHAT,QQ"),
......@@ -303,7 +343,7 @@ public class AdamUserController {
return ResponseDto.success(adamRdmService.getThirdPartVoListByUid(currentUid));
}
@ApiOperationSupport(order = 9)
@ApiOperationSupport(order = 10)
@ApiOperation(value = "个人信息")
@PostMapping(value = {"info"})
public ResponseDto<Map<String, Object>> info() {
......
......@@ -2,10 +2,13 @@ package com.liquidnet.service.adam.service;
import com.liquidnet.common.cache.redis.util.RedisUtil;
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.dto.vo.*;
import com.liquidnet.service.adam.util.NknameUtil;
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.dto.vo.mongo.KylinPerformanceVo;
import lombok.extern.slf4j.Slf4j;
......@@ -25,6 +28,8 @@ public class AdamRdmService {
// MongoTemplate mongoTemplate;
@Autowired
RedisUtil redisUtil;
@Autowired
QueueUtils queueUtils;
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | Switch config */
......@@ -81,6 +86,10 @@ public class AdamRdmService {
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) {
String key = AdamRedisConst.IDENTITY_THIRD_PARTY + platform + ":" + openId;
long s = System.currentTimeMillis();
......@@ -100,6 +109,59 @@ public class AdamRdmService {
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) {
redisUtil.del(AdamRedisConst.IDENTITY_THIRD_PARTY + platform + ":" + openId);
}
......
......@@ -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.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.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