diff --git a/src/main/java/com/gxwebsoft/open/controller/OpenEquipmentController.java b/src/main/java/com/gxwebsoft/open/controller/OpenEquipmentController.java index 58310e2..d0d2c2b 100644 --- a/src/main/java/com/gxwebsoft/open/controller/OpenEquipmentController.java +++ b/src/main/java/com/gxwebsoft/open/controller/OpenEquipmentController.java @@ -411,32 +411,10 @@ public class OpenEquipmentController extends BaseController { // if(receiptStatus == 20){ // return fail("订单已确认收货,不能重复确认!"); // } - // 验证身份证真实性 - if(StringUtils.hasText(receiptParam.getOrderSourceData())) { - String orderSourceDataString = receiptParam.getOrderSourceData(); - List images = JSONObject.parseArray(orderSourceDataString, String.class); - String front = ImageUtil.ImageBase64(images.get(0) + "?x-oss-process=image/resize,w_750/quality,Q_80"); - - String back = ImageUtil.ImageBase64(images.get(1) + "?x-oss-process=image/resize,w_750/quality,Q_80"); - - IdcardRespVO verify = idcardService.verify(front, back); - System.out.println("verify res : " + verify); - if(!"FP00000".equals(verify.getCode())) { - return fail("请上传身份证正面照片." + verify.getMessage() + verify.getCode()); - } - if(verify.getIssueDate() == null || verify.getIssueOrg() == null || verify.getExpireDate() == null) { - return fail("请上传身份证反面照片"); - } - order.setRealName(verify.getName()); - order.setIdCode(verify.getIdCardNo()); - order.setAddress(verify.getAddress()); - - //更新用户信息 - User user = userService.getById(order.getUserId()); - user.setRealName(verify.getName()); - user.setIdCard(verify.getIdCardNo()); - user.setAddress(verify.getAddress()); - userService.updateUser(user); + // 验证身份证真实性(校验不通过时返回 fail 结果,通过则返回 null) + ApiResult idcardResult = verifyIdCard(receiptParam.getOrderSourceData(), order); + if (idcardResult != null) { + return idcardResult; } // 短信验证码校验 @@ -460,6 +438,74 @@ public class OpenEquipmentController extends BaseController { return success("确认收货成功"); } + /** + * 身份证 OCR 真实性校验,并把识别到的实名信息回填到 order / user。 + * orderSourceData 约定顺序:[0]=身份证正面、[1]=身份证反面、[2]=人车合照、[3]=车子照片、[4]=安装照片 + * + * @param orderSourceData 前端传入的图片地址 JSON 数组字符串 + * @param order 当前订单(校验通过时回填实名信息) + * @return 校验失败返回 ApiResult(fail),校验通过返回 null + */ + private ApiResult verifyIdCard(String orderSourceData, Order order) { + // 1. 解析图片数组 + List images; + try { + images = JSONObject.parseArray(orderSourceData, String.class); + } catch (Exception e) { + log.error("身份证图片数据解析失败, orderSourceData={}", orderSourceData, e); + return fail("身份证图片数据格式有误,请重新上传"); + } + + // 2. 必须包含身份证正反面(约定下标 0=正面、1=反面) + if (images == null || images.size() < 2 + || !StringUtils.hasText(images.get(0)) || !StringUtils.hasText(images.get(1))) { + return fail("请上传身份证正面和反面照片"); + } + + // 3. 调第三方 OCR 识别(加保护,避免接口异常导致 NPE) + String front = ImageUtil.ImageBase64(images.get(0) + "?x-oss-process=image/resize,w_750/quality,Q_80"); + String back = ImageUtil.ImageBase64(images.get(1) + "?x-oss-process=image/resize,w_750/quality,Q_80"); + + IdcardRespVO verify; + try { + verify = idcardService.verify(front, back); + } catch (Exception e) { + log.error("身份证识别服务调用异常", e); + return fail("身份证识别服务暂时不可用,请稍后重试"); + } + if (verify == null) { + return fail("身份证识别失败,请稍后重试"); + } + + // 4. 正面校验:非 FP00000 说明传的不是有效身份证人像面 + if (!"FP00000".equals(verify.getCode())) { + // 内部错误码仅记录日志,不回吐给用户 + log.warn("身份证正面识别失败 code={}, message={}", verify.getCode(), verify.getMessage()); + return fail("身份证正面照片识别失败,请重新上传清晰的身份证人像面照片"); + } + + // 5. 反面校验:签发机关/日期缺失说明传的不是有效身份证国徽面 + if (StringUtils.isEmpty(verify.getIssueDate()) + || StringUtils.isEmpty(verify.getIssueOrg()) + || StringUtils.isEmpty(verify.getExpireDate())) { + return fail("身份证反面照片识别失败,请重新上传清晰的身份证国徽面照片"); + } + + // 6. 校验通过,回填实名信息 + order.setRealName(verify.getName()); + order.setIdCode(verify.getIdCardNo()); + order.setAddress(verify.getAddress()); + + User user = userService.getById(order.getUserId()); + if (user != null) { + user.setRealName(verify.getName()); + user.setIdCard(verify.getIdCardNo()); + user.setAddress(verify.getAddress()); + userService.updateUser(user); + } + return null; + } + /*@ApiOperation("确认收货") @PostMapping("/receipt") public ApiResult receipt(@RequestBody Order order) {