提交 9ced984c 编写于 作者: Chongwen.jiang's avatar Chongwen.jiang

app端身份证识别接口开发

上级 3bd6069b
流水线 #24745 已失败 于阶段
in 0 second
......@@ -174,7 +174,7 @@
<dependency>
<groupId>com.pica.cloud.riskcontrol</groupId>
<artifactId>pica-cloud-riskcontrol-client</artifactId>
<version>1.0.3.1</version>
<version>1.0.3.2</version>
</dependency>
<!-- apple identifyToken校验 -->
......@@ -207,6 +207,18 @@
</exclusions>
</dependency>
<dependency>
<groupId>com.pica.cloud.base.file</groupId>
<artifactId>pica-cloud-file-client</artifactId>
<version>1.0.2.1</version>
</dependency>
<dependency>
<groupId>com.pica.cloud.base.file</groupId>
<artifactId>pica-cloud-file-common</artifactId>
<version>1.0.2.2</version>
</dependency>
</dependencies>
......
......@@ -75,4 +75,16 @@ public class Constants {
/** 风控记录过数据 */
public static final String RC_RECORDED_DATA_KEY = "risk-{mobile}-{ip}";
/** app身份证识别,风控调用标识缓存key */
public static final String OCR_INVOKED_RC_KEY = "account-ocrInvokedRc-{timestamp}";
/** ocr识别出错接口返回的响应code */
public static final String OCR_FAIL = "3232";
/** 身份证正面ocr识别信息缓存key */
public static final String CARD_OCR_INFO_KEY = "ws-cardFront-{timestamp}";
/** 身份证正面ocr识别信息缓存key有效时间 */
public static final int CARD_OCR_EXPIRE = 60*30;
}
// Copyright 2016-2101 Pica.
package com.pica.cloud.account.account.server.controller;
import com.pica.cloud.account.account.server.req.CardRecognizeEncryptReq;
import com.pica.cloud.account.account.server.service.OcrService;
import com.pica.cloud.account.account.server.util.IPUtil;
import com.pica.cloud.foundation.entity.PicaResponse;
import com.pica.cloud.foundation.service.starter.interceptor.EnabledLoginValidate;
import com.pica.cloud.foundation.utils.entity.PicaUser;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
/**
* @ClassName OcrController
* @Description
* @Author Chongwen.jiang
* @Date 2020/4/24 11:57
* @ModifyDate 2020/4/24 11:57
* @Version 1.0
*/
@Api(description = "ocr识别")
@RequestMapping("/ocr")
@RestController
public class OcrController extends AccountBaseController {
@Autowired
private OcrService ocrService;
@ApiOperation("身份证识别(app)")
@EnabledLoginValidate
@PostMapping("/cardRecognize")
public PicaResponse ocrRecognizeApp(HttpServletRequest request,
@RequestBody CardRecognizeEncryptReq req,
@RequestHeader("token") String token,
@RequestHeader("sourceType") Integer sourceType) {
PicaUser user = super.fetchPicaUser();
String ip = IPUtil.getIpAdrress(request);
String deviceIp = super.getDeviceInfo("device_ip");
return PicaResponse.toResponse(ocrService.ocrRecognizeApp(user, req, token, ip, sourceType, deviceIp));
}
}
......@@ -55,6 +55,7 @@ public enum AccountExceptionEnum {
PICA_MOBILE_NOT_REGIST_H5("216547", "该手机号尚未设置密码,设置密码请前往云鹊医APP,或使用其他方式登录。"),
PICA_MOBILE_NOT_SETED_PASSWORD_H5("216548", "该手机号尚未设置密码,设置密码请前往云鹊医APP,或使用其他方式登录。"),
PICA_PWD_MISMATCH_5_H5("216549", "该账号密码错误次数已达上限请24小时后再试,或请使用其他登录方式"),
CARD_FRONT_RECOGNIZE_ERROR("216550", "请上传真实带有头像面的身份证保证其边框完整,信息清晰无局部遮挡"),
xxx_xxx("","");
......
// Copyright 2016-2101 Pica.
package com.pica.cloud.account.account.server.model;
/**
* @ClassName DoctorCardCacheDto
* @Description
* @Author Chongwen.jiang
* @Date 2020/4/23 11:50
* @ModifyDate 2020/4/23 11:50
* @Version 1.0
*/
public class DoctorCardCacheModel {
private String name;
/** 男 女 */
private String sex;
private String nation;
private String birthday;
private String nativePlace;
private String cardNo;
public DoctorCardCacheModel(){}
public DoctorCardCacheModel(String name, String sex, String nation, String birthday, String nativePlace, String cardNo){
this.name = name;
this.sex = sex;
this.nation = nation;
this.birthday = birthday;
this.nativePlace = nativePlace;
this.cardNo = cardNo;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getNation() {
return nation;
}
public void setNation(String nation) {
this.nation = nation;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
public String getNativePlace() {
return nativePlace;
}
public void setNativePlace(String nativePlace) {
this.nativePlace = nativePlace;
}
public String getCardNo() {
return cardNo;
}
public void setCardNo(String cardNo) {
this.cardNo = cardNo;
}
}
// Copyright 2016-2101 Pica.
package com.pica.cloud.account.account.server.req;
import io.swagger.annotations.ApiModel;
/**
* @ClassName CardRecognizeEncryptReq
* @Description
* @Author Chongwen.jiang
* @Date 2020/4/24 15:04
* @ModifyDate 2020/4/24 15:04
* @Version 1.0
*/
@ApiModel(value = "CardRecognizeEncryptReq", description = "app身份证识别请求类")
public class CardRecognizeEncryptReq {
/**
* 加密后的密文
*/
private String key;
/**
* 加密后的数据
*/
private String content;
/** 图片base64字符串,该字段不加密 */
private String file64Str;
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getFile64Str() {
return file64Str;
}
public void setFile64Str(String file64Str) {
this.file64Str = file64Str;
}
}
// Copyright 2016-2101 Pica.
package com.pica.cloud.account.account.server.req;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
/**
* @ClassName appUploadOcrReq
* @Description app身份证识别请求类
* @Author Chongwen.jiang
* @Date 2020/4/23 18:00
* @ModifyDate 2020/4/23 18:00
* @Version 1.0
*/
@ApiModel(value = "AppUploadOcrReq", description = "原生端上传图片请求类")
public class CardRecognizeReq {
@ApiModelProperty(value = "图片base64字符串")
private String file64Str;
@ApiModelProperty(value = "图片原始名称")
private String name;
@ApiModelProperty(value = "设备id")
private String device_token;
@ApiModelProperty(value = "风控校验返回的唯一标识")
private String no;
public String getFile64Str() {
return file64Str;
}
public void setFile64Str(String file64Str) {
this.file64Str = file64Str;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNo() {
return no;
}
public void setNo(String no) {
this.no = no;
}
public String getDevice_token() {
return device_token;
}
public void setDevice_token(String device_token) {
this.device_token = device_token;
}
}
// Copyright 2016-2101 Pica.
package com.pica.cloud.account.account.server.resp;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
/**
* @ClassName CardRecognizeResp
* @Description app份证识别响应类
* @Author Chongwen.jiang
* @Date 2020/4/17 17:50
* @ModifyDate 2020/4/17 17:50
* @Version 1.0
*/
@ApiModel(value = "CardRecognizeResp", description = "身份证识别响应类")
public class CardRecognizeResp {
@ApiModelProperty(value = "图片全路径")
private String fileUrl;
@ApiModelProperty(value = "是否触发风控(1触发 2不需要)")
private Boolean needCheck = true;
@ApiModelProperty(value = "唯一标识")
private String no;
public String getFileUrl() {
return fileUrl;
}
public void setFileUrl(String fileUrl) {
this.fileUrl = fileUrl;
}
public String getNo() {
return no;
}
public void setNo(String no) {
this.no = no;
}
public Boolean getNeedCheck() {
return needCheck;
}
public void setNeedCheck(Boolean needCheck) {
this.needCheck = needCheck;
}
}
// Copyright 2016-2101 Pica.
package com.pica.cloud.account.account.server.service;
import com.pica.cloud.account.account.server.req.CardRecognizeEncryptReq;
import com.pica.cloud.account.account.server.resp.CardRecognizeResp;
import com.pica.cloud.foundation.utils.entity.PicaUser;
/**
* @ClassName OcrService
* @Description
* @Author Chongwen.jiang
* @Date 2020/4/24 11:57
* @ModifyDate 2020/4/24 11:57
* @Version 1.0
*/
public interface OcrService {
/**
* @Description app身份证识别接口(包括风控校验)
* @Author Chongwen.jiang
* @Date 2020/4/24 13:12
* @ModifyDate 2020/4/24 13:12
* @Params [user, entity, token, ip, sourceType, deviceIp]
* @Return com.pica.cloud.account.account.server.resp.CardRecognizeResp
*/
CardRecognizeResp ocrRecognizeApp(PicaUser user, CardRecognizeEncryptReq entity, String token,
String ip, Integer sourceType, String deviceIp);
}
// Copyright 2016-2101 Pica.
package com.pica.cloud.account.account.server.service;
/**
* @ClassName ThreadPoolService
* @Description 线程池服务
* @Author Chongwen.jiang
* @Date 2020/4/22 17:50
* @ModifyDate 2020/4/22 17:50
* @Version 1.0
*/
public interface ThreadPoolService {
/**
* @Description 记录风控数据
* @Author Chongwen.jiang
* @Date 2020/4/22 17:58
* @ModifyDate 2020/4/22 17:58
* @Params [sourceType, mobile, ip, deviceToken, deviceIp]
* @Return void
*/
void recordRcData(Integer sourceType, String mobile, String ip, String deviceToken, String deviceIp);
}
......@@ -11,6 +11,7 @@ import com.pica.cloud.account.account.server.enums.SourceTypeEnum;
import com.pica.cloud.account.account.server.req.BaseRequest;
import com.pica.cloud.account.account.server.model.JigsawCodeModel;
import com.pica.cloud.account.account.server.service.AuthCodeService;
import com.pica.cloud.account.account.server.service.ThreadPoolService;
import com.pica.cloud.account.account.server.util.AESUtil;
import com.pica.cloud.account.account.server.util.AccountUtils;
import com.pica.cloud.account.account.server.util.IPUtil;
......@@ -55,11 +56,10 @@ public class AuthCodeServiceImpl implements AuthCodeService {
private ICacheClient cacheClient;
@Autowired
@Qualifier("accountThreadPool")
private ThreadPoolTaskExecutor threadPoolTaskExecutor;
private SliderImageService sliderImageService;
@Autowired
private SliderImageService sliderImageService;
private ThreadPoolService threadPoolService;
/**
......@@ -188,15 +188,11 @@ public class AuthCodeServiceImpl implements AuthCodeService {
rec.setDeviceIp(deviceIp);
rec.setDeviceId(baseRequest.getDevice_token());
rec.setSourceType(baseRequest.getSourceType());
try {
threadPoolTaskExecutor.execute(() -> {
logger.info("recordRcData-execute-{}", JSON.toJSONString(rec));
PicaResponse resp = rcClient.logSend(rec);
logger.info("recordRcData-resp-{}", JSON.toJSONString(resp));
});
} catch (Exception e) {
logger.error("recordRcData invoke error", e.getMessage());
}
String ip = IPUtil.getIpAdrress(request);
logger.info("recordRcData start");
threadPoolService.recordRcData(baseRequest.getSourceType(), baseRequest.getMobile(),
ip, baseRequest.getDevice_token(), deviceIp);
}
/**
......
// Copyright 2016-2101 Pica.
package com.pica.cloud.account.account.server.service.impl;
import com.alibaba.fastjson.JSON;
import com.pica.cloud.account.account.server.service.ThreadPoolService;
import com.pica.cloud.foundation.entity.PicaResponse;
import com.pica.cloud.foundation.utils.utils.StringUtil;
import com.pica.cloud.riskcontrol.riskcontrol.client.CheckCodeClient;
import com.pica.cloud.riskcontrol.riskcontrol.common.req.CheckcodeRiskReq;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;
/**
* @ClassName ThreadPoolServiceImpl
* @Description
* @Author Chongwen.jiang
* @Date 2020/4/22 17:51
* @ModifyDate 2020/4/22 17:51
* @Version 1.0
*/
@Service
public class ThreadPoolServiceImpl implements ThreadPoolService {
private static final Logger logger = LoggerFactory.getLogger(ThreadPoolServiceImpl.class);
@Autowired
@Qualifier("accountThreadPool")
private ThreadPoolTaskExecutor threadPoolTaskExecutor;
@Autowired
private CheckCodeClient rcClient;
@Override
public void recordRcData(Integer sourceType, String mobile, String ip,
String deviceToken, String deviceIp) {
CheckcodeRiskReq rec = new CheckcodeRiskReq();
rec.setSourceType(sourceType);
rec.setMobile(mobile);
rec.setIp(ip);
if(!StringUtil.isEmpty(deviceToken)) {
rec.setDeviceId(deviceToken);
}
if(!StringUtil.isEmpty(deviceIp)) {
rec.setDeviceIp(deviceIp);
}
try {
threadPoolTaskExecutor.execute(() -> {
logger.info("recordRcData-execute-{}", JSON.toJSONString(rec));
PicaResponse resp = rcClient.logSend(rec);
logger.info("recordRcData-resp-{}", JSON.toJSONString(resp));
});
} catch (Exception e) {
logger.error("recordRcData invoke error", e.getMessage());
}
}
}
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册