5c41a5d764
- 在订单确认页新增身份证号输入框,支持识别失败时手动填写 - 身份证号字段改为可选项,仅有值时进行格式校验,格式校验规则为18位数字或含X/x结尾的号码 - 提交订单时仅当身份证号非空才将该字段传给后端,避免覆盖后端OCR识别结果 - 移除前端OCR相关密钥配置及调用,改为后端统一识别处理 - 优化上传逻辑及界面交互,确保身份证号信息正确传递及提示
2.9 KiB
2.9 KiB
2026-08-23 工作日志
订单"确认身份"卡住 —— 根因与最终修复(已落地)
根因(完整调用链,后端为命门)
- 前端列表
pages/order/index.vue:93、pages/order/detail.vue:528用receiptStatus==20 && idCode==null判定"确认身份"。idCode前端从不赋值,必须由后端写入。 - 后端
OpenEquipmentController.receipt()→verifyIdCard()调IdcardServiceImpl(蜜堂有信/阿里云市场,已失效的第三方 OCR)。OCR 调不通 →order.setIdCode()永不执行 →idCode恒为 null → 列表卡死。 - 更关键:
shop_order表根本没有id_code/real_name/address三列(实体Order声明了字段但列不存在)。一旦setIdCode就 SQL 报错。 OrderReceiptParam也没有idCode字段,所以前端发idCode后端不读(早期前端直连 OCR 方案实际无效)。
最终方案:后端百度 OCR(密钥服务端,安全)
- 用户给了百度密钥(API Key / Secret Key)+ 后端路径
/Users/gxwebsoft/JAVA/yunxinwei-api,明确"换接口"。 - 把失效的
IdcardService替换为百度身份证识别,由后端从上传的正面图识别并写idCode。
后端改动(已 BUILD SUCCESS)
- 新增
common/core/utils/BaiduOcrService.java:用 apiKey/secretKey 换 access_token(进程内缓存),调aip.baidubce.com/rest/2.0/ocr/v1/idcard取words_result['公民身份号码'](校验 18 位格式),回填Order.idCode/realName/address及User。 - 新增
common/core/utils/BaiduIdCardResult.java(结果 VO)。 OpenEquipmentController.java:verifyIdCard()改用baiduOcrService.recognizeFront(front);移除IdcardService/IdcardRespVO依赖(旧实现仍在注释块内)。shop/param/OrderReceiptParam.java:新增非必填idCode(前端手动填写兜底通道,经 BeanCopier 写库)。application.yml:新增baidu.ocr.api-key/secret-key(用户密钥已写入)。- 新增
数据库脚本/alter_shop_order_idcard.sql:必须先在yunxinwei库执行ALTER TABLE shop_order ADD id_code/real_name/address,否则updateById会因列不存在而失败。 这是部署前必做的人工步骤。
前端改动(收敛,去掉暴露密钥的直连 OCR)
config.js:移除前端baiduOcr密钥块。pages/order/delivery.vue:移除getBaiduToken/recognizeIdCard及chooseImage里的 OCR 触发;idCode改为可选项(有值才格式校验);新增可手动填写的身份证号输入框(兜底);handleSubmit改为仅当idCode非空才随请求发送(避免空串覆盖后端识别结果)。
实测验证要点(交用户部署后确认)
- 部署后端前先跑 SQL 加列。
- 提交收货后回列表,应出现"去支付"(
idCode非空)。 - 若 OCR 偶尔失败,用户可手动填身份证号兜底。
- 不再需要小程序加百度域名白名单(OCR 走服务端)。