Air
2024-11-04 cb3b3801255082c53145bd752230339eae5d3e5a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
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("&timestamp=");
        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;
        }
    }
}