Commit 9238ed78 authored by 王亮's avatar 王亮

finished commit(jiguang)

parent b624e36f
package cn.quantgroup.xyqb.controller.req.v2;
import cn.quantgroup.xyqb.model.ClientType;
import com.alibaba.fastjson.JSONObject;
import lombok.Data;
......@@ -13,4 +14,11 @@ public class LoginReq {
//是否需要用户资料
private boolean attachInfo;
/**
* 0:h5,1:web,2:app
* @see ClientType
*/
@NotNull
private Integer clientType;
}
......@@ -16,6 +16,7 @@ public enum BizExceptionEnum {
EXPIRE_SMS_CODE("1005","验证码失效,请重新获取"),
ERROR_SMS_CODE("1006","短信验证码错误"),
ERROR_OR_ENABLE_ERROR("1007","账号异常,请联系平台客服。"),
ERROR_DIRECT_LOGIN("1008","极验登录验证失败"),
// 验证码相关 20 开头
......
......@@ -13,4 +13,7 @@ public class SMSDirectLoginParam extends BaseLoginParam{
private String phone;
@NotNull
private String token;
private Integer clientType;
}
......@@ -10,4 +10,6 @@ public class SMSLoginParam extends BaseLoginParam{
private String phone;
@Size(min = 4,max = 8,message = "短信验证码不正确")
private String code;
private Integer clientType;
}
package cn.quantgroup.xyqb.remote;
import cn.quantgroup.xyqb.model.*;
import cn.quantgroup.xyqb.remote.config.JiGuangConfiguration;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@FeignClient(name = "jiGuangApi")
@FeignClient(name = "jiGuangApi",configuration = JiGuangConfiguration.class)
public interface JiGuangRemoteService {
@PostMapping("${user.auth.manager.Urora.properties.loginTokenVerify}")
JiGuangResponseParam webLoginTokenVerify(@RequestBody JiGuangRequestParam param);
......
package cn.quantgroup.xyqb.remote.codec;
import cn.quantgroup.xyqb.model.JiGuangResponseParam;
import com.google.gson.Gson;
import feign.FeignException;
import feign.Response;
import feign.codec.Decoder;
import javax.crypto.Cipher;
import java.io.IOException;
import java.lang.reflect.Type;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Base64;
public class JiGuangDecoder implements Decoder {
private final Gson gson;
private final String privateKey;
public JiGuangDecoder(Gson gson,String privateKey) {
this.gson = gson;
this.privateKey = privateKey;
}
@Override
public Object decode(Response response, Type type) throws IOException, FeignException {
JiGuangResponseParam responseParam;
responseParam = gson.fromJson(response.body().asReader(), JiGuangResponseParam.class);
if(responseParam!=null && responseParam.getCode()==8000){
try {
responseParam.setPhone(decrypt(responseParam.getPhone(),privateKey));
} catch (Exception e) {
responseParam.setPhone(null);
}
}
return responseParam;
}
private static String decrypt(String cryptedString, String privateKey) throws Exception {
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKey));
PrivateKey generatedPrivate = KeyFactory.getInstance("RSA").generatePrivate(keySpec);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, generatedPrivate);
byte[] b = Base64.getDecoder().decode(cryptedString);
return new String(cipher.doFinal(b));
}
}
package cn.quantgroup.xyqb.remote.config;
import com.google.gson.Gson;
import org.springframework.beans.factory.annotation.Autowired;
public class JIGuangConfiguration {
@Autowired
private Gson gson;
}
package cn.quantgroup.xyqb.remote.config;
import cn.quantgroup.xyqb.remote.codec.JiGuangDecoder;
import com.google.gson.Gson;
import feign.auth.BasicAuthRequestInterceptor;
import feign.codec.Decoder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
public class JiGuangConfiguration {
@Bean
public Decoder feignDecoder(Gson gson,@Value("${user.auth.manager.Urora.properties.privateKey}") String privateKey) {
return new JiGuangDecoder(gson,privateKey);
}
@Bean
public BasicAuthRequestInterceptor basicAuthRequestInterceptor(
@Value("${user.auth.manager.Urora.properties.appKey}") String user, @Value("${user.auth.manager.Urora.properties.masterSecret}") String password
) {
return new BasicAuthRequestInterceptor(user, password);
}
}
package cn.quantgroup.xyqb.service.v2;
import cn.quantgroup.xyqb.constant.enums.LoginType;
import cn.quantgroup.xyqb.controller.req.v2.LoginReq;
import cn.quantgroup.xyqb.model.LoginBean;
import cn.quantgroup.xyqb.entity.User;
import cn.quantgroup.xyqb.exception.BizException;
import cn.quantgroup.xyqb.exception.BizExceptionEnum;
import cn.quantgroup.xyqb.exception.UserNotExistException;
import cn.quantgroup.xyqb.model.*;
import cn.quantgroup.xyqb.model.session.SessionStruct;
import cn.quantgroup.xyqb.model.v2.login.BaseLoginParam;
import cn.quantgroup.xyqb.model.v2.login.SMSDirectLoginParam;
import cn.quantgroup.xyqb.remote.JiGuangRemoteService;
import cn.quantgroup.xyqb.service.register.IUserRegisterService;
import cn.quantgroup.xyqb.service.session.ISessionService;
import cn.quantgroup.xyqb.service.user.ILockIpv4Service;
import cn.quantgroup.xyqb.service.user.IUserService;
import cn.quantgroup.xyqb.session.XyqbSessionContextHolder;
import com.sensorsdata.analytics.javasdk.ISensorsAnalytics;
import com.sensorsdata.analytics.javasdk.bean.EventRecord;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.UUID;
/**
* 极光一键登录
*/
@Service
public class SMSDirectJiLoginStrategy implements LoginStrategy{
@Slf4j
public class SMSDirectJiLoginStrategy implements LoginStrategy {
private final ILockIpv4Service lockIpv4Service;
private final IUserService userService;
private final ISessionService sessionService;
@Value("${sc.is.open:false}")
private Boolean scIsOpen;
private final ISensorsAnalytics iSensorsAnalytics;
private final JiGuangRemoteService jiGuangRemoteService;
private final IUserRegisterService userRegisterService;
public SMSDirectJiLoginStrategy(ILockIpv4Service lockIpv4Service, IUserService userService, ISessionService sessionService, ISensorsAnalytics iSensorsAnalytics, JiGuangRemoteService jiGuangRemoteService, IUserRegisterService userRegisterService) {
this.lockIpv4Service = lockIpv4Service;
this.userService = userService;
this.sessionService = sessionService;
this.iSensorsAnalytics = iSensorsAnalytics;
this.jiGuangRemoteService = jiGuangRemoteService;
this.userRegisterService = userRegisterService;
}
@Override
public Integer getType() {
return 1201;
......@@ -17,11 +59,94 @@ public class SMSDirectJiLoginStrategy implements LoginStrategy{
@Override
public LoginBean login(BaseLoginParam param) {
return null;
SMSDirectLoginParam smsLoginParam = (SMSDirectLoginParam) param;
SessionStruct sessionStruct = XyqbSessionContextHolder.getXSession();
JiGuangRequestParam jiGuangRequestParam = new JiGuangRequestParam();
JiGuangResponseParam jiGuangResponseParam;
jiGuangRequestParam.setLoginToken(smsLoginParam.getToken());
jiGuangRequestParam.setExID(UUID.randomUUID().toString());
// 执行极验验证码检查
if (ClientType.APP.equals(ClientType.valueByCode(smsLoginParam.getClientType()))) {
jiGuangResponseParam = jiGuangRemoteService.webLoginTokenVerify(jiGuangRequestParam);
} else {
jiGuangResponseParam = jiGuangRemoteService.h5LoginTokenVerify(jiGuangRequestParam);
}
if (jiGuangResponseParam == null || 8000 != jiGuangResponseParam.getCode()) {
throw new BizException(BizExceptionEnum.ERROR_DIRECT_LOGIN);
}else{
smsLoginParam.setPhone(jiGuangResponseParam.getPhone());
}
User user = userService.findByPhoneWithCache(smsLoginParam.getPhone(), sessionStruct.getTenantId());
//需要返回用户是否首次注册
boolean register = user == null;
if (user != null && !user.getEnable()) {
log.info("用户不存在,或者已经注销,phoneNo:{}", smsLoginParam.getPhone());
throw new BizException(BizExceptionEnum.ERROR_OR_ENABLE_ERROR);
} else {
// Service层会负责发送注册消息到LoanVest
user = userRegisterService.register(sessionStruct.getRegisteredFrom(), smsLoginParam.getPhone(), sessionStruct.getTenantId());
if (user == null) {
throw new UserNotExistException("用户未找到");
}
}
if (scIsOpen) {
try {
if (!StringUtils.isEmpty(sessionStruct.getScDeviceId())) {
iSensorsAnalytics.trackSignUp(user.getUuid(), sessionStruct.getScDeviceId());
}
if (!StringUtils.isEmpty(sessionStruct.getTerminal()) && "APP".equals(sessionStruct.getTerminal()) || sessionStruct.getRegisteredFrom() != null && (214 == sessionStruct.getRegisteredFrom() || 217 == sessionStruct.getRegisteredFrom())) {
EventRecord userRecord = EventRecord.builder().setDistinctId(user.getUuid()).isLoginId(Boolean.TRUE)
.setEventName("App_RegisterEvent")
.build();
iSensorsAnalytics.track(userRecord);
iSensorsAnalytics.flush();
} else {
log.info("老神策埋点{},{}------------", user.getRegisteredFrom(), user.getUuid());
EventRecord userRecord = EventRecord.builder().setDistinctId(user.getUuid()).isLoginId(Boolean.TRUE)
.setEventName("PD_WUXIEC_UserLoginVccorCash")
.addProperty("son_channel_id", user.getRegisteredFrom())
.addProperty("parent_channel_id", -1L)
.addProperty("vcccash_uuid", user.getUuid())
.build();
iSensorsAnalytics.track(userRecord);
iSensorsAnalytics.flush();
}
} catch (Exception e) {
log.info("神策埋点出现问题", e);
}
}
LoginProperties loginProperties = new LoginProperties(1, sessionStruct.getRegisteredFrom(), sessionStruct.getTenantId());
AuthBean authBean = sessionService.createSession(user, loginProperties, LoginType.ACCOUNTPASSWORD.ordinal(), sessionStruct.getTenantId());
LoginBean loginBean = new LoginBean();
if (authBean != null) {
loginBean.setToken(authBean.getToken());
loginBean.setPhoneNo(authBean.getPhoneNo());
loginBean.setUuid(authBean.getUuid());
loginBean.setHasPassword(authBean.isHasPassword());
loginBean.setUserId(user.getId());
loginBean.setTenantId(user.getTenantId());
}
loginBean.setRegister(register);
lockIpv4Service.unLockPhone(smsLoginParam.getPhone());
return loginBean;
}
@Override
public BaseLoginParam checkParam(LoginReq loginReq) {
return null;
SMSDirectLoginParam param = loginReq.getData().toJavaObject(SMSDirectLoginParam.class);
param.setClientType(loginReq.getClientType());
validator.validate(param);
return param;
}
}
......@@ -134,7 +134,8 @@ public class SMSLoginStrategy implements LoginStrategy {
@Override
public BaseLoginParam checkParam(LoginReq loginReq) {
PhonePasswordLoginParam param = loginReq.getData().toJavaObject(PhonePasswordLoginParam.class);
SMSLoginParam param = loginReq.getData().toJavaObject(SMSLoginParam.class);
param.setClientType(loginReq.getClientType());
validator.validate(param);
return param;
}
......
......@@ -27,7 +27,7 @@ public class UserTagCleanJobHandler {
@Autowired
private IUserTagRepository userTagRepository;
@XxlJob(value = "WechatFollowStatusJobHandler")
@XxlJob(value = "userTagCleanJobHandler")
public ReturnT<String> execute(String param) throws Exception {
Pageable pageable = new PageRequest(0, 500);
Page<User> userPage = userRepository.findAll(pageable);
......
......@@ -11,7 +11,7 @@ public class WechatFollowStatusJobHandler {
@Autowired
private IWechatFollowService wechatFollowService;
@XxlJob(value = "WechatFollowStatusJobHandler")
@XxlJob(value = "wechatFollowStatusJobHandler")
public void execute() throws Exception {
wechatFollowService.executeTask();
XxlJobHelper.handleSuccess();
......
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