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;
/**
*
* description
*
*
* @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()
.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()
.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;
}
}
}