();
diff --git a/api-third/src/main/java/com/heyu/api/tencent/TencentBaseHandle.java b/api-third/src/main/java/com/heyu/api/tencent/TencentBaseHandle.java
index 19552a6..2170ee0 100644
--- a/api-third/src/main/java/com/heyu/api/tencent/TencentBaseHandle.java
+++ b/api-third/src/main/java/com/heyu/api/tencent/TencentBaseHandle.java
@@ -24,7 +24,7 @@ public abstract class TencentBaseHandle {
}
RR r = run(p);
log.info("TencentBaseHandle result : {}", JSON.toJSONString(r));
- return ApiR.setData(r);
+ return ApiR.setData(r).setReceiveMoney(true);
} catch (Exception e) {
log.error("请求腾讯异常", e);
}
diff --git a/api-third/src/main/java/com/heyu/api/tencent/handle/TIdCardOCRVerificationHandle.java b/api-third/src/main/java/com/heyu/api/tencent/handle/TIdCardOCRVerificationHandle.java
new file mode 100644
index 0000000..75a8574
--- /dev/null
+++ b/api-third/src/main/java/com/heyu/api/tencent/handle/TIdCardOCRVerificationHandle.java
@@ -0,0 +1,92 @@
+package com.heyu.api.tencent.handle;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.heyu.api.data.constants.ApiConstants;
+import com.heyu.api.data.dao.api.ApiIdCardDao;
+import com.heyu.api.data.entity.api.ApiIdCardEntity;
+import com.heyu.api.data.utils.StringUtils;
+import com.heyu.api.tencent.TencentBaseHandle;
+import com.heyu.api.tencent.request.TTIdCardOCRVerificationRequest;
+import com.tencentcloudapi.faceid.v20180301.FaceidClient;
+import com.tencentcloudapi.faceid.v20180301.models.IdCardOCRVerificationRequest;
+import com.tencentcloudapi.faceid.v20180301.models.IdCardOCRVerificationResponse;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/***
+ *
+ *
+ * https://console.cloud.tencent.com/api/explorer?Product=faceid&Version=2018-03-01&Action=IdCardOCRVerification
+ *
+ *
+ *身份证识别及信息核验
+ */
+@Component
+@Slf4j
+public class TIdCardOCRVerificationHandle extends TencentBaseHandle {
+
+
+ @Autowired
+ private FaceidClient client;
+
+
+ @Autowired
+ private ApiIdCardDao apiIdCardDao;
+
+ @Override
+ public String check(TTIdCardOCRVerificationRequest ttIdCardOCRVerificationRequest) {
+ if (StringUtils.isNotBlank(ttIdCardOCRVerificationRequest.getIdCard())
+ && StringUtils.isBlank(ttIdCardOCRVerificationRequest.getName())) {
+ return "姓名不能为空";
+ }
+
+
+ if (StringUtils.isBlank(ttIdCardOCRVerificationRequest.getIdCard())
+ && StringUtils.isNotBlank(ttIdCardOCRVerificationRequest.getName())) {
+ return "身份证号不能为空";
+ }
+
+ if (StringUtils.isBlank(ttIdCardOCRVerificationRequest.getIdCard())
+ && StringUtils.isBlank(ttIdCardOCRVerificationRequest.getName())
+ && StringUtils.isBlank(ttIdCardOCRVerificationRequest.getImageBase64())
+ && StringUtils.isBlank(ttIdCardOCRVerificationRequest.getImageUrl())
+ ) {
+ return "姓名身份证号以及图片不能同时为空";
+ }
+ return null;
+ }
+
+ @Override
+ public IdCardOCRVerificationResponse run(TTIdCardOCRVerificationRequest ap) throws Exception {
+ IdCardOCRVerificationResponse resp = null;
+ if (StringUtils.isNotBlank(ap.getIdCard()) && StringUtils.isNotBlank(ap.getName())) {
+
+ ApiIdCardEntity apiIdCardEntity = apiIdCardDao.selectApiIdCardByIdCardNameChannel(ap.getIdCard(), ap.getName(), ApiConstants.tencent);
+ if (apiIdCardEntity != null) {
+ resp = JSONObject.parseObject(apiIdCardEntity.getApiResult(), IdCardOCRVerificationResponse.class);
+ return resp;
+ }
+ }
+
+ // 实例化一个请求对象,每个接口都会对应一个request对象
+ IdCardOCRVerificationRequest req = new IdCardOCRVerificationRequest();
+ req.setIdCard(ap.getIdCard());
+ req.setName(ap.getName());
+ req.setImageUrl(ap.getImageUrl());
+ req.setImageBase64(ap.getImageBase64());
+
+ // 返回的resp是一个IdCardOCRVerificationResponse的实例,与请求对象对应
+ resp = client.IdCardOCRVerification(req);
+
+ ApiIdCardEntity apiIdCardEntity = new ApiIdCardEntity();
+ apiIdCardEntity.setIdCard(ap.getIdCard());
+ apiIdCardEntity.setRealName(ap.getName());
+ apiIdCardEntity.setChannel(ApiConstants.tencent);
+ apiIdCardEntity.setApiResult(JSON.toJSONString(resp));
+ apiIdCardDao.insertApiIdCard(apiIdCardEntity);
+
+ return resp;
+ }
+}
diff --git a/api-third/src/main/java/com/heyu/api/tencent/request/TTIdCardOCRVerificationRequest.java b/api-third/src/main/java/com/heyu/api/tencent/request/TTIdCardOCRVerificationRequest.java
new file mode 100644
index 0000000..cc16a83
--- /dev/null
+++ b/api-third/src/main/java/com/heyu/api/tencent/request/TTIdCardOCRVerificationRequest.java
@@ -0,0 +1,57 @@
+package com.heyu.api.tencent.request;
+
+import com.heyu.api.tencent.TencentBaseRequest;
+import lombok.Data;
+
+
+/***
+ * https://console.cloud.tencent.com/api/explorer?Product=faceid&Version=2018-03-01&Action=IdCardOCRVerification
+ *
+ *身份证识别及信息核验
+ */
+
+@Data
+public class TTIdCardOCRVerificationRequest extends TencentBaseRequest {
+
+
+ /*
+
+否:
+
+ 身份证号。
+- 姓名和身份证号、ImageBase64、ImageUrl三者必须提供其中之一。
+- 若都提供了,则按照姓名和身份证号>ImageBase64>ImageUrl的优先级使用参数。
+示例值:11204416541220243X
+ */
+ private String idCard;
+
+
+
+ /***
+ * 否 :
+ * 姓名。
+ * 示例值:韦小宝
+ */
+ private String name ;
+
+
+ /***
+ * 否: String 身份证人像面的 Base64 值。
+ * - 支持的图片格式:PNG、JPG、JPEG,暂不支持 GIF 格式。
+ * - 支持的图片大小:所下载图片经Base64编码后不超过 3M。请使用标准的Base64编码方式(带=补位),编码规范参考RFC4648。
+ * 示例值:/9j/4AAQSkZJRg…..s97n//2Q==
+ *
+ */
+ private String imageBase64;
+
+ /***
+ * 否 String 身份证人像面的 Url 地址。
+ * - 支持的图片格式:PNG、JPG、JPEG,暂不支持 GIF 格式。
+ * - 支持的图片大小:所下载图片经 Base64 编码后不超过 3M。图片下载时间不超过 3 秒。
+ * - 图片存储于腾讯云的 Url 可保障更高的下载速度和稳定性,建议图片存储于腾讯云。
+ * - 非腾讯云存储的 Url 速度和稳定性可能受一定影响。
+ * 示例值:https://www.qq.com/image.jpg
+ */
+ private String imageUrl;
+
+}
diff --git a/api-web/api-interface/src/main/java/com/heyu/api/controller/idcard/IdCardOCRVerificationController.java b/api-web/api-interface/src/main/java/com/heyu/api/controller/idcard/IdCardOCRVerificationController.java
new file mode 100644
index 0000000..64f8be6
--- /dev/null
+++ b/api-web/api-interface/src/main/java/com/heyu/api/controller/idcard/IdCardOCRVerificationController.java
@@ -0,0 +1,81 @@
+package com.heyu.api.controller.idcard;
+
+
+import com.heyu.api.data.annotation.CacheResult;
+import com.heyu.api.data.utils.ApiR;
+import com.heyu.api.data.utils.R;
+import com.heyu.api.request.certificate.ApiIdentityCardSecondRequest;
+import com.heyu.api.resp.card.IdCardOCRVerificationResp;
+import com.heyu.api.tencent.handle.TIdCardOCRVerificationHandle;
+import com.heyu.api.tencent.request.TTIdCardOCRVerificationRequest;
+import com.tencentcloudapi.faceid.v20180301.models.IdCardOCRVerificationResponse;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+/***
+ *
+ *
+ * https://console.cloud.tencent.com/api/explorer?Product=faceid&Version=2018-03-01&Action=IdCardOCRVerification
+ *
+ *
+ *
+ *身份证识别及信息核验
+ *
+ *
+ * 二要素
+ *
+ *
+ *
+ */
+
+@Slf4j
+@RestController
+@RequestMapping("/idcard")
+public class IdCardOCRVerificationController {
+
+
+ @Autowired
+ private TIdCardOCRVerificationHandle tIdCardOCRVerificationHandle;
+
+
+
+ // http://localhost:8888/idcard/verification?idCardNumber=430529199209255030&realName=瞿贻晓
+ @RequestMapping("/verification")
+ @CacheResult
+ public R certification(ApiIdentityCardSecondRequest apiIdentityCardRequest) {
+ IdCardOCRVerificationResp idCardOCRVerificationResp = new IdCardOCRVerificationResp();
+ TTIdCardOCRVerificationRequest ttIdCardOCRVerificationRequest = new TTIdCardOCRVerificationRequest();
+ ttIdCardOCRVerificationRequest.setIdCard(apiIdentityCardRequest.getIdCardNumber());
+ ttIdCardOCRVerificationRequest.setName(apiIdentityCardRequest.getRealName());
+ ApiR apiR = tIdCardOCRVerificationHandle.handle(ttIdCardOCRVerificationRequest);
+ if (apiR.isSuccess()) {
+ IdCardOCRVerificationResponse idCardOCRVerificationResponse = apiR.getData();
+ if (idCardOCRVerificationResponse != null) {
+ if ("0".equals(idCardOCRVerificationResponse.getResult())) {
+ idCardOCRVerificationResp.setCode("1"); // 姓名和身份证号一致。
+ idCardOCRVerificationResp.setDesc("姓名和身份证号一致");
+ } else if ("-1".equals(idCardOCRVerificationResponse.getResult())) {
+ idCardOCRVerificationResp.setCode("0"); // 姓名和身份证号不一致。
+ idCardOCRVerificationResp.setDesc("姓名和身份证号不一致");
+ } else if ("-4".equals(idCardOCRVerificationResponse.getResult()) // -4: 证件库服务异常。
+ || "-6".equals(idCardOCRVerificationResponse.getResult()) // -6: 权威比对系统升级中,请稍后再试。
+ || "-7".equals(idCardOCRVerificationResponse.getResult()) // -7: 认证次数超过当日限制。
+ ) {
+ return R.error("服务异常,不会收费");
+ } else {
+ idCardOCRVerificationResp.setCode("0"); //其他情况
+ idCardOCRVerificationResp.setDesc("其他情况"); //其他情况
+ }
+ idCardOCRVerificationResp.setIdCardNumber(apiIdentityCardRequest.getIdCardNumber());
+ idCardOCRVerificationResp.setRealName(apiIdentityCardRequest.getRealName());
+ return R.ok().setData(idCardOCRVerificationResp);
+
+ }
+ }
+ return R.error(apiR.getErrorMsg());
+ }
+
+}
\ No newline at end of file
diff --git a/api-web/api-interface/src/main/java/com/heyu/api/resp/card/IdCardOCRVerificationResp.java b/api-web/api-interface/src/main/java/com/heyu/api/resp/card/IdCardOCRVerificationResp.java
new file mode 100644
index 0000000..d9cb76b
--- /dev/null
+++ b/api-web/api-interface/src/main/java/com/heyu/api/resp/card/IdCardOCRVerificationResp.java
@@ -0,0 +1,33 @@
+package com.heyu.api.resp.card;
+
+
+import lombok.Data;
+
+@Data
+public class IdCardOCRVerificationResp {
+
+ /**
+ * 认证结果码,收费情况如下。
+ - 收费结果码:
+ 1: 姓名和身份证号一致。
+ 0: 姓名和身份证号不一致。
+ 2: 其他情况
+ */
+ private String code;
+
+ /**
+ * 业务结果描述。
+ */
+ private String desc;
+
+ /**
+ * 用于验证的姓名。
+ */
+ private String realName;
+
+ /**
+ * 用于验证的身份证号。
+ */
+ private String idCardNumber;
+
+}