diff --git a/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java b/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java index e55c1a9d..d6ddde34 100644 --- a/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java +++ b/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java @@ -55,4 +55,9 @@ public class CacheConstants * 舆情分析 */ public static final String BRIEF = DASHBOARD_PREFIX + "brief"; + + /** + * 活体检测Token + */ + public static final String LIVENESS_TOKEN = "liveness:"; } diff --git a/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/valid/liveness/LivenessUtils.java b/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/valid/liveness/LivenessUtils.java index e3e41267..83a31a6f 100644 --- a/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/valid/liveness/LivenessUtils.java +++ b/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/valid/liveness/LivenessUtils.java @@ -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 body = JSON.parseObject(EntityUtils.toString(res.getEntity()), LivenessResponseBody.class); + + TypeReference> typeRef + = new TypeReference>() {}; + LivenessResponseBody 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 body = JSON.parseObject(EntityUtils.toString(res.getEntity()), LivenessResponseBody.class); + + TypeReference> typeRef + = new TypeReference>() {}; + LivenessResponseBody 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) { diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/user/domain/dto/UserFaceDTO.java b/smart-switch-service/src/main/java/com/ruoyi/ss/user/domain/dto/UserFaceDTO.java new file mode 100644 index 00000000..f175ca26 --- /dev/null +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/user/domain/dto/UserFaceDTO.java @@ -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; + +} diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/user/domain/dto/UserRealNameDTO.java b/smart-switch-service/src/main/java/com/ruoyi/ss/user/domain/dto/UserRealNameDTO.java index bee5b36e..55051cc7 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/user/domain/dto/UserRealNameDTO.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/user/domain/dto/UserRealNameDTO.java @@ -34,6 +34,4 @@ public class UserRealNameDTO { @Pattern(regexp = RegexpUtils.MOBILE_PHONE_REGEXP, message = "手机号格式错误") private String realPhone; - private String faceReturnUrl; - } diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/user/domain/vo/UserRealNameVO.java b/smart-switch-service/src/main/java/com/ruoyi/ss/user/domain/vo/UserRealNameVO.java index 041944b2..1d6ddc76 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/user/domain/vo/UserRealNameVO.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/user/domain/vo/UserRealNameVO.java @@ -13,4 +13,7 @@ public class UserRealNameVO { @ApiModelProperty("人脸识别token") private String faceToken; + @ApiModelProperty("跳转URL") + private String jumpUrl; + } diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/user/service/ISmUserService.java b/smart-switch-service/src/main/java/com/ruoyi/ss/user/service/ISmUserService.java index b5dfd0cd..95c6d77a 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/user/service/ISmUserService.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/user/service/ISmUserService.java @@ -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); /** * 标记已读商户协议 diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/user/service/impl/SmUserServiceImpl.java b/smart-switch-service/src/main/java/com/ruoyi/ss/user/service/impl/SmUserServiceImpl.java index d04b98c2..46b22093 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/user/service/impl/SmUserServiceImpl.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/user/service/impl/SmUserServiceImpl.java @@ -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(); diff --git a/smart-switch-web/src/main/resources/application-dev.yml b/smart-switch-web/src/main/resources/application-dev.yml index 2b846d01..a02a964d 100644 --- a/smart-switch-web/src/main/resources/application-dev.yml +++ b/smart-switch-web/src/main/resources/application-dev.yml @@ -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 diff --git a/smart-switch-web/src/main/resources/application-prod.yml b/smart-switch-web/src/main/resources/application-prod.yml index 9582f503..2efc635e 100644 --- a/smart-switch-web/src/main/resources/application-prod.yml +++ b/smart-switch-web/src/main/resources/application-prod.yml @@ -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 diff --git a/smart-switch-web/src/main/resources/application.yml b/smart-switch-web/src/main/resources/application.yml index cf46890c..cfb884d3 100644 --- a/smart-switch-web/src/main/resources/application.yml +++ b/smart-switch-web/src/main/resources/application.yml @@ -58,6 +58,7 @@ liveness: appKey: 204590328 appCode: 32b6c6445b1a42ed862dd4202392c47d appSecret: td0vlGZRy9GxlrpinlrxSXFXVW34JxDh + jumpUrl: https://liveness.shumaidata.com/index # 人像比对 face: appKey: 204590328