| | |
| | | { |
| | | "headers": { |
| | | "access-control-allow-origin": "*", |
| | | "date": "Tue, 21 Jan 2025 07:22:51 GMT", |
| | | "date": "Tue, 21 Jan 2025 09:11:42 GMT", |
| | | "keep-alive": "timeout=25", |
| | | "transfer-encoding": "chunked", |
| | | "vary": "Accept-Encoding", |
| | | "x-acs-request-id": "4545720F-58C2-579E-A1CE-08FDDFDF3296", |
| | | "x-acs-request-id": "05842EC7-FAA4-5BF7-9C8E-BD7E705262BF", |
| | | "connection": "keep-alive", |
| | | "content-type": "application/json;charset=utf-8", |
| | | "access-control-expose-headers": "*", |
| | | "x-acs-trace-id": "2a95d25064c13621b98f3883185aadc1" |
| | | "x-acs-trace-id": "200f635b624967d00167ded6423480c0" |
| | | }, |
| | | "body": { |
| | | "RequestId": "4545720F-58C2-579E-A1CE-08FDDFDF3296", |
| | | "RequestId": "05842EC7-FAA4-5BF7-9C8E-BD7E705262BF", |
| | | "Data": { |
| | | "SubImages": [ |
| | | { |
| | | "FigureInfo": { |
| | | "face": { |
| | | "blicense_title": { |
| | | "FigureCount": 1, |
| | | "FigureDetails": [ |
| | | { |
| | | "FigurePoints": [ |
| | | { |
| | | "X": 672, |
| | | "Y": 289 |
| | | "X": 648, |
| | | "Y": 311 |
| | | }, |
| | | { |
| | | "X": 949, |
| | | "Y": 288 |
| | | "X": 1111, |
| | | "Y": 312 |
| | | }, |
| | | { |
| | | "X": 950, |
| | | "Y": 624 |
| | | "X": 1112, |
| | | "Y": 415 |
| | | }, |
| | | { |
| | | "X": 672, |
| | | "Y": 624 |
| | | "X": 648, |
| | | "Y": 414 |
| | | } |
| | | ], |
| | | "FigureAngle": 0 |
| | | } |
| | | ] |
| | | }, |
| | | "national_emblem": { |
| | | "FigureCount": 1, |
| | | "FigureDetails": [ |
| | | { |
| | | "FigurePoints": [ |
| | | { |
| | | "X": 787, |
| | | "Y": 141 |
| | | }, |
| | | { |
| | | "X": 965, |
| | | "Y": 141 |
| | | }, |
| | | { |
| | | "X": 964, |
| | | "Y": 265 |
| | | }, |
| | | { |
| | | "X": 786, |
| | | "Y": 264 |
| | | } |
| | | ], |
| | | "FigureAngle": 0 |
| | |
| | | }, |
| | | "SubImageId": 0, |
| | | "KvInfo": { |
| | | "KvCount": 6, |
| | | "KvCount": 14, |
| | | "Data": { |
| | | "address": "黑龙江省宁安市渤海镇玄武大街35号", |
| | | "ethnicity": "汉", |
| | | "sex": "女", |
| | | "name": "陆佳欣", |
| | | "idNumber": "231084200002060822", |
| | | "birthDate": "2000年2月6日" |
| | | "RegistrationDate": "2022年08月11日", |
| | | "companyType": "其他有限责任公司", |
| | | "companyName": "新疆新省事大数据有限公司", |
| | | "businessScope": "许可项目:第一类增值电信业务:建筑智能化系统设计;农作物种子进出口;建设工程设计;建设工程施工;住宅室内装饰装修。(依法须经批准的项目,经相关部门批准后方可升展经营活动,具体经营项目以相关部门批准文件或许可证件为准)一般项目:数据处理和存储支持服务:人工智能理论与算法软件开发:智能机器人的研发;云计算装备技术服务;云计算设备销售;数字内容制作服务(不含出版发行);通信设备销售;安防设备销售:信息安全设备销售:信息安全设备制造:卫星导航服务;导航终端销售;导航终端制造;导航、测绘、气象及海洋专用仪器销售;环境保护专用设备销售;光通信设备销售;技术服务、技术开发、技术咨询、技术交流、技术转让、技术推广:软件开发:信息系统集成服务:卫星技术综合应用系统集成:货物进出口;农副产品销售:食品进出口:酒店管理:物业管理:广告发布;广告设计、代理;广告制作;第一类医疗器械销售;第二类医疗器栈销售;教育咨询服务(不含涉许可审批的教育培训活动);大数据服务;互联网数据服务;物联网应用服务;安全技术防范系统设计施工服务;信息系统运行维护服务:数据处理服务:信息技术咨询服务;5G通信技术服务;工业工程设计服务;移动通信设备制造;移动通信设备销售;通信传输设备专业修理;通信交换设备专业修理;网络设备制造:网络设备销售;普通机械设备安装服务;计算机软硬件及辅助设备零售;计算机软硬件及辅助设备批发;计算机软硬件及外围设备制造:平面设计;技术进出口:劳务服务(不含劳务派遣)。(除依法须经批准的项目外,凭营业执照依法自主开展经营活动)", |
| | | "title": "营业执照", |
| | | "validPeriod": "", |
| | | "companyForm": "", |
| | | "creditCode": "91650106MABWEMX61X", |
| | | "registeredCapital": "壹仟万元整", |
| | | "legalPerson": "张丹", |
| | | "validFromDate": "20220811", |
| | | "businessAddress": "新疆乌鲁木齐经济技术开发区(头屯河区)玄武湖路433号经开万达广场12号写字楼办公1217室", |
| | | "issueDate": "2023年07月21日", |
| | | "validToDate": "" |
| | | }, |
| | | "KvDetails": { |
| | | "address": { |
| | | "KeyName": "address", |
| | | "RegistrationDate": { |
| | | "KeyName": "RegistrationDate", |
| | | "ValueAngle": 0, |
| | | "Value": "2022年08月11日", |
| | | "KeyConfidence": 96, |
| | | "ValueConfidence": 96 |
| | | }, |
| | | "companyType": { |
| | | "KeyName": "companyType", |
| | | "ValueAngle": 0, |
| | | "Value": "其他有限责任公司", |
| | | "KeyConfidence": 100, |
| | | "ValueConfidence": 100 |
| | | }, |
| | | "companyName": { |
| | | "KeyName": "companyName", |
| | | "ValueAngle": 0, |
| | | "Value": "新疆新省事大数据有限公司", |
| | | "KeyConfidence": 100, |
| | | "ValueConfidence": 100 |
| | | }, |
| | | "businessScope": { |
| | | "KeyName": "businessScope", |
| | | "ValueAngle": 0, |
| | | "Value": "许可项目:第一类增值电信业务:建筑智能化系统设计;农作物种子进出口;建设工程设计;建设工程施工;住宅室内装饰装修。(依法须经批准的项目,经相关部门批准后方可升展经营活动,具体经营项目以相关部门批准文件或许可证件为准)一般项目:数据处理和存储支持服务:人工智能理论与算法软件开发:智能机器人的研发;云计算装备技术服务;云计算设备销售;数字内容制作服务(不含出版发行);通信设备销售;安防设备销售:信息安全设备销售:信息安全设备制造:卫星导航服务;导航终端销售;导航终端制造;导航、测绘、气象及海洋专用仪器销售;环境保护专用设备销售;光通信设备销售;技术服务、技术开发、技术咨询、技术交流、技术转让、技术推广:软件开发:信息系统集成服务:卫星技术综合应用系统集成:货物进出口;农副产品销售:食品进出口:酒店管理:物业管理:广告发布;广告设计、代理;广告制作;第一类医疗器械销售;第二类医疗器栈销售;教育咨询服务(不含涉许可审批的教育培训活动);大数据服务;互联网数据服务;物联网应用服务;安全技术防范系统设计施工服务;信息系统运行维护服务:数据处理服务:信息技术咨询服务;5G通信技术服务;工业工程设计服务;移动通信设备制造;移动通信设备销售;通信传输设备专业修理;通信交换设备专业修理;网络设备制造:网络设备销售;普通机械设备安装服务;计算机软硬件及辅助设备零售;计算机软硬件及辅助设备批发;计算机软硬件及外围设备制造:平面设计;技术进出口:劳务服务(不含劳务派遣)。(除依法须经批准的项目外,凭营业执照依法自主开展经营活动)", |
| | | "KeyConfidence": 99, |
| | | "ValueConfidence": 98 |
| | | }, |
| | | "title": { |
| | | "KeyName": "title", |
| | | "ValueAngle": 0, |
| | | "Value": "营业执照", |
| | | "KeyConfidence": 100, |
| | | "ValueConfidence": 100 |
| | | }, |
| | | "companyForm": { |
| | | "KeyName": "companyForm", |
| | | "Value": "", |
| | | "KeyConfidence": 100, |
| | | "ValueConfidence": 100 |
| | | }, |
| | | "validPeriod": { |
| | | "KeyName": "validPeriod", |
| | | "Value": "", |
| | | "KeyConfidence": 100, |
| | | "ValueConfidence": 100 |
| | | }, |
| | | "creditCode": { |
| | | "KeyName": "creditCode", |
| | | "ValueAngle": 1, |
| | | "Value": "黑龙江省宁安市渤海镇玄武大街35号", |
| | | "Value": "91650106MABWEMX61X", |
| | | "KeyConfidence": 100, |
| | | "ValueConfidence": 100 |
| | | }, |
| | | "ethnicity": { |
| | | "KeyName": "ethnicity", |
| | | "registeredCapital": { |
| | | "KeyName": "registeredCapital", |
| | | "ValueAngle": 0, |
| | | "Value": "汉", |
| | | "Value": "壹仟万元整", |
| | | "KeyConfidence": 100, |
| | | "ValueConfidence": 100 |
| | | }, |
| | | "sex": { |
| | | "KeyName": "sex", |
| | | "legalPerson": { |
| | | "KeyName": "legalPerson", |
| | | "ValueAngle": 0, |
| | | "Value": "女", |
| | | "Value": "张丹", |
| | | "KeyConfidence": 100, |
| | | "ValueConfidence": 100 |
| | | }, |
| | | "name": { |
| | | "KeyName": "name", |
| | | "validFromDate": { |
| | | "KeyName": "validFromDate", |
| | | "ValueAngle": 0, |
| | | "Value": "陆佳欣", |
| | | "Value": "20220811", |
| | | "KeyConfidence": 100, |
| | | "ValueConfidence": 100 |
| | | "ValueConfidence": 96 |
| | | }, |
| | | "idNumber": { |
| | | "KeyName": "idNumber", |
| | | "ValueAngle": 1, |
| | | "Value": "231084200002060822", |
| | | "KeyConfidence": 100, |
| | | "ValueConfidence": 100 |
| | | }, |
| | | "birthDate": { |
| | | "KeyName": "birthDate", |
| | | "issueDate": { |
| | | "KeyName": "issueDate", |
| | | "ValueAngle": 0, |
| | | "Value": "2000年2月6日", |
| | | "Value": "2023年07月21日", |
| | | "KeyConfidence": 100, |
| | | "ValueConfidence": 100 |
| | | }, |
| | | "businessAddress": { |
| | | "KeyName": "businessAddress", |
| | | "ValueAngle": 0, |
| | | "Value": "新疆乌鲁木齐经济技术开发区(头屯河区)玄武湖路433号经开万达广场12号写字楼办公1217室", |
| | | "KeyConfidence": 100, |
| | | "ValueConfidence": 100 |
| | | }, |
| | | "validToDate": { |
| | | "KeyName": "validToDate", |
| | | "Value": "", |
| | | "KeyConfidence": 100, |
| | | "ValueConfidence": 100 |
| | | } |
| | |
| | | "QualityInfo": { |
| | | "IsCopy": false |
| | | }, |
| | | "Type": "身份证正面", |
| | | "BarCodeInfo": { |
| | | "BarCodeDetails": [], |
| | | "BarCodeCount": 0 |
| | | }, |
| | | "Type": "营业执照", |
| | | "QrCodeInfo": { |
| | | "QrCodeDetails": [ |
| | | { |
| | | "QrCodeAngle": 0, |
| | | "Data": "http://www.gsxt.gov.cn/index.html?uniscid=91650106MABWEMX61X", |
| | | "QrCodePoints": [ |
| | | { |
| | | "X": 1324, |
| | | "Y": 309 |
| | | }, |
| | | { |
| | | "X": 1457, |
| | | "Y": 309 |
| | | }, |
| | | { |
| | | "X": 1457, |
| | | "Y": 442 |
| | | }, |
| | | { |
| | | "X": 1324, |
| | | "Y": 442 |
| | | } |
| | | ] |
| | | } |
| | | ], |
| | | "QrCodeCount": 1 |
| | | }, |
| | | "Angle": 0 |
| | | } |
| | | ], |
| | | "Height": 852, |
| | | "Height": 1280, |
| | | "SubImageCount": 1, |
| | | "Width": 1136 |
| | | "Width": 1755 |
| | | } |
| | | }, |
| | | "statusCode": 200 |
New file |
| | |
| | | package com.ruoyi.system.api.model; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | @Schema(description = "营业执照信息") |
| | | public class BusinessLicense { |
| | | @Schema(description = "注册日期") |
| | | private String RegistrationDate; |
| | | @Schema(description = "公司类型") |
| | | private String companyType; |
| | | @Schema(description = "公司名称") |
| | | private String companyName; |
| | | @Schema(description = "经营范围") |
| | | private String businessScope; |
| | | @Schema(description = "抬头") |
| | | private String title; |
| | | @Schema(description = "有效期") |
| | | private String validPeriod; |
| | | @Schema(description = "公司形式") |
| | | private String companyForm; |
| | | @Schema(description = "统一社会信用代码") |
| | | private String creditCode; |
| | | @Schema(description = "注册资本") |
| | | private String registeredCapital; |
| | | @Schema(description = "法人") |
| | | private String legalPerson; |
| | | @Schema(description = "有效期从") |
| | | private String validFromDate; |
| | | @Schema(description = "地址") |
| | | private String businessAddress; |
| | | @Schema(description = "有效期至") |
| | | private String issueDate; |
| | | @Schema(description = "有效期至") |
| | | private String validToDate; |
| | | } |
| | |
| | | /** |
| | | * 证件识别 |
| | | */ |
| | | public static JSONObject idCard(InputStream bodyStream) throws Exception { |
| | | public static String idCard(InputStream bodyStream,String type) throws Exception { |
| | | com.aliyun.ocr_api20210707.Client client = createClient(); |
| | | // 需要安装额外的依赖库,直接点击下载完整工程即可看到所有依赖。 |
| | | RecognizeAllTextRequest recognizeAllTextRequest = new RecognizeAllTextRequest() |
| | | .setBody(bodyStream) |
| | | .setType("IdCard") |
| | | .setType(type) |
| | | .setOutputFigure(true); |
| | | RuntimeOptions runtime = new RuntimeOptions(); |
| | | try { |
| | | // 复制代码运行请自行打印 API 的返回值 |
| | | RecognizeAllTextResponse recognizeAllTextResponse = client.recognizeAllTextWithOptions(recognizeAllTextRequest, runtime); |
| | | String jsonString = Common.toJSONString(TeaModel.buildMap(recognizeAllTextResponse)); |
| | | JSONObject jsonObject = JSONObject.parseObject(jsonString); |
| | | Integer statusCode = jsonObject.getInteger("statusCode"); |
| | | if (statusCode != 200) { |
| | | throw new RuntimeException("识别失败"); |
| | | } |
| | | JSONObject body = jsonObject.getJSONObject("body"); |
| | | JSONObject data = body.getJSONObject("Data"); |
| | | JSONArray subImages = body.getJSONArray("SubImages"); |
| | | if (subImages != null && !subImages.isEmpty()){ |
| | | JSONObject subImage = subImages.getJSONObject(0); |
| | | JSONObject kvInfo = subImage.getJSONObject("KvInfo"); |
| | | return kvInfo.getJSONObject("Data"); |
| | | } |
| | | return null; |
| | | return Common.toJSONString(TeaModel.buildMap(recognizeAllTextResponse)); |
| | | } catch (TeaException error) { |
| | | // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。 |
| | | // 错误 message |
| | |
| | | |
| | | public static void main(String[] args) { |
| | | try { |
| | | InputStream inputStream = UrlDownloader.downloadAsStream("https://ai.bdstatic.com/file/3C8C5B451BB4445697730217EC8648E3"); |
| | | InputStream inputStream = UrlDownloader.downloadAsStream("http://192.168.110.188:9300/statics/2025/01/21/862dab34c5f83ce2635d219c467ac9f6_20250121170536A004.jpg"); |
| | | idCard(inputStream); |
| | | } catch (Exception e) { |
| | | throw new RuntimeException(e); |
| | |
| | | if (!user.getPhone().equals(updatePhone.getOldPhone())) { |
| | | return R.fail("旧手机号错误"); |
| | | } |
| | | String verifyKey = CacheConstants.PHONE_CODE_KEY + StringUtils.nvl(user.getPhone(), ""); |
| | | String verifyKey = CacheConstants.PHONE_CODE_KEY + StringUtils.nvl(updatePhone.getNewPhone(), ""); |
| | | String captcha = redisService.getCacheObject(verifyKey); |
| | | if (captcha == null) { |
| | | throw new CaptchaException("验证码已失效"); |
| | |
| | | package com.ruoyi.system.controller; |
| | | |
| | | import com.alibaba.fastjson2.JSONArray; |
| | | import com.alibaba.fastjson2.JSONObject; |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.common.core.utils.StringUtils; |
| | | import com.ruoyi.common.core.utils.UrlDownloader; |
| | | import com.ruoyi.common.core.utils.orc.OcrUtils; |
| | | import com.ruoyi.system.api.model.BusinessLicense; |
| | | import com.ruoyi.system.api.model.IdCard; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | |
| | | InputStream inputStream; |
| | | try { |
| | | inputStream = UrlDownloader.downloadAsStream(url); |
| | | JSONObject jsonObject = OcrUtils.idCard(inputStream); |
| | | IdCard idCard = JSONObject.parseObject(jsonObject.toJSONString(), IdCard.class); |
| | | return R.ok(idCard); |
| | | String jsonStr = OcrUtils.idCard(inputStream,"IdCard"); |
| | | if (StringUtils.isEmpty(jsonStr)){ |
| | | return R.fail(); |
| | | } |
| | | |
| | | JSONObject jsonObject = JSONObject.parseObject(jsonStr); |
| | | Integer statusCode = jsonObject.getInteger("statusCode"); |
| | | if (statusCode != 200) { |
| | | return R.fail("识别失败"); |
| | | } |
| | | JSONObject body = jsonObject.getJSONObject("body"); |
| | | JSONObject data = body.getJSONObject("Data"); |
| | | JSONArray subImages = data.getJSONArray("SubImages"); |
| | | if (subImages != null && !subImages.isEmpty()){ |
| | | JSONObject subImage = subImages.getJSONObject(0); |
| | | JSONObject kvInfo = subImage.getJSONObject("KvInfo"); |
| | | IdCard idCard = kvInfo.getObject("Data", IdCard.class); |
| | | return R.ok(idCard); |
| | | } |
| | | } catch (Exception e) { |
| | | throw new RuntimeException(e); |
| | | } |
| | | return R.fail(); |
| | | } |
| | | |
| | | /** |
| | | * ocr提取营业执照信息 |
| | | */ |
| | | @GetMapping("/businessLicense") |
| | | @Operation(summary = "ocr提取营业执照信息", description = "ocr提取营业执照信息") |
| | | public R<BusinessLicense> businessLicense(@Parameter(name = "url", description = "图片地址") String url) { |
| | | InputStream inputStream; |
| | | try { |
| | | inputStream = UrlDownloader.downloadAsStream(url); |
| | | String jsonStr = OcrUtils.idCard(inputStream,"BusinessLicense"); |
| | | if (StringUtils.isEmpty(jsonStr)){ |
| | | return R.fail(); |
| | | } |
| | | JSONObject jsonObject = JSONObject.parseObject(jsonStr); |
| | | Integer statusCode = jsonObject.getInteger("statusCode"); |
| | | if (statusCode != 200) { |
| | | return R.fail("识别失败"); |
| | | } |
| | | JSONObject body = jsonObject.getJSONObject("body"); |
| | | JSONObject data = body.getJSONObject("Data"); |
| | | JSONArray subImages = data.getJSONArray("SubImages"); |
| | | if (subImages != null && !subImages.isEmpty()){ |
| | | JSONObject subImage = subImages.getJSONObject(0); |
| | | JSONObject kvInfo = subImage.getJSONObject("KvInfo"); |
| | | BusinessLicense businessLicense = kvInfo.getObject("Data", BusinessLicense.class); |
| | | return R.ok(businessLicense); |
| | | } |
| | | } catch (Exception e) { |
| | | throw new RuntimeException(e); |
| | | } |
| | | return R.fail(); |
| | | } |
| | | } |