Forráskód Böngészése

feat: ip风控自定义提示语;封禁记录增加关联风控编码;

hidewnd 3 hete
szülő
commit
8fe529dc3d

+ 2 - 0
yt-common/src/main/java/com/ytpm/agent/model/YtPlatformBanned.java

@@ -23,4 +23,6 @@ public class YtPlatformBanned {
     private Integer bannedLimit;
     private String operator;
     private String operatorName;
+    private String riskCode;
+
 }

+ 1 - 0
yt-common/src/main/java/com/ytpm/general/RepMessage.java

@@ -51,4 +51,5 @@ public class RepMessage {
 
     // 动态配置提示语
     public static final String RISK_VISITOR_LOWER_VALUE = "visitor_lower_value";
+    public static final String RISK_IP_LIMIT_VALUE = "ip_limit_value";
 }

+ 1 - 0
yt-common/src/main/java/com/ytpm/risk/param/RiskBannedParam.java

@@ -39,4 +39,5 @@ public class RiskBannedParam {
 
     @ApiModelProperty("封禁IP,|间隔")
     private String bannedIps;
+    private String riskCode;
 }

+ 45 - 34
yt-ios-lemon/lemon-ios-service/src/main/java/com/ytpm/lemonios/controller/WxController.java

@@ -2,6 +2,7 @@ package com.ytpm.lemonios.controller;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.RandomUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.http.HttpUtil;
 import com.alibaba.fastjson.JSON;
@@ -10,7 +11,6 @@ import com.ytpm.agent.enums.AdRecordEnum;
 import com.ytpm.agent.enums.UserStatusEnum;
 import com.ytpm.agent.model.YtDitch;
 import com.ytpm.annotation.ApiEncrypt;
-import com.ytpm.annotation.Internal;
 import com.ytpm.app.enums.LoginType;
 import com.ytpm.app.model.YtAppDefaultConfig;
 import com.ytpm.app.model.YtDyzAdRecord;
@@ -54,7 +54,6 @@ import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Comparator;
 import java.util.List;
 import java.util.Objects;
 import java.util.concurrent.TimeUnit;
@@ -86,6 +85,9 @@ public class WxController {
     @Value("${yt.ios.appid:}")
     private String appId;
 
+    @Value(" ${risk.config.iplimit.tips:}")
+    private String ipLimitTips;
+
     @Value("${spring.application.name-zh:}")
     private String applicationNameZh;
 
@@ -99,8 +101,8 @@ public class WxController {
     public Result<YtDyzUser> wxLogin(@RequestBody WxLoginParam param, HttpServletRequest request) {
         //根据应用获取配置调用微信接口登录
         WxDefaultConfig defaultConfig = appUserMapper.getDefaultConfig(param.getAppType());
-        if(Objects.isNull(defaultConfig)){
-            return new Result<>(StatusCode.ACCESS_ERR,"微信登录失败,未找到相应配置!");
+        if (Objects.isNull(defaultConfig)) {
+            return new Result<>(StatusCode.ACCESS_ERR, "微信登录失败,未找到相应配置!");
         }
         param.setAppId(defaultConfig.getPlatformAppId());
         WxLoginResult loginResult = getWechatLoginInfo(param.getWxCode(), param.getAppType(),
@@ -108,17 +110,17 @@ public class WxController {
         if (Objects.isNull(loginResult) || StrUtil.isBlank(loginResult.getOpenid())) {
             return new Result<>(StatusCode.ACCESS_ERR, "微信登录失败,请刷新授权码!");
         }
-        WxUserInfo wxUserInfo = getWechatUserInfo(loginResult.getAccess_token(),loginResult.getOpenid());
-        if(Objects.isNull(wxUserInfo)) {
-            return new Result<>(StatusCode.ACCESS_ERR,"微信用户登录失败");
+        WxUserInfo wxUserInfo = getWechatUserInfo(loginResult.getAccess_token(), loginResult.getOpenid());
+        if (Objects.isNull(wxUserInfo)) {
+            return new Result<>(StatusCode.ACCESS_ERR, "微信用户登录失败");
         }
         param.setLoginIp(getClientIp(request));
-        YtDyzUser old = appUserService.crudForNewTrans(param,wxUserInfo,loginResult);
+        YtDyzUser old = appUserService.crudForNewTrans(param, wxUserInfo, loginResult);
         //调用风控服务校验默认风控配置
         old.setRiskCode("313");
         Result<?> result = riskFeign.checkRisk(old);
-        if(result.getCode()!=200){
-            return new Result<>(StatusCode.ACCESS_ERR,result.getMessage());
+        if (result.getCode() != 200) {
+            return new Result<>(StatusCode.ACCESS_ERR, result.getMessage());
         }
         return Result.resultOk(RepMessage.LOGIN_SUCCESS, old);
     }
@@ -133,7 +135,7 @@ public class WxController {
         userInfoUrl = StrUtil.format(userInfoUrl, accessToken, openid);
         String curUser = HttpUtil.get(userInfoUrl);
         WxUserInfo wxUserInfo = JSON.parseObject(curUser, WxUserInfo.class);
-        log.error("获取的用户信息:{}",wxUserInfo);
+        log.error("获取的用户信息:{}", wxUserInfo);
         return wxUserInfo;
     }
 
@@ -154,7 +156,7 @@ public class WxController {
 
     @ApiOperation("获取IOS登陆幂等Token")
     @GetMapping("/get/requestId")
-    public Result<String> getRequestId(@RequestParam("ditchId") String ditchId, @RequestParam("iosId") String iosId){
+    public Result<String> getRequestId(@RequestParam("ditchId") String ditchId, @RequestParam("iosId") String iosId) {
         String redisKey = StrUtil.format("visitor:requestId:{}:{}", ditchId, iosId);
         String requestId = "";
         if (redisService.hasKey(redisKey)) {
@@ -208,13 +210,13 @@ public class WxController {
         return Result.resultOk();
     }
 
-    private IosUserInfo setIosUserInfo(IosLoginParam param){
+    private IosUserInfo setIosUserInfo(IosLoginParam param) {
         IosUserInfo userInfo = new IosUserInfo();
-        userInfo.setOpenid(param.getIosId() ==  null ? "" : param.getIosId());
-        userInfo.setHeadimgurl(param.getIconUrl()  ==  null ? "" : param.getIconUrl());
-        if (StrUtil.isEmpty(param.getAlias())){
+        userInfo.setOpenid(param.getIosId() == null ? "" : param.getIosId());
+        userInfo.setHeadimgurl(param.getIconUrl() == null ? "" : param.getIconUrl());
+        if (StrUtil.isEmpty(param.getAlias())) {
             YtDyzUser user;
-            if (param.getDitchId() == null){
+            if (param.getDitchId() == null) {
                 user = appUserMapper.selectByIosId(param.getIosId());
             } else {
                 user = appUserMapper.getYtAppUserForIos(param.getIosId(), param.getDitchId());
@@ -314,9 +316,15 @@ public class WxController {
         Result<?> result = riskFeign.checkRisk(dyzUser);
         if (result.getCode() != 200) {
             String errorMessage = result.getMessage();
+            // 自定义低价值风控提示语
             if (RepMessage.RISK_VISITOR_LOWER_VALUE.equals(errorMessage)) {
                 errorMessage = StrUtil.emptyToDefault(defaultConfig.getLowValueTip(), errorMessage);
             }
+            // 自定义IP风控提示语
+            if (RepMessage.RISK_IP_LIMIT_VALUE.equals(errorMessage) && StrUtil.isNotEmpty(ipLimitTips)) {
+                String[] split = ipLimitTips.split(",");
+                errorMessage = split[RandomUtil.randomInt(split.length)];
+            }
             return new Result<>(StatusCode.ACCESS_ERR, errorMessage);
         }
         if (dyzUser.getLastLoginTime() != null && dyzUser.getRegistryTime() != null) {
@@ -360,7 +368,7 @@ public class WxController {
     @PostMapping("/getByDitchId")
     @ApiOperation("获取默认配置")
     @Transactional
-    public Result<WxDefaultConfig> getByDitchId(@RequestBody IosLoginParam param){
+    public Result<WxDefaultConfig> getByDitchId(@RequestBody IosLoginParam param) {
         WxDefaultConfig defaultConfig = appUserMapper.getDefaultConfigByDitchId(param.getDitchId());
         return Result.resultOk(RepMessage.QUERY_SUCCESS, defaultConfig);
     }
@@ -368,7 +376,7 @@ public class WxController {
     @PostMapping("/getLastOne")
     @ApiOperation("获取最近一条默认配置")
     @Transactional
-    public Result<?> getLastOne(@RequestBody YtDitch param){
+    public Result<?> getLastOne(@RequestBody YtDitch param) {
         return appUserService.addDefaultConfig(param);
     }
 
@@ -377,7 +385,8 @@ public class WxController {
         if (xfHeader == null) {
             return request.getRemoteAddr();
         }
-        return xfHeader.split(",")[0]; // 可能会有多个IP,这里取第一个逗号前的IP
+        // 可能会有多个IP,这里取第一个逗号前的IP
+        return xfHeader.split(",")[0];
     }
 
 
@@ -387,7 +396,7 @@ public class WxController {
     @GetMapping("/defaultConfig")
     public Result<WxDefaultConfig> getWxDefaultConfig(int appType) {
         WxDefaultConfig config = appUserMapper.getDefaultConfig(appType);
-        if(Objects.isNull(config)){
+        if (Objects.isNull(config)) {
             return Result.resultErr("应用类型有误!");
         }
         return Result.resultObjOk(config);
@@ -415,7 +424,7 @@ public class WxController {
 
     @ApiOperation("保存应用默认配置")
     @PostMapping("/saveAppConfig")
-    public Result<String> saveAppConfig(@RequestBody YtAppDefaultConfig defaultConfig){
+    public Result<String> saveAppConfig(@RequestBody YtAppDefaultConfig defaultConfig) {
         appUserMapper.saveAppConfig(defaultConfig);
         return Result.resultOk(RepMessage.SAVE_SUCCESS);
     }
@@ -423,7 +432,7 @@ public class WxController {
 
     @ApiOperation("修改应用默认配置")
     @PostMapping("/updateAppConfig")
-    public Result<String> updateAppConfig(@RequestBody YtAppDefaultConfig defaultConfig){
+    public Result<String> updateAppConfig(@RequestBody YtAppDefaultConfig defaultConfig) {
         appUserMapper.updateAppConfig(defaultConfig);
         return Result.resultOk(RepMessage.SAVE_SUCCESS);
     }
@@ -431,7 +440,7 @@ public class WxController {
 
     @ApiOperation("修改应用默认配置")
     @PostMapping("/updateAppsConfig")
-    public void updateAppsConfig(@RequestBody AppConfigUpdateParam param){
+    public void updateAppsConfig(@RequestBody AppConfigUpdateParam param) {
         if (CollUtil.isNotEmpty(param.getApps()) && param.getDefaultConfig() != null) {
             String appIds = String.join(",", param.getApps());
             List<WxDefaultConfig> configs = appUserMapper.getConfigByIds(appIds);
@@ -439,22 +448,22 @@ public class WxController {
             for (WxDefaultConfig config : configs) {
                 YtAppDefaultConfig appConfig = new YtAppDefaultConfig();
                 BeanUtils.copyProperties(config, appConfig);
-                if(StrUtil.isNotEmpty(updateInfo.getTakuAppId())) {
+                if (StrUtil.isNotEmpty(updateInfo.getTakuAppId())) {
                     appConfig.setTakuAppId(updateInfo.getTakuAppId());
                 }
-                if(StrUtil.isNotEmpty(updateInfo.getTakuKey())) {
+                if (StrUtil.isNotEmpty(updateInfo.getTakuKey())) {
                     appConfig.setTakuKey(updateInfo.getTakuKey());
                 }
-                if(StrUtil.isNotEmpty(updateInfo.getTakuBannerPid())) {
+                if (StrUtil.isNotEmpty(updateInfo.getTakuBannerPid())) {
                     appConfig.setTakuBannerPid(updateInfo.getTakuBannerPid());
                 }
-                if(StrUtil.isNotEmpty(updateInfo.getTakuNativePid())) {
+                if (StrUtil.isNotEmpty(updateInfo.getTakuNativePid())) {
                     appConfig.setTakuNativePid(updateInfo.getTakuNativePid());
                 }
-                if(StrUtil.isNotEmpty(updateInfo.getTakuRewardPid())) {
+                if (StrUtil.isNotEmpty(updateInfo.getTakuRewardPid())) {
                     appConfig.setTakuRewardPid(updateInfo.getTakuRewardPid());
                 }
-                if(StrUtil.isNotEmpty(updateInfo.getTakuInterstitialPid())) {
+                if (StrUtil.isNotEmpty(updateInfo.getTakuInterstitialPid())) {
                     appConfig.setTakuInterstitialPid(updateInfo.getTakuInterstitialPid());
                 }
                 appUserMapper.updateAppConfig(appConfig);
@@ -465,19 +474,21 @@ public class WxController {
 
     @ApiOperation("根据APP_ID获取配置")
     @GetMapping("/getConfigs")
-    public List<WxDefaultConfig> getConfigs(@RequestParam(name = "appIds")String appIds){
+    public List<WxDefaultConfig> getConfigs(@RequestParam(name = "appIds") String appIds) {
         List<WxDefaultConfig> configs = new ArrayList<>();
         List<WxDefaultConfig> dyzConfigs = appUserMapper.getConfigByIds(appIds);
-        if(CollUtil.isNotEmpty(dyzConfigs)){configs.addAll(dyzConfigs);}
+        if (CollUtil.isNotEmpty(dyzConfigs)) {
+            configs.addAll(dyzConfigs);
+        }
         return configs;
     }
 
 
     @ApiOperation("删除默认配置")
     @GetMapping("/delDefaultConfig")
-    public void delDefaultConfig(@RequestParam(name = "appId")String appId){
+    public void delDefaultConfig(@RequestParam(name = "appId") String appId) {
         List<WxDefaultConfig> dyzConfig = appUserMapper.getConfigByIds(appId);
-        if(CollUtil.isNotEmpty(dyzConfig)){
+        if (CollUtil.isNotEmpty(dyzConfig)) {
             appUserMapper.delByAppId(appId);
             // 同步删除渠道记录
             ditchMapper.deleteByAppId(appId);

+ 2 - 2
yt-ios-lemon/lemon-ios-service/src/main/resources/bootstrap.yml

@@ -7,7 +7,7 @@ spring:
     name: typingios-service
     name-zh: '打字训练营'
   profiles:
-    active: dev
+    active: local
 yt:
   port: 8848
   file-extension: yml
@@ -26,7 +26,7 @@ yt:
 
 api-decrypt:
   # 是否开启全局接口加密
-  enabled: true
+  enabled: false
   # AES 加密头标识
   headerFlag: encrypt-key
   # 响应加密公钥 非对称算法的公私钥 如:SM2,RSA 使用者请自行更换

+ 10 - 9
yt-ios-lemon/lemon-ios-service/src/test/java/com/ytpm/test/RsaTest.java

@@ -13,9 +13,6 @@ import org.junit.Test;
 
 public class RsaTest {
 
-    private static String privateKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBANyqac4YGjXSH+7cNTkYj1k4HRPab1DP6UBRxPPNgMonEIj6tFoC9At5HvdsI6Ff+U22bZNcYqZOHaqX6DvoMJb7W3QiyqUOiTesl5CCqpm2zFr1F+6bnawXNgYsGahP5bVuh8uOTWOiavofId1Xiq4xl8Ca/Ikg09fJb5t2EROxAgMBAAECgYAvIi1YariKf3f3rsylhfP0lDJNz84QHmDNrsmZY+9a/q4e/CHyygezvaraIZyYtyXKrilInSarLCtVCX5+8VETQUp5v2znDEvyLSiUWMp5hgbR4U/SGjti3rDnrxn+VUr2uieq0o6vVHULcCuEaiUOlIvUIDLONxQWVCvyy0CyWQJBAPPsWV90DuzRHJf8nYfCNby9SLaAXdDxe/5XhSf7JSA29v84n9rPHuUNxW1VnEO0m1uTj0j+BX2k7Qedo0xDv3UCQQDnl0gnpLPmgPgMbQ5eRvDygkkKhfvKukkrCsWFh1atj3QMKiEiyrjh0qa0gViqZi97VFgpriaOJ/N8F+buwFfNAkBeRb1w79kI2/TyJNb5biz4qitdJZWcuIgUj9zNy/nYToX9s/PMTHqDSmRAUnMXk8jrhsc9DbgvjDtz0xAW3KQ1AkEAvfIehCVaSBxPViG8PycASGcDcVYjBktz55GWH8a5GPEnxTJoqxiKOu2DPVk5V8kn+IddKBJmHQI3efhAuGGZoQJAIsHVfDgnhEt/APq5p0x4VMSg5nCD0LupDDJ4vA8Ort965T2o2KbHUlXBSd/U0iutSahqyrNhkORYSsyby7OyTg==";
-    private static String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcqmnOGBo10h/u3DU5GI9ZOB0T2m9Qz+lAUcTzzYDKJxCI+rRaAvQLeR73bCOhX/lNtm2TXGKmTh2ql+g76DCW+1t0IsqlDok3rJeQgqqZtsxa9Rfum52sFzYGLBmoT+W1bofLjk1jomr6HyHdV4quMZfAmvyJINPXyW+bdhETsQIDAQAB";
-
 
     @Test
     public void generatorRsaKey() {
@@ -28,31 +25,37 @@ public class RsaTest {
         System.out.println(rsa.getPublicKeyBase64());
     }
 
+//    private static String privateKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBANyqac4YGjXSH+7cNTkYj1k4HRPab1DP6UBRxPPNgMonEIj6tFoC9At5HvdsI6Ff+U22bZNcYqZOHaqX6DvoMJb7W3QiyqUOiTesl5CCqpm2zFr1F+6bnawXNgYsGahP5bVuh8uOTWOiavofId1Xiq4xl8Ca/Ikg09fJb5t2EROxAgMBAAECgYAvIi1YariKf3f3rsylhfP0lDJNz84QHmDNrsmZY+9a/q4e/CHyygezvaraIZyYtyXKrilInSarLCtVCX5+8VETQUp5v2znDEvyLSiUWMp5hgbR4U/SGjti3rDnrxn+VUr2uieq0o6vVHULcCuEaiUOlIvUIDLONxQWVCvyy0CyWQJBAPPsWV90DuzRHJf8nYfCNby9SLaAXdDxe/5XhSf7JSA29v84n9rPHuUNxW1VnEO0m1uTj0j+BX2k7Qedo0xDv3UCQQDnl0gnpLPmgPgMbQ5eRvDygkkKhfvKukkrCsWFh1atj3QMKiEiyrjh0qa0gViqZi97VFgpriaOJ/N8F+buwFfNAkBeRb1w79kI2/TyJNb5biz4qitdJZWcuIgUj9zNy/nYToX9s/PMTHqDSmRAUnMXk8jrhsc9DbgvjDtz0xAW3KQ1AkEAvfIehCVaSBxPViG8PycASGcDcVYjBktz55GWH8a5GPEnxTJoqxiKOu2DPVk5V8kn+IddKBJmHQI3efhAuGGZoQJAIsHVfDgnhEt/APq5p0x4VMSg5nCD0LupDDJ4vA8Ort965T2o2KbHUlXBSd/U0iutSahqyrNhkORYSsyby7OyTg==";
+//    private static String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcqmnOGBo10h/u3DU5GI9ZOB0T2m9Qz+lAUcTzzYDKJxCI+rRaAvQLeR73bCOhX/lNtm2TXGKmTh2ql+g76DCW+1t0IsqlDok3rJeQgqqZtsxa9Rfum52sFzYGLBmoT+W1bofLjk1jomr6HyHdV4quMZfAmvyJINPXyW+bdhETsQIDAQAB";
 
+    private static String privateKey = "";
+    private static String publicKey = "";
     @Test
     public void decoryTest() {
-        // 返回解密逻辑
+        // 返回内容 解密逻辑
+        // responseKey 从response header中获取"encrypt-key"
         String responseKey = "yRm7gaEyol6Az1zuA0JVbF7dUjTzgTgZnrryKnPoY8HdySf5OiXIRTmI5hclu+d/wSzNzBsA0lk/jaPlfFDHDFjtqQdMarIIbNmhmSo/M30rGCTbhk/Mv5bJkkIFH+8W6j+rYnqSt0qFElDt/jOQ1hHrzKY7U0D8vLHYkhxY06c=";
         String responseBody = "4yCh2rn2yG0dIKtuOGI9TWvRPl7XpoATwc3sAIJ7uj1o343V7qiN6mzObFHNNMjl";
         // rsa解码获取aes密钥
         String decryptByRsa = EncryptUtils.decryptByRsa(responseKey, privateKey);
         // base64解码获取真实ase密钥
         String aesPassword = EncryptUtils.decryptByBase64(decryptByRsa);
-        // ase解码获取返回数据
+        // ase解码获取返回数据 运算模式:ECP  填充模式:pkcs7  初始向量:(IV): null
         String decryptBody = EncryptUtils.decryptByAes(responseBody, aesPassword);
         System.out.println(decryptBody);
     }
 
     @Test
     public void encoryTest() {
-        // 请求加密逻辑
+        // 请求参数 加密逻辑
         // 随机生成32为密钥
         String aesPassword = RandomUtil.randomString(32);
         System.out.println("aesPassword:");
         System.out.println(aesPassword);
         // 对aes密钥进行base64加密
         String base64Str = EncryptUtils.encryptByBase64(aesPassword);
-        // 对base64字符串进行rsa加密
+        // 对base64字符串进行rsa加密获取requestkey
+        // reqeustKey 放入request header "encrypt-key"
         String requestKey = EncryptUtils.encryptByRsa(base64Str, publicKey);
         System.out.println("requestKey:");
         System.out.println(requestKey);
@@ -61,7 +64,5 @@ public class RsaTest {
         String encryptByRsa = EncryptUtils.encryptByAes(requestBody, aesPassword);
         System.out.println("requestBody:");
         System.out.println(encryptByRsa);
-
-
     }
 }

+ 31 - 17
yt-risk/risk-manage/src/main/java/com/ytpm/service/impl/RiskServiceImpl.java

@@ -64,7 +64,6 @@ import com.ytpm.util.IPUtil;
 import com.ytpm.util.RedisService;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.cloud.context.config.annotation.RefreshScope;
 import org.springframework.stereotype.Service;
@@ -98,12 +97,8 @@ import java.util.stream.Collectors;
 @RefreshScope
 public class RiskServiceImpl implements RiskService {
 
-    @Autowired
+    @Resource
     private FeignClientInvoker feignInvoker;
-    @Value("${risk.banned.defaultLimit}")
-    private Integer defaultLimit;
-    @Value("${risk.banned.defaultReason}")
-    private String defaultReason;
     @Resource
     private DictMapper  dictMapper;
     @Resource
@@ -112,19 +107,25 @@ public class RiskServiceImpl implements RiskService {
     private RiskUserMapper riskUserMapper;
     @Resource
     private RiskManageMapper riskManageMapper;
-    @Value("${risk.banned.tips}")
-    private String tips;
-    @Value("${risk.banned.ios-ditch-tip:}")
-    private String iosDithTip;
     @Resource
     private RedisService redisService;
     @Resource
     private AppMapper appMapper;
+    @Resource
+    private ScheduledExecutorService scheduledExecutorService;
 
+    @Value("${risk.banned.tips}")
+    private String tips;
+    @Value("${risk.banned.ios-ditch-tip:}")
+    private String iosDithTip;
+    @Value("${risk.banned.ios-ipLimit-tip:}")
+    private String iosIpLimitTip;
+    @Value("${risk.banned.defaultLimit}")
+    private Integer defaultLimit;
+    @Value("${risk.banned.defaultReason}")
+    private String defaultReason;
     @Value("${risk.visitor.validity-period:48}")
     private Integer loginCheckValidityPeriod;
-    @Resource
-    private ScheduledExecutorService scheduledExecutorService;
 
 
     private static Set<String> ipWhiteList = new CopyOnWriteArraySet<>();
@@ -429,6 +430,7 @@ public class RiskServiceImpl implements RiskService {
             cityUserCount = riskYtDyzUserView.getCityUserCount();
         }
         checkRisk322(dyzUser, dyzUsers, sameDeviceCount);
+        // ios端 校验ip风控
         if (ytApp.getAppType() == 2) {
             checkRisk334(dyzUser, userCount);
             checkRisk335(dyzUser, cityUserCount);
@@ -535,11 +537,16 @@ public class RiskServiceImpl implements RiskService {
         if (redisService.hasKey(passkey) && limitCount <= cityUserCount) {
             log.warn(StrUtil.format("[risk 335] superiorId:{} appId:{} userId:{} limitCount:{}",
                     userApp.getAppId(), dyzUser.getAppId(), dyzUser.getUserId(), limitCount));
+            String errorMsg = RepMessage.RISK_IP_LIMIT_VALUE;
+            if (StrUtil.isNotEmpty(iosIpLimitTip)) {
+                String[] split = iosIpLimitTip.split(",");
+                errorMsg = split[RandomUtil.randomInt(split.length)];
+            }
             try {
-                String errorMsg = StrUtil.format("{}小时内{}登陆账号超过限制", limitHour, limitCity);
-                riskLockUser(dyzUser, "335", errorMsg, getTipsMsg(), limitHour);
+                riskLockUser(dyzUser, "335", StrUtil.format("{}小时内{}登陆账号超过限制", limitHour, limitCity),
+                        errorMsg, limitHour);
             } catch (Exception e) {
-                throw new CustomerException("visitor_lower_value");
+                throw new CustomerException(errorMsg);
             }
         }
         passUserSet.add(dyzUser.getUserId());
@@ -577,10 +584,15 @@ public class RiskServiceImpl implements RiskService {
         if (redisService.hasKey(passkey) && limitCount <= userCount) {
             log.warn(StrUtil.format("[risk 334] superiorId:{} appId:{} userId:{} limitCount:{}",
                     userApp.getAppId(), dyzUser.getAppId(), dyzUser.getUserId(), limitCount));
+            String errorMsg = RepMessage.RISK_IP_LIMIT_VALUE;
+            if (StrUtil.isNotEmpty(iosIpLimitTip)) {
+                String[] split = iosIpLimitTip.split(",");
+                errorMsg = split[RandomUtil.randomInt(split.length)];
+            }
             try {
-                riskLockUser(dyzUser, "334", "同IP24小时内登陆多个账号", getTipsMsg());
+                riskLockUser(dyzUser, "334", "同IP24小时内登陆多个账号", errorMsg);
             } catch (Exception e) {
-                throw new CustomerException("visitor_lower_value");
+                throw new CustomerException(errorMsg);
             }
         }
         redisService.setTimeOutHoursStr(passkey, dyzUser.getUserId(), 24);
@@ -949,6 +961,7 @@ public class RiskServiceImpl implements RiskService {
         param.setBannedReason(tempName);
         param.setOperatorName("系统风控");
         param.setAgentId(configMapper.getApplicationOwner(dyzUser.getAppId()));
+        param.setRiskCode(riskCode);
         addBannedRecord(Collections.singletonList(dyzUser.getUserId()), param);
         YtApp app = appMapper.selectRiskApp(dyzUser.getAppId());
         YtPlatformUserApp appInfo = appMapper.selectParentApp(app.getSuperiorId());
@@ -1035,6 +1048,7 @@ public class RiskServiceImpl implements RiskService {
             banned.setBannedTime(new Date());
             banned.setOperator(param.getOperator());
             banned.setOperatorName(param.getOperatorName());
+            banned.setRiskCode(param.getRiskCode());
             riskUserMapper.addBannedRecord(banned);
         }
     }

+ 4 - 2
yt-risk/risk-manage/src/main/resources/mapper/RiskUserMapper.xml

@@ -14,7 +14,8 @@
          banned_type,
          banned_limit,
          operator,
-         operator_name
+         operator_name,
+         risk_code
         )
         values
         (
@@ -28,7 +29,8 @@
             #{bannedType},
             #{bannedLimit},
             #{operator},
-            #{operatorName}
+            #{operatorName},
+            #{riskCode}
         )
     </insert>
     <update id="updateByUserId">