提交修改

This commit is contained in:
quyixiao 2025-04-14 23:44:05 +08:00
parent 89a30e0400
commit f9e815ba75
13 changed files with 613 additions and 18 deletions

View File

@ -306,4 +306,10 @@ public class ApiConstants {
public static final String t_auth = "t_auth";
/***
* 腾讯
*/
public static final String tencent = "tencent";
}

View File

@ -0,0 +1,39 @@
package com.heyu.api.data.dao.api;
/**
* <p>
* 账户表 服务类
* </p>
*
* @author quyixiao
* @since 2025-04-14
*/
import com.heyu.api.data.entity.api.ApiIdCardEntity;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.lz.mybatis.plugin.annotations.LIMIT;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface ApiIdCardDao extends BaseMapper<ApiIdCardEntity> {
ApiIdCardEntity selectApiIdCardById(@Param("id")Long id);
Long insertApiIdCard(ApiIdCardEntity apiIdCard);
Long insertOrUpdateApiIdCard(ApiIdCardEntity apiIdCard);
int updateApiIdCardById(ApiIdCardEntity apiIdCard);
int updateCoverApiIdCardById(ApiIdCardEntity apiIdCard);
int deleteApiIdCardById(@Param("id")Long id);
@LIMIT
ApiIdCardEntity selectApiIdCardByIdCardNameChannel(String idCard, String realName, String channel);
}

View File

@ -0,0 +1,182 @@
package com.heyu.api.data.entity.api;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import com.lz.mybatis.plugin.annotations.AS;
import java.math.BigDecimal;
import java.util.Date;import java.util.Date;
/**
*账户表
* @author quyixiao
* @since 2025-04-14
*/
@Data
@TableName("api_id_card")
public class ApiIdCardEntity implements java.io.Serializable {
private static final long serialVersionUID = 1L;
public final static String CLASS_NAME ="com.heyu.api.data.entity.api.ApiIdCardEntity:";
public final static String all = CLASS_NAME + "*";
public final static String id_ = CLASS_NAME + "id"; // 主键id
public final static String is_delete = CLASS_NAME + "is_delete"; // 是否删除0 1 删除
public final static String create_time = CLASS_NAME + "create_time"; // 创建时间
public final static String modify_time = CLASS_NAME + "modify_time"; // 修改时间
public final static String id_card = CLASS_NAME + "id_card"; // 身份证
public final static String real_name = CLASS_NAME + "real_name"; // 真实姓名
public final static String api_result = CLASS_NAME + "api_result"; // 结果
public final static String channel_ = CLASS_NAME + "channel"; // 渠道
//主键id
@TableId(value = "id", type = IdType.AUTO)
private Long id;
//是否删除0 1 删除
private Integer isDelete;
//创建时间
private Date createTime;
//修改时间
private Date modifyTime;
//身份证
private String idCard;
//真实姓名
private String realName;
//结果
private String apiResult;
//渠道
private String channel;
/**
* 主键id
* @return
*/
public Long getId() {
return id;
}
/**
* 主键id
* @param id
*/
public void setId(Long id) {
this.id = id;
}
/**
* 是否删除0 1 删除
* @return
*/
public Integer getIsDelete() {
return isDelete;
}
/**
* 是否删除0 1 删除
* @param isDelete
*/
public void setIsDelete(Integer isDelete) {
this.isDelete = isDelete;
}
/**
* 创建时间
* @return
*/
public Date getCreateTime() {
return createTime;
}
/**
* 创建时间
* @param createTime
*/
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
/**
* 修改时间
* @return
*/
public Date getModifyTime() {
return modifyTime;
}
/**
* 修改时间
* @param modifyTime
*/
public void setModifyTime(Date modifyTime) {
this.modifyTime = modifyTime;
}
/**
* 身份证
* @return
*/
public String getIdCard() {
return idCard;
}
/**
* 身份证
* @param idCard
*/
public void setIdCard(String idCard) {
this.idCard = idCard;
}
/**
* 真实姓名
* @return
*/
public String getRealName() {
return realName;
}
/**
* 真实姓名
* @param realName
*/
public void setRealName(String realName) {
this.realName = realName;
}
/**
* 结果
* @return
*/
public String getApiResult() {
return apiResult;
}
/**
* 结果
* @param apiResult
*/
public void setApiResult(String apiResult) {
this.apiResult = apiResult;
}
/**
* 渠道
* @return
*/
public String getChannel() {
return channel;
}
/**
* 渠道
* @param channel
*/
public void setChannel(String channel) {
this.channel = channel;
}
@Override
public String toString() {
return "ApiIdCardEntity{" +
",id=" + id +
",isDelete=" + isDelete +
",createTime=" + createTime +
",modifyTime=" + modifyTime +
",idCard=" + idCard +
",realName=" + realName +
",apiResult=" + apiResult +
",channel=" + channel +
"}";
}
}

View File

@ -0,0 +1,34 @@
package com.heyu.api.data.service.api;
/**
* <p>
* 账户表 服务类
* </p>
*
* @author quyixiao
* @since 2025-04-14
*/
import com.baomidou.mybatisplus.extension.service.IService;
import com.heyu.api.data.entity.api.ApiIdCardEntity;
public interface ApiIdCardService extends IService<ApiIdCardEntity> {
ApiIdCardEntity selectApiIdCardById(Long id);
Long insertApiIdCard(ApiIdCardEntity apiIdCard);
Long insertOrUpdateApiIdCard(ApiIdCardEntity apiIdCard);
int updateApiIdCardById(ApiIdCardEntity apiIdCard);
int updateCoverApiIdCardById(ApiIdCardEntity apiIdCard);
int deleteApiIdCardById(Long id);
}

View File

@ -0,0 +1,68 @@
package com.heyu.api.data.service.impl.api;
/**
* <p>
* 账户表 服务类
* </p>
*
* @author quyixiao
* @since 2025-04-14
*/
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heyu.api.data.dao.api.ApiIdCardDao;
import com.heyu.api.data.entity.api.ApiIdCardEntity;
import com.heyu.api.data.service.api.ApiIdCardService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class ApiIdCardServiceImpl extends ServiceImpl<ApiIdCardDao, ApiIdCardEntity> implements ApiIdCardService {
@Autowired
private ApiIdCardDao apiIdCardDao;
@Override
public ApiIdCardEntity selectApiIdCardById(Long id){
return apiIdCardDao.selectApiIdCardById(id);
}
@Override
public Long insertApiIdCard(ApiIdCardEntity apiIdCard){
return apiIdCardDao.insertApiIdCard(apiIdCard);
}
@Override
public Long insertOrUpdateApiIdCard(ApiIdCardEntity apiIdCard){
return apiIdCardDao.insertOrUpdateApiIdCard(apiIdCard);
}
@Override
public int updateApiIdCardById(ApiIdCardEntity apiIdCard){
return apiIdCardDao.updateApiIdCardById(apiIdCard);
}
@Override
public int updateCoverApiIdCardById(ApiIdCardEntity apiIdCard){
return apiIdCardDao.updateCoverApiIdCardById(apiIdCard);
}
@Override
public int deleteApiIdCardById(Long id){
return apiIdCardDao.deleteApiIdCardById(id);
}
}

View File

@ -1,5 +1,8 @@
package com.heyu.api.data.utils;
import lombok.Data;
@Data
public class ApiR<T> {
/**
* 业务数据放在
@ -16,10 +19,17 @@ public class ApiR<T> {
*/
private String errorMsg;
/***
* 是否收钱
*/
private boolean receiveMoney = false;
public static ApiR error(String error) {
ApiR apiR = new ApiR();
apiR.errorMsg = error;
apiR.success = false;
apiR.receiveMoney = false;
return apiR;
}
@ -30,23 +40,10 @@ public class ApiR<T> {
return apiR;
}
public T getData() {
return data;
public ApiR setReceiveMoney(boolean receiveMoney) {
this.receiveMoney = receiveMoney;
return this;
}
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
public String getErrorMsg() {
return errorMsg;
}
public void setErrorMsg(String errorMsg) {
this.errorMsg = errorMsg;
}
}

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.heyu.api.data.dao.api.ApiIdCardDao">
</mapper>

View File

@ -93,7 +93,7 @@ public class MysqlMain_insert {
System.out.println(MysqlMain_insert.save_path);
List<TablesBean> list = new ArrayList<TablesBean>();
list.add(new TablesBean("api_post_code"));
list.add(new TablesBean("api_id_card"));
List<TablesBean> list2 = new ArrayList<TablesBean>();

View File

@ -24,7 +24,7 @@ public abstract class TencentBaseHandle<P, RR> {
}
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);
}

View File

@ -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<TTIdCardOCRVerificationRequest, IdCardOCRVerificationResponse> {
@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;
}
}

View File

@ -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 {
/*
身份证号
- 姓名和身份证号ImageBase64ImageUrl三者必须提供其中之一
- 若都提供了则按照姓名和身份证号>ImageBase64>ImageUrl的优先级使用参数
示例值11204416541220243X
*/
private String idCard;
/***
*
* 姓名
* 示例值韦小宝
*/
private String name ;
/***
* String 身份证人像面的 Base64
* - 支持的图片格式PNGJPGJPEG暂不支持 GIF 格式
* - 支持的图片大小所下载图片经Base64编码后不超过 3M请使用标准的Base64编码方式(=补位)编码规范参考RFC4648
* 示例值/9j/4AAQSkZJRg..s97n//2Q==
*
*/
private String imageBase64;
/***
* String 身份证人像面的 Url 地址
* - 支持的图片格式PNGJPGJPEG暂不支持 GIF 格式
* - 支持的图片大小所下载图片经 Base64 编码后不超过 3M图片下载时间不超过 3
* - 图片存储于腾讯云的 Url 可保障更高的下载速度和稳定性建议图片存储于腾讯云
* - 非腾讯云存储的 Url 速度和稳定性可能受一定影响
* 示例值https://www.qq.com/image.jpg
*/
private String imageUrl;
}

View File

@ -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<IdCardOCRVerificationResponse> 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());
}
}

View File

@ -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;
}