|
@@ -1,15 +1,16 @@
|
|
|
package com.ematou.wxbase.service.impl;
|
|
|
|
|
|
+import cn.hutool.core.util.StrUtil;
|
|
|
+import com.ematou.wxbase.common.constant.RedisKey;
|
|
|
import com.ematou.wxbase.common.constant.TokenType;
|
|
|
import com.ematou.wxbase.common.web.R;
|
|
|
-import com.ematou.wxbase.entity.EidMerch;
|
|
|
-import com.ematou.wxbase.entity.MerchApp;
|
|
|
-import com.ematou.wxbase.entity.MerchInfo;
|
|
|
-import com.ematou.wxbase.entity.OperationRecord;
|
|
|
+import com.ematou.wxbase.entity.*;
|
|
|
import com.ematou.wxbase.entity.dto.EidTokenRequestDTO;
|
|
|
+import com.ematou.wxbase.entity.vo.EidTokenResponseVO;
|
|
|
import com.ematou.wxbase.exception.Assert;
|
|
|
import com.ematou.wxbase.exception.ServiceException;
|
|
|
import com.ematou.wxbase.mapper.EidMerchMapper;
|
|
|
+import com.ematou.wxbase.mapper.EidTokenRecordMapper;
|
|
|
import com.ematou.wxbase.mapper.MerchAppMapper;
|
|
|
import com.ematou.wxbase.mapper.MerchInfoMapper;
|
|
|
import com.ematou.wxbase.service.EidService;
|
|
@@ -22,11 +23,14 @@ import com.tencentcloudapi.faceid.v20180301.FaceidClient;
|
|
|
import com.tencentcloudapi.faceid.v20180301.models.GetEidTokenRequest;
|
|
|
import com.tencentcloudapi.faceid.v20180301.models.GetEidTokenResponse;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.data.redis.core.RedisTemplate;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
+import java.time.Duration;
|
|
|
+import java.time.LocalDateTime;
|
|
|
import java.util.List;
|
|
|
-import java.util.UUID;
|
|
|
|
|
|
/**
|
|
|
* E证通业务实现类
|
|
@@ -51,6 +55,11 @@ public class EidServiceImpl implements EidService {
|
|
|
@Resource
|
|
|
private OperationRecordService recordService;
|
|
|
|
|
|
+ @Resource
|
|
|
+ private EidTokenRecordMapper eidTokenRecordMapper;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private RedisTemplate<String, Object> redisTemplate;
|
|
|
|
|
|
/**
|
|
|
* 获取E证通 Token
|
|
@@ -58,7 +67,7 @@ public class EidServiceImpl implements EidService {
|
|
|
* @return
|
|
|
*/
|
|
|
@Override
|
|
|
- public R<String> getEidToken(EidTokenRequestDTO requestDTO) {
|
|
|
+ public R<EidTokenResponseVO> getEidToken(EidTokenRequestDTO requestDTO) {
|
|
|
// 校验参数
|
|
|
validateParam(requestDTO);
|
|
|
// 校验商户
|
|
@@ -68,14 +77,43 @@ public class EidServiceImpl implements EidService {
|
|
|
// 查询E证通商户配置
|
|
|
EidMerch eidMerch = eidMerchMapper.selectByMerchSn(requestDTO.getMerchSn());
|
|
|
Assert.notNull(eidMerch, "商户E证通配置不存在!");
|
|
|
- // 请求E证通 token
|
|
|
- String eidToken = reqEidToken(eidMerch);
|
|
|
- // 插入操作记录
|
|
|
- insertOptRecord(requestDTO);
|
|
|
- // TODO: 插入E证通 token 记录
|
|
|
|
|
|
+ // 响应数据
|
|
|
+ EidTokenResponseVO responseVO =
|
|
|
+ EidTokenResponseVO.builder()
|
|
|
+ .idCard(requestDTO.getIdCard())
|
|
|
+ .userName(requestDTO.getUserName())
|
|
|
+ .build();
|
|
|
|
|
|
- return R.success(null);
|
|
|
+ // 获取E证通缓存键(功能名称:商户号:应用编码:核验人身份证号),例如: get_eid_token:merch123:kmall-pt:431422196503217896
|
|
|
+ String cacheKey =
|
|
|
+ RedisKey.GET_EID_TOKEN +
|
|
|
+ requestDTO.getMerchSn() + ":" +
|
|
|
+ requestDTO.getAppCode() + ":" +
|
|
|
+ requestDTO.getIdCard();
|
|
|
+ // 获取缓存中的 token
|
|
|
+ String cacheEidToken = (String) redisTemplate.opsForValue().get(cacheKey);
|
|
|
+ if (StrUtil.isNotBlank(cacheEidToken)) {
|
|
|
+ // 如果不为空,缓存存在
|
|
|
+ // 将 token 组装到响应数据中
|
|
|
+ responseVO.setEidToken(cacheEidToken);
|
|
|
+ }else {
|
|
|
+ // 如果为空,缓存不存在
|
|
|
+ // 请求E证通 token
|
|
|
+ //String eidToken = reqEidToken(eidMerch, requestDTO.getUserName(), requestDTO.getIdCard());
|
|
|
+ String eidToken = "1a2b3c4d5e6f";
|
|
|
+ // 将E证通 token 设置进 Redis,并设置过期时间
|
|
|
+ redisTemplate.opsForValue().set(cacheKey, eidToken, Duration.ofSeconds(eidMerch.getTokenExpired()));
|
|
|
+ // 插入操作记录
|
|
|
+ insertOptRecord(requestDTO);
|
|
|
+ // 插入E证通操作记录
|
|
|
+ insertEidTokenRecord(requestDTO, eidToken);
|
|
|
+ // 返回结果组装
|
|
|
+ responseVO.setEidToken(eidToken);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 返回结果
|
|
|
+ return R.success(responseVO);
|
|
|
}
|
|
|
|
|
|
|
|
@@ -127,10 +165,13 @@ public class EidServiceImpl implements EidService {
|
|
|
|
|
|
/**
|
|
|
* 获取E证通 token
|
|
|
- * @param eidMerch
|
|
|
+ *
|
|
|
+ * @param eidMerch E证通商户配置
|
|
|
+ * @param userName 核验人姓名
|
|
|
+ * @param idCard 核验人身份证
|
|
|
* @return
|
|
|
*/
|
|
|
- private String reqEidToken(EidMerch eidMerch) {
|
|
|
+ private String reqEidToken(EidMerch eidMerch, String userName, String idCard) {
|
|
|
try {
|
|
|
// 创建访问凭据
|
|
|
Credential cred = new Credential(eidMerch.getSecretId(), eidMerch.getSecretKey());
|
|
@@ -144,19 +185,23 @@ public class EidServiceImpl implements EidService {
|
|
|
FaceidClient client = new FaceidClient(cred, "", clientProfile);
|
|
|
// 实例化一个请求对象,每个接口都会对应一个request对象
|
|
|
GetEidTokenRequest req = new GetEidTokenRequest();
|
|
|
-
|
|
|
+ // 设置商户 id
|
|
|
+ req.setMerchantId(eidMerch.getMerchId());
|
|
|
+ // 设置核验人姓名
|
|
|
+ req.setName(userName);
|
|
|
+ // 设置核验人身份证
|
|
|
+ req.setIdCard(idCard);
|
|
|
// 返回的resp是一个GetEidTokenResponse的实例,与请求对象对应
|
|
|
GetEidTokenResponse resp = client.GetEidToken(req);
|
|
|
// 输出json格式的字符串回包
|
|
|
- System.out.println(GetEidTokenResponse.toJsonString(resp));
|
|
|
+ log.info("E证通返回结果: " + GetEidTokenResponse.toJsonString(resp));
|
|
|
// 获取 EidToken
|
|
|
String eidToken = resp.getEidToken();
|
|
|
- eidToken = UUID.randomUUID().toString().replace("-", "");
|
|
|
// 返回 token
|
|
|
return eidToken;
|
|
|
} catch (TencentCloudSDKException e) {
|
|
|
- log.error("腾讯云 SDK 人脸核验异常.", e);
|
|
|
- throw new ServiceException("人脸核验异常!");
|
|
|
+ log.error("腾讯云 SDK 请求E证通 token 异常.", e);
|
|
|
+ throw new ServiceException("请求E证通异常!");
|
|
|
}
|
|
|
|
|
|
}
|
|
@@ -177,4 +222,28 @@ public class EidServiceImpl implements EidService {
|
|
|
recordService.insertRecord(operationRecord);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 插入E证通 token 记录
|
|
|
+ *
|
|
|
+ * @param requestDTO
|
|
|
+ * @param eidToken
|
|
|
+ */
|
|
|
+ private void insertEidTokenRecord(EidTokenRequestDTO requestDTO, String eidToken) {
|
|
|
+ // token 生成时间
|
|
|
+ LocalDateTime generationTime = LocalDateTime.now();
|
|
|
+ // 过期时间, 生成时间 + 60s
|
|
|
+ LocalDateTime expireTime = generationTime.plusMinutes(8L);
|
|
|
+ EidTokenRecord eidTokenRecord = EidTokenRecord.builder()
|
|
|
+ .merchSn(requestDTO.getMerchSn())
|
|
|
+ .appCode(requestDTO.getAppCode())
|
|
|
+ .token(eidToken)
|
|
|
+ .generationTime(generationTime)
|
|
|
+ .expireTime(expireTime)
|
|
|
+ .idCard(requestDTO.getIdCard())
|
|
|
+ .userName(requestDTO.getUserName())
|
|
|
+ .build();
|
|
|
+ int insert = eidTokenRecordMapper.insert(eidTokenRecord);
|
|
|
+ Assert.notTrue(insert < 1, "插入E证通 token 记录失败!");
|
|
|
+ }
|
|
|
+
|
|
|
}
|