临时提交

This commit is contained in:
墨大叔 2024-09-20 17:41:31 +08:00
parent 5441c04743
commit 435907a5a5
10 changed files with 80 additions and 8 deletions

View File

@ -55,4 +55,9 @@ public class CacheConstants
* 舆情分析
*/
public static final String BRIEF = DASHBOARD_PREFIX + "brief";
/**
* 活体检测Token
*/
public static final String LIVENESS_TOKEN = "liveness:";
}

View File

@ -1,6 +1,7 @@
package com.ruoyi.common.valid.liveness;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.TypeReference;
import com.ruoyi.common.utils.ServiceUtil;
import com.ruoyi.common.utils.http.AliHttpUtils;
import com.ruoyi.common.utils.spring.SpringUtils;
@ -21,6 +22,7 @@ public class LivenessUtils {
public static final String APP_KEY = SpringUtils.getRequiredProperty("liveness.appKey");
public static final String APP_CODE = SpringUtils.getRequiredProperty("liveness.appCode");
public static final String APP_SECRET = SpringUtils.getRequiredProperty("liveness.appSecret");
public static final String JUMP_URL = SpringUtils.getRequiredProperty("liveness.jumpUrl");
/**
@ -43,7 +45,10 @@ public class LivenessUtils {
try {
HttpResponse res = AliHttpUtils.doGet(host, path, method, headers, querys);
LivenessResponseBody<LivenessResponseTokenData> body = JSON.parseObject(EntityUtils.toString(res.getEntity()), LivenessResponseBody.class);
TypeReference<LivenessResponseBody<LivenessResponseTokenData>> typeRef
= new TypeReference<LivenessResponseBody<LivenessResponseTokenData>>() {};
LivenessResponseBody<LivenessResponseTokenData> body = JSON.parseObject(EntityUtils.toString(res.getEntity()), typeRef);
ServiceUtil.assertion(body.getCode() == null || !body.getCode().equals("200"), body.getMsg());
return body.getData();
} catch (Exception e) {
@ -67,7 +72,10 @@ public class LivenessUtils {
try {
HttpResponse res = AliHttpUtils.doGet(host, path, method, headers, querys);
LivenessResponseBody<LivenessResponseQueryData> body = JSON.parseObject(EntityUtils.toString(res.getEntity()), LivenessResponseBody.class);
TypeReference<LivenessResponseBody<LivenessResponseQueryData>> typeRef
= new TypeReference<LivenessResponseBody<LivenessResponseQueryData>>() {};
LivenessResponseBody<LivenessResponseQueryData> body = JSON.parseObject(EntityUtils.toString(res.getEntity()), typeRef);
ServiceUtil.assertion(body.getCode() == null || !body.getCode().equals("200"), body.getMsg());
return body.getData();
} catch (Exception e) {

View File

@ -0,0 +1,19 @@
package com.ruoyi.ss.user.domain.dto;
import lombok.Data;
/**
* 用户人脸识别DTO
* @author wjh
* 2024/9/20
*/
@Data
public class UserFaceDTO {
private String token;
private Long userId;
private String name;
private String idCard;
private String mobile;
}

View File

@ -34,6 +34,4 @@ public class UserRealNameDTO {
@Pattern(regexp = RegexpUtils.MOBILE_PHONE_REGEXP, message = "手机号格式错误")
private String realPhone;
private String faceReturnUrl;
}

View File

@ -13,4 +13,7 @@ public class UserRealNameVO {
@ApiModelProperty("人脸识别token")
private String faceToken;
@ApiModelProperty("跳转URL")
private String jumpUrl;
}

View File

@ -6,6 +6,7 @@ import com.ruoyi.ss.recordBalance.domain.enums.RecordBalanceBstType;
import com.ruoyi.ss.user.domain.SmUserQuery;
import com.ruoyi.ss.user.domain.SmUserVo;
import com.ruoyi.ss.user.domain.dto.UserRealNameDTO;
import com.ruoyi.ss.user.domain.vo.UserRealNameVO;
import java.math.BigDecimal;
import java.util.List;
@ -208,7 +209,7 @@ public interface ISmUserService
/**
* 实名认证
*/
int realName(UserRealNameDTO dto);
UserRealNameVO realName(UserRealNameDTO dto);
/**
* 标记已读商户协议

View File

@ -1,11 +1,16 @@
package com.ruoyi.ss.user.service.impl;
import com.ruoyi.common.constant.CacheConstants;
import com.ruoyi.common.core.domain.entity.SmUser;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.enums.UserType;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.ServiceUtil;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.collection.CollectionUtils;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.common.valid.liveness.LivenessResponseTokenData;
import com.ruoyi.common.valid.liveness.LivenessUtils;
import com.ruoyi.common.valid.realName.RealNameValidUtils;
import com.ruoyi.ss.device.domain.DeviceQuery;
@ -18,7 +23,9 @@ import com.ruoyi.ss.store.domain.StoreVo;
import com.ruoyi.ss.store.service.StoreService;
import com.ruoyi.ss.user.domain.SmUserQuery;
import com.ruoyi.ss.user.domain.SmUserVo;
import com.ruoyi.ss.user.domain.dto.UserFaceDTO;
import com.ruoyi.ss.user.domain.dto.UserRealNameDTO;
import com.ruoyi.ss.user.domain.vo.UserRealNameVO;
import com.ruoyi.ss.user.mapper.SmUserMapper;
import com.ruoyi.ss.user.service.ISmUserService;
import org.springframework.beans.factory.annotation.Autowired;
@ -31,6 +38,7 @@ import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
@ -57,6 +65,12 @@ public class SmUserServiceImpl implements ISmUserService
@Autowired
private RecordBalanceService recordBalanceService;
@Autowired
private RedisCache redisCache;
// 活体检测返回地址
public static final String LIVENESS_RETURN_URL = SpringUtils.getRequiredProperty("liveness.returnUrl");
/**
* 查询普通用户信息
*
@ -279,7 +293,7 @@ public class SmUserServiceImpl implements ISmUserService
}
@Override
public int realName(UserRealNameDTO dto) {
public UserRealNameVO realName(UserRealNameDTO dto) {
SmUserVo user = selectSmUserByUserId(dto.getUserId());
ServiceUtil.assertion(user == null, "用户信息不存在");
ServiceUtil.assertion(user.getIsReal() != null && user.getIsReal(), "您已进行过实名认证,无需再次认证");
@ -289,9 +303,24 @@ public class SmUserServiceImpl implements ISmUserService
ServiceUtil.assertion(!check, "请输入正确的身份信息:姓名、身份证、手机号需要一致");
// 获取活体检测token
LivenessUtils.getToken(dto.getFaceReturnUrl(), );
LivenessResponseTokenData tokenData = LivenessUtils.getToken(LIVENESS_RETURN_URL, null, null);
ServiceUtil.assertion(tokenData == null || StringUtils.isBlank(tokenData.getToken()), "获取活体检测token失败");
// TODO 存入缓存
// 存入缓存:10分钟
String cacheKey = CacheConstants.LIVENESS_TOKEN + tokenData.getToken();
UserFaceDTO faceDto = new UserFaceDTO();
faceDto.setUserId(dto.getUserId());
faceDto.setToken(tokenData.getToken());
faceDto.setName(dto.getRealName());
faceDto.setMobile(dto.getRealPhone());
faceDto.setIdCard(dto.getRealIdCard());
redisCache.setCacheObject(cacheKey, faceDto, 10, TimeUnit.MINUTES);
// 返回数据
UserRealNameVO vo = new UserRealNameVO();
vo.setFaceToken(tokenData.getToken());
vo.setJumpUrl(LivenessUtils.JUMP_URL + "?token=" + tokenData.getToken());
return vo;
// 修改实名信息
// SmUser data = new SmUserQuery();

View File

@ -107,3 +107,7 @@ syb:
sm2TlPubKey: MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEBQicgWm0KAMqhO3bdqMUEDrKQvYg8cCXHhdGwq7CGE6oJDzJ1P/94HpuVdBf1KidmPxr7HOH+0DAnpeCcx9TcQ==
# 支付通知地址
notifyUrl: http://124.221.246.124:2290/app/pay/notify/tl
# 活体检测跳转地址
liveness:
returnUrl: http://192.168.2.81:3001/liveness

View File

@ -107,3 +107,7 @@ syb:
sm2TlPubKey: MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEBQicgWm0KAMqhO3bdqMUEDrKQvYg8cCXHhdGwq7CGE6oJDzJ1P/94HpuVdBf1KidmPxr7HOH+0DAnpeCcx9TcQ==
# 支付通知地址
notifyUrl: https://kg.chuangtewl.com/prod-api/app/pay/notify/tl
# 活体检测跳转地址
liveness:
returnUrl: https://kg.chuangtewl.com/liveness

View File

@ -58,6 +58,7 @@ liveness:
appKey: 204590328
appCode: 32b6c6445b1a42ed862dd4202392c47d
appSecret: td0vlGZRy9GxlrpinlrxSXFXVW34JxDh
jumpUrl: https://liveness.shumaidata.com/index
# 人像比对
face:
appKey: 204590328