package com.nova.sankuai.service.impl;
|
|
import cn.hutool.core.util.IdUtil;
|
import com.alibaba.fastjson.JSONObject;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.nova.sankuai.domain.api.jiniu.*;
|
import com.nova.sankuai.domain.entity.CustomerUser;
|
import com.nova.sankuai.infra.utils.RsaSecretUtils;
|
import com.nova.sankuai.service.ICustomerUserService;
|
import com.nova.sankuai.service.IJnService;
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.commons.lang3.StringUtils;
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.stereotype.Service;
|
|
import javax.annotation.Resource;
|
import java.net.URLEncoder;
|
import java.util.Objects;
|
|
/**
|
* <p>
|
* description
|
* </p>
|
*
|
* @author denglb 2022/7/13
|
*/
|
@Service
|
@Slf4j
|
public class JnServiceImpl implements IJnService {
|
|
@Resource
|
private ICustomerUserService customerUserService;
|
@Resource
|
private RsaSecretUtils rsaSecretUtils;
|
|
private static final Logger autoLogger = LoggerFactory.getLogger("autoLogger");
|
|
@Value("${loginrsa.key-pair.public}")
|
private String publicKeyBase64;
|
|
@Override
|
public JnResponse checkUserPhone(String userPhone) {
|
autoLogger.info("极牛对接撞库,接收到的userPhone:{}", userPhone);
|
if (StringUtils.isBlank(userPhone)) {
|
return JnResponse.fail("userPhone is null");
|
}
|
try {
|
int count = customerUserService.count(new LambdaQueryWrapper<CustomerUser>()
|
.eq(CustomerUser::getPhoneMd5, userPhone));
|
if (count <= 0) {
|
autoLogger.info("极牛对接撞库,撞库结果成功,接收到的userPhone:{}", userPhone);
|
return JnResponse.success();
|
} else {
|
autoLogger.info("极牛对接撞库,撞库结果失败,接收到的userPhone:{}", userPhone);
|
return JnResponse.success("0001", "userPhone already exists");
|
}
|
} catch (Exception e) {
|
autoLogger.info("极牛对接撞库,撞库结果异常,接收到的userPhone:{}", userPhone);
|
return JnResponse.fail(e.getMessage());
|
}
|
}
|
|
@Override
|
public JnRegisterResponse register(JnRequest request, String secretKey, String url, String appId, String type) {
|
// 处理签名
|
if (StringUtils.isBlank(request.getSign())) {
|
autoLogger.info("极牛对接:签名为null");
|
return JnRegisterResponse.fail("1002", "sign is null");
|
}
|
StringBuffer signData = new StringBuffer();
|
signData.append("version=" + request.getVersion() + "&reqData=");
|
signData.append(request.getReqData());
|
signData.append("×tamp=");
|
signData.append(request.getTimestamp());
|
String flag = EncryptUtil.md5(signData.toString());
|
autoLogger.info("极牛对接接收到的Request参数:{}", signData.toString());
|
if (!request.getSign().equals(flag)) {
|
autoLogger.info("极牛对接,签名验证异常:接收到的签名:{}, 参数生成的签名:{}", request.getSign(), flag);
|
return JnRegisterResponse.fail("1002", "sign is wrong");
|
}
|
|
// 处理用户电话
|
String phone = null;
|
try {
|
String reqData = ParamAESCodec.base64StrDecode(secretKey, request.getReqData());
|
// String reqData = AseUtil.decrypt(secretKey, request.getReqData());
|
autoLogger.info("极牛对接,解密reqData数据结果:{}", reqData);
|
if (StringUtils.isBlank(reqData)) {
|
return JnRegisterResponse.fail("1001", "reqData decrypt failed");
|
}
|
JSONObject jsonObject = JSONObject.parseObject(reqData);
|
phone = jsonObject.getString("userPhone");
|
autoLogger.info("极牛对接,解密reqData后,获取到userPhone:{}", phone);
|
} catch (Exception e) {
|
autoLogger.info("极牛对接,解密reqData异常:{},堆栈信息:{}", e.getMessage(), e);
|
return JnRegisterResponse.fail("1001", "reqData decrypt failed");
|
}
|
if (StringUtils.isBlank(phone)) {
|
return JnRegisterResponse.fail("1001", "userPhone is empty");
|
}
|
try {
|
// 判断用户是否存在
|
int count = customerUserService.count(new LambdaQueryWrapper<CustomerUser>()
|
.eq(CustomerUser::getPhone, phone));
|
if (count > 0) {
|
return JnRegisterResponse.fail("1000", "userPhone already exists", "2");
|
}
|
String logNumber = IdUtil.randomUUID();
|
autoLogger.info("日志编号" + logNumber + "极牛联登开始注册新用户,用户手机号:" + phone + "渠道AppId:" + appId);
|
CustomerUser customerUser = customerUserService.registerInitCustomerUser(phone, appId, null, null);
|
autoLogger.info("日志编号" + logNumber + "极牛联登注册新用户成功,用户Id" + customerUser.getId() + ",用户手机号" + customerUser.getPhone());
|
String autodownload = buildAutodownload(customerUser, appId);
|
if (autodownload == null) {
|
JnRegisterResponse.fail("1004", "build autodownload failed");
|
}
|
String returnUrl = "";
|
if (Objects.equals(type, "kdn")) {
|
returnUrl = url + "?appId=" + appId + "&autologin=" + autodownload;
|
//returnUrl = "https://kadana.dldcredit.com/?appId=63836764-f32a-434c-9bb0-028e561a2345";
|
} else {
|
returnUrl = url + "?appId=" + appId + "&autodownload=" + autodownload;
|
}
|
autoLogger.info("日志编号" + logNumber + "极牛联登注册新用户完毕,返回下载地址:{}", returnUrl);
|
return JnRegisterResponse.success(returnUrl);
|
} catch (Exception e) {
|
autoLogger.info("极牛联登注册新用户异常:{}", e);
|
return JnRegisterResponse.fail("1000", e.getMessage());
|
}
|
}
|
|
private String buildAutodownload(CustomerUser customerUser, String appId) {
|
try {
|
JSONObject jsonObject = new JSONObject();
|
jsonObject.put("appId", appId);
|
jsonObject.put("phone", customerUser.getPhone());
|
byte[] bytes = RsaSecretUtils.publicEncrypt(jsonObject.toJSONString().getBytes(), publicKeyBase64);
|
String base64 = RsaSecretUtils.byte2Base64(bytes);
|
return URLEncoder.encode(base64, "UTF-8");
|
// return URLDecoder.decode(base64, "UTF-8");
|
// return base64;
|
} catch (Exception e) {
|
e.printStackTrace();
|
return null;
|
}
|
}
|
}
|