diff --git a/pom.xml b/pom.xml index 5e21b2b..34a4ce3 100644 --- a/pom.xml +++ b/pom.xml @@ -65,7 +65,7 @@ com.tencentcloudapi tencentcloud-sdk-java - 3.1.64 + 3.1.322 diff --git a/src/main/java/com/subsidy/common/configure/ActivityDetectionConfig.java b/src/main/java/com/subsidy/common/configure/ActivityDetectionConfig.java deleted file mode 100644 index 3aca11a..0000000 --- a/src/main/java/com/subsidy/common/configure/ActivityDetectionConfig.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.subsidy.common.configure; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Configuration; - -@Data -@Configuration -@ConfigurationProperties(prefix = "activity") -public class ActivityDetectionConfig { - - private Long captchaAppId; - - private String appSecretKey; - - private Long businessId; - -} diff --git a/src/main/java/com/subsidy/controller/AccessTokenController.java b/src/main/java/com/subsidy/controller/AccessTokenController.java index 0058e29..a82075d 100644 --- a/src/main/java/com/subsidy/controller/AccessTokenController.java +++ b/src/main/java/com/subsidy/controller/AccessTokenController.java @@ -103,4 +103,6 @@ public class AccessTokenController { signVO.setSign(SecretUtils.getSHAString(signStr)); return ResponseData.generateCreatedResponse(0,signVO); } + + } diff --git a/src/main/java/com/subsidy/controller/ImageCheckRecordController.java b/src/main/java/com/subsidy/controller/ImageCheckRecordController.java index b3db474..0d16246 100644 --- a/src/main/java/com/subsidy/controller/ImageCheckRecordController.java +++ b/src/main/java/com/subsidy/controller/ImageCheckRecordController.java @@ -4,6 +4,7 @@ package com.subsidy.controller; import com.subsidy.common.ResponseData; import com.subsidy.common.ResponseVO; import com.subsidy.common.interceptor.LoginRequired; +import com.subsidy.dto.image.ImageCheckDTO; import com.subsidy.model.ImageCheckRecordDO; import com.subsidy.service.ImageCheckRecordService; import io.swagger.annotations.ApiOperation; @@ -30,14 +31,19 @@ public class ImageCheckRecordController { @Autowired - private ImageCheckRecordService imageCheckRecordService; - + private ImageCheckRecordService imageCheckRecordService; @PostMapping("getImageCheckHistory") @ApiOperation("获取某人某个班级的验证历史 memberId classId ") @LoginRequired - public ResponseVO getImageCheckHistory(@RequestBody ImageCheckRecordDO imageCheckRecordDO){ - return ResponseData.generateCreatedResponse(0,imageCheckRecordService.getImageCheckHistory(imageCheckRecordDO)); + public ResponseVO getImageCheckHistory(@RequestBody ImageCheckRecordDO imageCheckRecordDO) { + return ResponseData.generateCreatedResponse(0, imageCheckRecordService.getImageCheckHistory(imageCheckRecordDO)); + } + + @PostMapping("imageCheck") + @ApiOperation("人身核验 id 用户id nonce ") + public ResponseVO imageCheck(@RequestBody ImageCheckDTO imageCheckDTO) throws Exception { + return ResponseData.generateCreatedResponse(0, imageCheckRecordService.imageCheck(imageCheckDTO)); } diff --git a/src/main/java/com/subsidy/controller/MemberController.java b/src/main/java/com/subsidy/controller/MemberController.java index 848cb43..d693828 100644 --- a/src/main/java/com/subsidy/controller/MemberController.java +++ b/src/main/java/com/subsidy/controller/MemberController.java @@ -102,13 +102,6 @@ public class MemberController { return ResponseData.generateCreatedResponse(0,memberService.updatePassword(memberDO)); } - @PostMapping("updateCheckImage") - @ApiOperation("上传采集照片 id checkImage") - @TimeRequired - public ResponseVO updateCheckImage(@RequestBody MemberDO memberDO){ - return ResponseData.generateCreatedResponse(0,memberService.updateCheckImage(memberDO)); - } - @PostMapping("removeCheckImage") @ApiOperation("清除采集照片 id ") public ResponseVO removeCheckImage(@RequestBody MemberDO memberDO){ diff --git a/src/main/java/com/subsidy/controller/VodPlayHistoryController.java b/src/main/java/com/subsidy/controller/VodPlayHistoryController.java index 1f6b79e..7a241bd 100644 --- a/src/main/java/com/subsidy/controller/VodPlayHistoryController.java +++ b/src/main/java/com/subsidy/controller/VodPlayHistoryController.java @@ -45,7 +45,7 @@ public class VodPlayHistoryController { @RequestMapping("insertHistoryNew") @ApiOperation("记录学生看视频位置 classId班级id vodId 视频id memberId 成员id playLength 播放时长 playRecord 位点") -// @LoginRequired + @LoginRequired @TimeRequired public ResponseVO insertHistoryNew(@RequestBody String param){ InsertHistoryNewDTO insertHistoryNewDTO = JSON.parseObject(param, InsertHistoryNewDTO.class); diff --git a/src/main/java/com/subsidy/dto/image/ImageCheckDTO.java b/src/main/java/com/subsidy/dto/image/ImageCheckDTO.java new file mode 100644 index 0000000..9dd4717 --- /dev/null +++ b/src/main/java/com/subsidy/dto/image/ImageCheckDTO.java @@ -0,0 +1,18 @@ +package com.subsidy.dto.image; + +import lombok.Data; + +@Data +public class ImageCheckDTO { + + private Long id; + + private String imageBase64; + + private Long classId; + + private Long paperId; + + private String nonce ; + +} diff --git a/src/main/java/com/subsidy/model/ImageCheckRecordDO.java b/src/main/java/com/subsidy/model/ImageCheckRecordDO.java index d47b9df..71147a2 100644 --- a/src/main/java/com/subsidy/model/ImageCheckRecordDO.java +++ b/src/main/java/com/subsidy/model/ImageCheckRecordDO.java @@ -31,15 +31,13 @@ public class ImageCheckRecordDO extends BaseModel { private Long classId; /** - * 试卷id - */ - private Long paperId; - - /** * 成员id */ private Long memberId; + /** + * 请求id + */ private String requestId; /** diff --git a/src/main/java/com/subsidy/model/MemberDO.java b/src/main/java/com/subsidy/model/MemberDO.java index 8f60de6..9d7ae91 100644 --- a/src/main/java/com/subsidy/model/MemberDO.java +++ b/src/main/java/com/subsidy/model/MemberDO.java @@ -93,7 +93,7 @@ public class MemberDO extends BaseModel { /** * 采集时间 */ - private LocalDateTime checkTime; + private String checkTime; /** * 身份证号 diff --git a/src/main/java/com/subsidy/service/ImageCheckRecordService.java b/src/main/java/com/subsidy/service/ImageCheckRecordService.java index d66abc4..7448cb7 100644 --- a/src/main/java/com/subsidy/service/ImageCheckRecordService.java +++ b/src/main/java/com/subsidy/service/ImageCheckRecordService.java @@ -1,5 +1,6 @@ package com.subsidy.service; +import com.subsidy.dto.image.ImageCheckDTO; import com.subsidy.model.ImageCheckRecordDO; import com.baomidou.mybatisplus.extension.service.IService; @@ -17,4 +18,6 @@ public interface ImageCheckRecordService extends IService { List getImageCheckHistory(ImageCheckRecordDO imageCheckRecordDO); + String imageCheck(ImageCheckDTO imageCheckDTO)throws Exception; + } diff --git a/src/main/java/com/subsidy/service/MemberService.java b/src/main/java/com/subsidy/service/MemberService.java index df1526c..32abf7a 100644 --- a/src/main/java/com/subsidy/service/MemberService.java +++ b/src/main/java/com/subsidy/service/MemberService.java @@ -43,8 +43,6 @@ public interface MemberService extends IService { String updatePassword(MemberDO memberDO); - String updateCheckImage(MemberDO memberDO); - String removeCheckImage(MemberDO memberDO); List myCourses(MyCoursesDTO myCoursesDTO); diff --git a/src/main/java/com/subsidy/service/impl/ActivityDetectionServiceImpl.java b/src/main/java/com/subsidy/service/impl/ActivityDetectionServiceImpl.java index 47dc77c..96f8497 100644 --- a/src/main/java/com/subsidy/service/impl/ActivityDetectionServiceImpl.java +++ b/src/main/java/com/subsidy/service/impl/ActivityDetectionServiceImpl.java @@ -2,25 +2,16 @@ package com.subsidy.service.impl; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.subsidy.common.configure.ActivityDetectionConfig; -import com.subsidy.common.configure.VODConfig; import com.subsidy.dto.detection.GetCheckHistoryDTO; import com.subsidy.dto.detection.VerifyDTO; import com.subsidy.model.ActivityDetectionDO; import com.subsidy.mapper.ActivityDetectionMapper; import com.subsidy.service.ActivityDetectionService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.subsidy.util.ActivityDetectionUtils; import com.subsidy.util.ConstantUtils; -import com.subsidy.util.IpAddressUtil; import com.subsidy.vo.activity.GetCheckHistoryVO; -import com.tencentcloudapi.captcha.v20190722.CaptchaClient; -import com.tencentcloudapi.captcha.v20190722.models.DescribeCaptchaResultRequest; import com.tencentcloudapi.captcha.v20190722.models.DescribeCaptchaResultResponse; -import com.tencentcloudapi.common.Credential; -import com.tencentcloudapi.common.exception.TencentCloudSDKException; -import com.tencentcloudapi.common.profile.ClientProfile; -import com.tencentcloudapi.common.profile.HttpProfile; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletRequest; @@ -36,37 +27,10 @@ import javax.servlet.http.HttpServletRequest; @Service public class ActivityDetectionServiceImpl extends ServiceImpl implements ActivityDetectionService { - @Autowired - private ActivityDetectionConfig activityDetectionConfig; - - @Autowired - private VODConfig vodConfig; - public String verify(VerifyDTO verifyDTO, HttpServletRequest request){ try{ - // 实例化一个认证对象,入参需要传入腾讯云账户secretId,secretKey,此处还需注意密钥对的保密 - // 密钥可前往https://console.cloud.tencent.com/cam/capi网站进行获取 - Credential cred = new Credential(vodConfig.getSecretId(),vodConfig.getSecretKey()); - // 实例化一个http选项,可选的,没有特殊需求可以跳过 - HttpProfile httpProfile = new HttpProfile(); - httpProfile.setEndpoint("captcha.tencentcloudapi.com"); - // 实例化一个client选项,可选的,没有特殊需求可以跳过 - ClientProfile clientProfile = new ClientProfile(); - clientProfile.setHttpProfile(httpProfile); - // 实例化要请求产品的client对象,clientProfile是可选的 - CaptchaClient client = new CaptchaClient(cred, "", clientProfile); - // 实例化一个请求对象,每个接口都会对应一个request对象 - DescribeCaptchaResultRequest req = new DescribeCaptchaResultRequest(); - req.setCaptchaType(9L); - String ip = IpAddressUtil.getIpAddress(request); - req.setUserIp(ip); - req.setRandstr(verifyDTO.getRandStr()); - req.setCaptchaAppId(activityDetectionConfig.getCaptchaAppId()); - req.setAppSecretKey(activityDetectionConfig.getAppSecretKey()); - req.setBusinessId(activityDetectionConfig.getBusinessId()); - // 返回的resp是一个DescribeCaptchaResultResponse的实例,与请求对象对应 - DescribeCaptchaResultResponse resp = client.DescribeCaptchaResult(req); + DescribeCaptchaResultResponse resp = ActivityDetectionUtils.activityDetection(request,verifyDTO.getRandStr()); // 输出json格式的字符串回包 ActivityDetectionDO activityDetectionDO = new ActivityDetectionDO(); activityDetectionDO.setClassId(verifyDTO.getClassId()); @@ -81,7 +45,7 @@ public class ActivityDetectionServiceImpl extends ServiceImpl implements ImageCheckRecordService { - public List getImageCheckHistory(ImageCheckRecordDO imageCheckRecordDO){ + @Autowired + private MemberMapper memberMapper; + + @Autowired + private RestTemplateConfig restTemplateConfig; + +// public static final String WBAPPID = "IDAaOibN"; +// public static final String SECRET= "GD6Z55rHXSlBZB4oxEEowwI5h4IgwUdh0xOOHi6fambXYMFcHuDaBRxtnMx5FVhk"; + + public static final String WBAPPID = "TIDAbX8x"; + public static final String SECRET = "cWAMlQ8Aq7aOad0wrtfJcSpcgksCLFT62qHC4uDHFCGx0SPKqtpt1PungiAKya2M"; + + public List getImageCheckHistory(ImageCheckRecordDO imageCheckRecordDO) { return this.baseMapper.selectList(new QueryWrapper() - .lambda() - .eq(ImageCheckRecordDO::getClassId,imageCheckRecordDO.getClassId()) - .eq(ImageCheckRecordDO::getMemberId,imageCheckRecordDO.getMemberId()) - .orderByDesc(ImageCheckRecordDO::getCreateDate)); + .lambda() + .eq(ImageCheckRecordDO::getClassId, imageCheckRecordDO.getClassId()) + .eq(ImageCheckRecordDO::getMemberId, imageCheckRecordDO.getMemberId()) + .orderByDesc(ImageCheckRecordDO::getCreateDate)); + } + + public String imageCheck(ImageCheckDTO imageCheckDTO) throws Exception { + + //获取这个学生的基本信息 + MemberDO memberDO = memberMapper.selectById(imageCheckDTO.getId()); + + if (StringUtils.isEmpty(memberDO.getIdCard())) { + throw new HttpException(10025); + } + + //获取token + IdCardAccessTokenVO idCardAccessTokenVO = this.accessToken(); + + //获取signTicket + IdCardTicketsVO idCardTicketsVO = this.signTickets(idCardAccessTokenVO.getAccess_token()); + + List signList1 = new ArrayList<>(); + signList1.add(WBAPPID); + signList1.add("001"); + signList1.add(memberDO.getUserName()); + signList1.add(memberDO.getIdCard()); + signList1.add(memberDO.getId() + ""); + signList1.add("1.0.0"); + + //生成签名 + String sign = sign(signList1, idCardTicketsVO.getValue()); + System.out.println(sign); + + //合作方后台上送身份信息 + SendIdCardInfoVO sendIdCardInfoVO = this.sendIdCardInfo("001", memberDO, sign); + + //获取 NONCE ticket + IdCardTicketsVO nonceTicket = this.nonceTicket(idCardAccessTokenVO.getAccess_token(), memberDO.getId() + ""); + + //签名2 + List signList2 = new ArrayList<>(); + signList2.add(WBAPPID); + signList2.add(memberDO.getId() + ""); + signList2.add(imageCheckDTO.getNonce()); + signList2.add("1.0.0"); + signList2.add(sendIdCardInfoVO.getResult().getH5faceId()); + signList2.add(sendIdCardInfoVO.getResult().getOrderNo()); + String sign2 = sign(signList2, nonceTicket.getValue()); + + //启动人脸验证 + this.startCheck(imageCheckDTO.getNonce(), sendIdCardInfoVO.getResult(), memberDO.getId() + "", sign2); + + //签名3 + List signList3 = new ArrayList<>(); + signList3.add(WBAPPID); + signList3.add("001"); + signList3.add("1.0.0"); + signList3.add(imageCheckDTO.getNonce()); + + String sign3 = sign(signList3,idCardTicketsVO.getValue()); + System.out.println(sign3); + + //人身核验结果 + ResultVO resultVO = this.checkResult("001", imageCheckDTO.getNonce(), sign3); + + + if (Double.valueOf(resultVO.getSimilarity()) > 80.0) { + return ConstantUtils.SUCCESS_VERIFY; + } else { + return ConstantUtils.FAIL_VERIFY; + } + } + + /** + * 获取accessToken + */ + public IdCardAccessTokenVO accessToken() { + + String url = "https://miniprogram-kyc.tencentcloudapi.com/api/oauth2/access_token?app_id=" + WBAPPID + + "&secret=" + SECRET + "&grant_type=client_credential&version=1.0.0"; + ResponseEntity response = restTemplateConfig.restTemplate() + .exchange(url, HttpMethod.GET, null, IdCardAccessTokenVO.class); + + System.out.println(response.getBody().toString()); + + return response.getBody(); + } + + /** + * 获取sign_ticket + */ + public IdCardTicketsVO signTickets(String accessToken) { + + String url = "https://miniprogram-kyc.tencentcloudapi.com/api/oauth2/api_ticket?app_id=" + WBAPPID + "&access_token=" + accessToken + "&type=SIGN&version=1.0.0"; + ResponseEntity response = restTemplateConfig.restTemplate() + .exchange(url, HttpMethod.GET, null, IdCardSignTicketVO.class); + + System.out.println(response.getBody().getTickets()); + + return response.getBody().getTickets().get(0); + } + + /** + * 获取签名 + */ + public static String sign(List values, String ticket) { //values传ticket外的其他参数 + if (values == null) { + throw new NullPointerException("values is null"); + } + values.removeAll(Collections.singleton(null));// remove null + values.add(ticket); + java.util.Collections.sort(values); + + StringBuilder sb = new StringBuilder(); + for (String s : values) { + sb.append(s); + } + return Hashing.sha1().hashString(sb, Charsets.UTF_8).toString().toUpperCase(); + } + + /** + * 合作方后台上送身份信息 POST请求 + */ + public SendIdCardInfoVO sendIdCardInfo(String orderNo, MemberDO memberDO, String sign) { + String url = "https://miniprogram-kyc.tencentcloudapi.com/api/server/h5/geth5faceid?orderNo=" + orderNo; + + String input = "{\n" + + " \"webankAppId\":\"" + WBAPPID + "\",\n" + + " \"orderNo\":\"" + orderNo + "\",\n" + + " \"name\":\"" + memberDO.getUserName() + "\"," + + " \"idNo\":\"" + memberDO.getIdCard() + "\"," + + " \"userId\":\"" + memberDO.getId() + "\"," + + " \"version\":\"1.0.0\"," + + " \"sign\":\"" + sign + "\"" + + "}"; + + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + ResponseEntity responseEntity = restTemplateConfig.restTemplate() + .exchange(url, HttpMethod.POST, new HttpEntity<>(input, headers), SendIdCardInfoVO.class); + + return responseEntity.getBody(); + } + + /** + * 获取nonce ticket + */ + public IdCardTicketsVO nonceTicket(String accessToken, String usrId) { + + String url = "https://miniprogram-kyc.tencentcloudapi.com/api/oauth2/api_ticket?app_id=" + WBAPPID + + "&access_token=" + accessToken + + "&type=NONCE&version=1.0.0&user_id=" + usrId; + ResponseEntity response = restTemplateConfig.restTemplate() + .exchange(url, HttpMethod.GET, null, IdCardSignTicketVO.class); + return response.getBody().getTickets().get(0); } + /** + * 启动 H5 人脸核身 + */ + public void startCheck(String nonce, SendResultVO sendResultVO, String userId, String sign) { + + String url = "https://miniprogram-kyc.tencentcloudapi.com/api/pc/login?webankAppId=" + WBAPPID + + "&version=1.0.0" + + "&nonce=" + nonce + + "&orderNo=" + sendResultVO.getOrderNo() + + "&h5faceId=" + sendResultVO.getH5faceId() + + "&url=" + sendResultVO.getOptimalDomain() + + "&userId=" + userId + + "&sign=" + sign; + restTemplateConfig.restTemplate() + .exchange(url, HttpMethod.GET, null, IdCardSignTicketVO.class); + } + + /** + * 人脸核身结果查询 POST + */ + public ResultVO checkResult(String orderNo,String nonce,String sign) { + + String url = "https://miniprogram-kyc.tencentcloudapi.com/api/v2/base/queryfacerecord?orderNo="+orderNo; + + String input = "{\n" + + " \"appId\":\"" + WBAPPID + "\",\n" + + " \"version\":\"1.0.0\",\n" + + " \"nonce\":\""+nonce+"\"," + + " \"orderNo\":\"" + orderNo + "\"," + + " \"sign\":\"" + sign + "\"," + + " \"getFile\":\"2\"," + + " \"queryVersion\":\"\"" + + "}"; + + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + + ResponseEntity responseEntity = restTemplateConfig.restTemplate() + .exchange(url, HttpMethod.POST, new HttpEntity<>(input.getBytes(), headers), CheckResultVO.class); + + + return responseEntity.getBody().getResultVO(); + } + + } diff --git a/src/main/java/com/subsidy/service/impl/MemberServiceImpl.java b/src/main/java/com/subsidy/service/impl/MemberServiceImpl.java index 66f430b..e6f0f2a 100644 --- a/src/main/java/com/subsidy/service/impl/MemberServiceImpl.java +++ b/src/main/java/com/subsidy/service/impl/MemberServiceImpl.java @@ -709,12 +709,6 @@ public class MemberServiceImpl extends ServiceImpl imple return ConstantUtils.SET_SUCCESS; } - public String updateCheckImage(MemberDO memberDO) { - memberDO.setCheckTime(LocalDateTime.now()); - this.baseMapper.updateById(memberDO); - return ConstantUtils.SET_SUCCESS; - } - public String removeCheckImage(MemberDO memberDO) { this.baseMapper.removeCheckImage(memberDO.getId()); return ConstantUtils.DELETE_SUCCESS; diff --git a/src/main/java/com/subsidy/util/ActivityDetectionUtils.java b/src/main/java/com/subsidy/util/ActivityDetectionUtils.java new file mode 100644 index 0000000..8af65cb --- /dev/null +++ b/src/main/java/com/subsidy/util/ActivityDetectionUtils.java @@ -0,0 +1,48 @@ +package com.subsidy.util; + +import com.tencentcloudapi.captcha.v20190722.CaptchaClient; +import com.tencentcloudapi.captcha.v20190722.models.DescribeCaptchaResultRequest; +import com.tencentcloudapi.captcha.v20190722.models.DescribeCaptchaResultResponse; +import com.tencentcloudapi.common.Credential; +import com.tencentcloudapi.common.profile.ClientProfile; +import com.tencentcloudapi.common.profile.HttpProfile; + +import javax.servlet.http.HttpServletRequest; + +public class ActivityDetectionUtils { + + /** + * 活跃度检测工具类 + * @param request + * @param randstr + * @return + * @throws Exception + */ + + public static DescribeCaptchaResultResponse activityDetection(HttpServletRequest request, String randstr) throws Exception { + + // 实例化一个认证对象,入参需要传入腾讯云账户secretId,secretKey,此处还需注意密钥对的保密 + // 密钥可前往https://console.cloud.tencent.com/cam/capi网站进行获取 + Credential cred = new Credential(ConstantUtils.SECRET_ID, ConstantUtils.SECRET_KEY); + // 实例化一个http选项,可选的,没有特殊需求可以跳过 + HttpProfile httpProfile = new HttpProfile(); + httpProfile.setEndpoint("captcha.tencentcloudapi.com"); + // 实例化一个client选项,可选的,没有特殊需求可以跳过 + ClientProfile clientProfile = new ClientProfile(); + clientProfile.setHttpProfile(httpProfile); + // 实例化要请求产品的client对象,clientProfile是可选的 + CaptchaClient client = new CaptchaClient(cred, "", clientProfile); + // 实例化一个请求对象,每个接口都会对应一个request对象 + DescribeCaptchaResultRequest req = new DescribeCaptchaResultRequest(); + req.setCaptchaType(9L); + String ip = IpAddressUtil.getIpAddress(request); + req.setUserIp(ip); + req.setRandstr(randstr); + req.setCaptchaAppId(ConstantUtils.CAPTCHAAPP_ID); + req.setAppSecretKey(ConstantUtils.APP_SECRET_KEY); + req.setBusinessId(ConstantUtils.BUSINESS_ID); + // 返回的resp是一个DescribeCaptchaResultResponse的实例,与请求对象对应 + return client.DescribeCaptchaResult(req); + } + +} diff --git a/src/main/java/com/subsidy/util/ConstantUtils.java b/src/main/java/com/subsidy/util/ConstantUtils.java index 5f05c6f..9b6db80 100644 --- a/src/main/java/com/subsidy/util/ConstantUtils.java +++ b/src/main/java/com/subsidy/util/ConstantUtils.java @@ -86,4 +86,25 @@ public class ConstantUtils { public static final String ADMINISTER_TERMINATE = "administer"; + + /** + * API密钥--微信参数 + */ + public static final String SECRET_ID = "AKIDOcePHvZ2C5VeYHQGSO5aqtlNxJQLqfz2"; + + public static final String SECRET_KEY = "vjHYRmrfDbw0rWxA7oFcj7F8lDPKCm8E"; + + /** + * 图形验证码 + */ + public static final Long CAPTCHAAPP_ID = 2013197365L; + + public static final String APP_SECRET_KEY = "04ABoF0ZVuMje8NP84DE5Sg**"; + + public static final Long BUSINESS_ID = 1L; + + /** + * 人脸识别 + */ + } diff --git a/src/main/java/com/subsidy/util/ImageCheckUtil.java b/src/main/java/com/subsidy/util/ImageCheckUtil.java new file mode 100644 index 0000000..5fcead4 --- /dev/null +++ b/src/main/java/com/subsidy/util/ImageCheckUtil.java @@ -0,0 +1,33 @@ +package com.subsidy.util; + + +import com.google.common.hash.Hashing; +import org.apache.commons.codec.Charsets; + +import java.util.Collections; +import java.util.List; + +/** + * 人脸识别工具类 + */ +public class ImageCheckUtil { + + /** + * 签名方法 + * @param values + * @param ticket + * @return + */ + public static String sign(List values, String ticket) { //values传ticket外的其他参数 + if (values == null) { + throw new NullPointerException("values is null"); + } + values.removeAll(Collections.singleton(null));// remove null + values.add(ticket); java.util.Collections.sort(values); + StringBuilder sb = new StringBuilder(); + for (String s : values) { sb.append(s); + } + return Hashing.sha1().hashString(sb, + Charsets.UTF_8).toString().toUpperCase(); + } +} diff --git a/src/main/java/com/subsidy/vo/token/CheckResultVO.java b/src/main/java/com/subsidy/vo/token/CheckResultVO.java new file mode 100644 index 0000000..f3cd70c --- /dev/null +++ b/src/main/java/com/subsidy/vo/token/CheckResultVO.java @@ -0,0 +1,18 @@ +package com.subsidy.vo.token; + +import lombok.Data; + +@Data +public class CheckResultVO { + + private String code; + + private String msg; + + private String bizSeqNo; + + private ResultVO resultVO; + + private String transactionTime; + +} diff --git a/src/main/java/com/subsidy/vo/token/IdCardAccessTokenVO.java b/src/main/java/com/subsidy/vo/token/IdCardAccessTokenVO.java new file mode 100644 index 0000000..97e0007 --- /dev/null +++ b/src/main/java/com/subsidy/vo/token/IdCardAccessTokenVO.java @@ -0,0 +1,19 @@ +package com.subsidy.vo.token; + +import lombok.Data; + +@Data +public class IdCardAccessTokenVO { + + private String code; + + private String msg; + + private String transactionTime; + + private String access_token; + + private String expire_time; + + private String expire_in; +} diff --git a/src/main/java/com/subsidy/vo/token/IdCardSignTicketVO.java b/src/main/java/com/subsidy/vo/token/IdCardSignTicketVO.java new file mode 100644 index 0000000..4ff0c03 --- /dev/null +++ b/src/main/java/com/subsidy/vo/token/IdCardSignTicketVO.java @@ -0,0 +1,18 @@ +package com.subsidy.vo.token; + +import lombok.Data; + +import java.util.List; + +@Data +public class IdCardSignTicketVO { + + private String code; + + private String msg; + + private String transactionTime; + + private List tickets; + +} diff --git a/src/main/java/com/subsidy/vo/token/IdCardTicketsVO.java b/src/main/java/com/subsidy/vo/token/IdCardTicketsVO.java new file mode 100644 index 0000000..359c2b9 --- /dev/null +++ b/src/main/java/com/subsidy/vo/token/IdCardTicketsVO.java @@ -0,0 +1,14 @@ +package com.subsidy.vo.token; + +import lombok.Data; + +@Data +public class IdCardTicketsVO { + + private String value; + + private String expire_in; + + private String expire_time; + +} diff --git a/src/main/java/com/subsidy/vo/token/ResultVO.java b/src/main/java/com/subsidy/vo/token/ResultVO.java new file mode 100644 index 0000000..22bfade --- /dev/null +++ b/src/main/java/com/subsidy/vo/token/ResultVO.java @@ -0,0 +1,28 @@ +package com.subsidy.vo.token; + +import lombok.Data; + +@Data +public class ResultVO { + + private String orderNo; + + private String liveRate; + + private String similarity; + + private String occurredTime; + + private String appId; + + private String photo; + + private String video; + + private String bizSeqNo; + + private String sdkVersion; + + private String trtcFlag; + +} diff --git a/src/main/java/com/subsidy/vo/token/SendIdCardInfoVO.java b/src/main/java/com/subsidy/vo/token/SendIdCardInfoVO.java new file mode 100644 index 0000000..956c833 --- /dev/null +++ b/src/main/java/com/subsidy/vo/token/SendIdCardInfoVO.java @@ -0,0 +1,18 @@ +package com.subsidy.vo.token; + +import lombok.Data; + +@Data +public class SendIdCardInfoVO { + + private String code; + + private String msg; + + private String bizSeqNo; + + private SendResultVO result; + + private String transactionTime; + +} diff --git a/src/main/java/com/subsidy/vo/token/SendResultVO.java b/src/main/java/com/subsidy/vo/token/SendResultVO.java new file mode 100644 index 0000000..ccda248 --- /dev/null +++ b/src/main/java/com/subsidy/vo/token/SendResultVO.java @@ -0,0 +1,20 @@ +package com.subsidy.vo.token; + +import lombok.Data; + +@Data +public class SendResultVO { + + private String bizSeqNo; + + private String transactionTime; + + private String orderNo; + + private String h5faceId; + + private String optimalDomain; + + private Boolean success; + +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index f8eae84..1a694d2 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -69,9 +69,3 @@ wechat: #pro appId: wx5e1ecb9c9bd33451 appSecret: 4f5e1abb6fb4f68f5273820b6295ec6b - - -#活体检测配置 -activity.captchaAppId: 2013197365 -activity.appSecretKey: 04ABoF0ZVuMje8NP84DE5Sg** -activity.businessId: 1 \ No newline at end of file diff --git a/src/main/resources/code.properties b/src/main/resources/code.properties index 7eba195..df4ceed 100644 --- a/src/main/resources/code.properties +++ b/src/main/resources/code.properties @@ -17,6 +17,7 @@ meishu.code-message[10021]=密码输入错误,您还可以输入1次密码 meishu.code-message[10022]=密码输入错误,您还可以输入2次密码 meishu.code-message[10023]=密码输入错误,您还可以输入3次密码 meishu.code-message[10024]=密码输入错误,您还可以输入4次密码 +meishu.code-message[10025]=身份证识别错误 meishu.code-message[20001]=该课程已存在 diff --git a/src/main/resources/mapper/MemberMapper.xml b/src/main/resources/mapper/MemberMapper.xml index 922be5d..82ee958 100644 --- a/src/main/resources/mapper/MemberMapper.xml +++ b/src/main/resources/mapper/MemberMapper.xml @@ -93,7 +93,7 @@ count( 1 ) AS cnt FROM course_content t - LEFT JOIN vod_dict t2 ON t.id = t2.content_id + LEFT JOIN content_vod_mapping t2 ON t.id = t2.content_id WHERE t.delete_date IS NULL AND t2.delete_date IS NULL