护照识别
This commit is contained in:
parent
26c25f1e06
commit
06d52d56db
@ -318,12 +318,48 @@ public class AppUserService : BaseService<AppUserEntity>, ITransient
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="input"></param>
|
/// <param name="input"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpPost("member/ocr")]
|
[HttpPost("member/recognize/idcard")]
|
||||||
[DisplayName("OCR识别身份证")]
|
[DisplayName("OCR识别身份证")]
|
||||||
public async Task<OcrResult> RecognizeIdCard([FromBody] AthleteOcrInput input)
|
public async Task<IdCardRecognitionResult> RecognizeIdCard([FromBody] AthleteOcrInput input)
|
||||||
{
|
{
|
||||||
|
// 输入验证
|
||||||
|
if (string.IsNullOrWhiteSpace(input.ImageUrl))
|
||||||
|
{
|
||||||
|
throw Oops.Bah("护照图片URL不能为空");
|
||||||
|
}
|
||||||
|
|
||||||
|
// URL格式验证(简单的格式检查)
|
||||||
|
if (!input.ImageUrl.StartsWith("http://") && !input.ImageUrl.StartsWith("https://"))
|
||||||
|
{
|
||||||
|
throw Oops.Bah("请输入有效的图片URL地址");
|
||||||
|
}
|
||||||
|
|
||||||
return await _ocrService.RecognizeIdCardAsync(input.ImageUrl);
|
return await _ocrService.RecognizeIdCardAsync(input.ImageUrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 识别护照信息
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="input">护照图片URL输入</param>
|
||||||
|
/// <returns>护照识别结果</returns>
|
||||||
|
[HttpPost("member/recognize/passport")]
|
||||||
|
[DisplayName("OCR识别护照")]
|
||||||
|
public async Task<PassportRecognitionResult> RecognizePassport([FromBody] AthleteOcrInput input)
|
||||||
|
{
|
||||||
|
// 输入验证
|
||||||
|
if (string.IsNullOrWhiteSpace(input.ImageUrl))
|
||||||
|
{
|
||||||
|
throw Oops.Bah("护照图片URL不能为空");
|
||||||
|
}
|
||||||
|
|
||||||
|
// URL格式验证(简单的格式检查)
|
||||||
|
if (!input.ImageUrl.StartsWith("http://") && !input.ImageUrl.StartsWith("https://"))
|
||||||
|
{
|
||||||
|
throw Oops.Bah("请输入有效的图片URL地址");
|
||||||
|
}
|
||||||
|
|
||||||
|
return await _ocrService.RecognizePassportAsync(input.ImageUrl);
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
|||||||
@ -114,6 +114,13 @@
|
|||||||
<param name="input"></param>
|
<param name="input"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:YD_Event.Application.AppUser.AppUserService.RecognizePassport(YD_Event.Application.AppUser.Dtos.AthleteOcrInput)">
|
||||||
|
<summary>
|
||||||
|
识别护照信息
|
||||||
|
</summary>
|
||||||
|
<param name="input">护照图片URL输入</param>
|
||||||
|
<returns>护照识别结果</returns>
|
||||||
|
</member>
|
||||||
<member name="T:YD_Event.Application.AppUser.Dtos.AppUserPageInput">
|
<member name="T:YD_Event.Application.AppUser.Dtos.AppUserPageInput">
|
||||||
<summary>
|
<summary>
|
||||||
普通用户分页查询输入
|
普通用户分页查询输入
|
||||||
|
|||||||
@ -2,9 +2,9 @@
|
|||||||
namespace YD_Event.Core.Infrastructure.Aliyun.Ocr;
|
namespace YD_Event.Core.Infrastructure.Aliyun.Ocr;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// OCR识别结果
|
/// 身份证识别结果
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class OcrResult
|
public class IdCardRecognitionResult
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 是否成功
|
/// 是否成功
|
||||||
@ -32,7 +32,7 @@ public class OcrResult
|
|||||||
public string? IdCardNumber { get; set; }
|
public string? IdCardNumber { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 出生日期 (可选)
|
/// 出生日期
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string? BirthDate { get; set; }
|
public string? BirthDate { get; set; }
|
||||||
}
|
}
|
||||||
@ -28,11 +28,11 @@ public class OcrService : ITransient
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="imageUrl">图片URL</param>
|
/// <param name="imageUrl">图片URL</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public async Task<OcrResult> RecognizeIdCardAsync(string imageUrl)
|
public async Task<IdCardRecognitionResult> RecognizeIdCardAsync(string imageUrl)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrWhiteSpace(imageUrl))
|
if (string.IsNullOrWhiteSpace(imageUrl))
|
||||||
{
|
{
|
||||||
return new OcrResult { Success = false, Message = "图片URL不能为空" };
|
return new IdCardRecognitionResult { Success = false, Message = "图片URL不能为空" };
|
||||||
}
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
@ -67,23 +67,101 @@ public class OcrService : ITransient
|
|||||||
|
|
||||||
if (!string.IsNullOrEmpty(idNumber))
|
if (!string.IsNullOrEmpty(idNumber))
|
||||||
{
|
{
|
||||||
return new OcrResult
|
return new IdCardRecognitionResult
|
||||||
{
|
{
|
||||||
Success = true,
|
Success = true,
|
||||||
Name = name,
|
Name = name,
|
||||||
Gender = sex,
|
Gender = sex,
|
||||||
IdCardNumber = idNumber,
|
IdCardNumber = idNumber,
|
||||||
BirthDate = birthDate,
|
BirthDate = birthDate,
|
||||||
Message = "识别成功"
|
Message = "身份证识别成功"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return new OcrResult { Success = false, Message = "未识别到有效身份证信息" };
|
return new IdCardRecognitionResult { Success = false, Message = "未识别到有效身份证信息" };
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
return new OcrResult { Success = false, Message = $"OCR识别异常: {ex.Message}" };
|
return new IdCardRecognitionResult { Success = false, Message = $"身份证OCR识别异常: {ex.Message}" };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 识别护照信息
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="imageUrl">护照图片URL</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public async Task<PassportRecognitionResult> RecognizePassportAsync(string imageUrl)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(imageUrl))
|
||||||
|
{
|
||||||
|
return new PassportRecognitionResult { Success = false, Message = "图片URL不能为空" };
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var config = new AlibabaCloud.OpenApiClient.Models.Config
|
||||||
|
{
|
||||||
|
AccessKeyId = _options.AccessKeyId,
|
||||||
|
AccessKeySecret = _options.AccessKeySecret,
|
||||||
|
Endpoint = _options.Endpoint
|
||||||
|
};
|
||||||
|
|
||||||
|
var client = new Client(config);
|
||||||
|
var request = new RecognizePassportRequest
|
||||||
|
{
|
||||||
|
Url = imageUrl
|
||||||
|
};
|
||||||
|
|
||||||
|
var runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
|
||||||
|
var response = await client.RecognizePassportWithOptionsAsync(request, runtime);
|
||||||
|
|
||||||
|
if (response.Body != null && !string.IsNullOrEmpty(response.Body.Data))
|
||||||
|
{
|
||||||
|
// Data是一个JSON字符串,包含识别结果
|
||||||
|
var json = JObject.Parse(response.Body.Data);
|
||||||
|
|
||||||
|
// 解析护照信息字段
|
||||||
|
var name = (string?)json.SelectToken("..data.name") ?? (string?)json.SelectToken("..name");
|
||||||
|
var passportNumber = (string?)json.SelectToken("..data.passportNumber") ?? (string?)json.SelectToken("..passportNumber");
|
||||||
|
var nationality = (string?)json.SelectToken("..data.nationality") ?? (string?)json.SelectToken("..nationality");
|
||||||
|
var gender = (string?)json.SelectToken("..data.sex") ?? (string?)json.SelectToken("..gender") ?? (string?)json.SelectToken("..sex");
|
||||||
|
var birthDate = (string?)json.SelectToken("..data.birthDate") ?? (string?)json.SelectToken("..birthDate");
|
||||||
|
var issuingAuthority = (string?)json.SelectToken("..data.issuingAuthority") ?? (string?)json.SelectToken("..issuingAuthority");
|
||||||
|
var issueDate = (string?)json.SelectToken("..data.issueDate") ?? (string?)json.SelectToken("..issueDate");
|
||||||
|
var expiryDate = (string?)json.SelectToken("..data.expiryDate") ?? (string?)json.SelectToken("..expiryDate");
|
||||||
|
// 新增字段
|
||||||
|
var validToDate = (string?)json.SelectToken("..data.validToDate") ?? (string?)json.SelectToken("..validToDate");
|
||||||
|
var birthDateYmd = (string?)json.SelectToken("..data.birthDateYmd") ?? (string?)json.SelectToken("..birthDateYmd");
|
||||||
|
var issueDateYmd = (string?)json.SelectToken("..data.issueDateYmd") ?? (string?)json.SelectToken("..issueDateYmd");
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(passportNumber))
|
||||||
|
{
|
||||||
|
return new PassportRecognitionResult
|
||||||
|
{
|
||||||
|
Success = true,
|
||||||
|
Name = name,
|
||||||
|
Gender = gender,
|
||||||
|
PassportNumber = passportNumber,
|
||||||
|
Nationality = nationality,
|
||||||
|
BirthDate = birthDate,
|
||||||
|
IssuingAuthority = issuingAuthority,
|
||||||
|
IssueDate = issueDate,
|
||||||
|
ExpiryDate = expiryDate,
|
||||||
|
ValidToDate = validToDate,
|
||||||
|
BirthDateYmd = birthDateYmd,
|
||||||
|
IssueDateYmd = issueDateYmd,
|
||||||
|
Message = "护照识别成功"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return new PassportRecognitionResult { Success = false, Message = "未识别到有效护照信息" };
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
return new PassportRecognitionResult { Success = false, Message = $"护照OCR识别异常: {ex.Message}" };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,73 @@
|
|||||||
|
#nullable enable
|
||||||
|
namespace YD_Event.Core.Infrastructure.Aliyun.Ocr;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 护照识别结果
|
||||||
|
/// </summary>
|
||||||
|
public class PassportRecognitionResult
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 是否成功
|
||||||
|
/// </summary>
|
||||||
|
public bool Success { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 错误信息
|
||||||
|
/// </summary>
|
||||||
|
public string? Message { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 姓名
|
||||||
|
/// </summary>
|
||||||
|
public string? Name { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 性别
|
||||||
|
/// </summary>
|
||||||
|
public string? Gender { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 护照号码
|
||||||
|
/// </summary>
|
||||||
|
public string? PassportNumber { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 国籍
|
||||||
|
/// </summary>
|
||||||
|
public string? Nationality { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 签发地点
|
||||||
|
/// </summary>
|
||||||
|
public string? IssuingAuthority { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 签发日期
|
||||||
|
/// </summary>
|
||||||
|
public string? IssueDate { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 有效期至
|
||||||
|
/// </summary>
|
||||||
|
public string? ExpiryDate { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 出生日期
|
||||||
|
/// </summary>
|
||||||
|
public string? BirthDate { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 有效期至(格式化显示)
|
||||||
|
/// </summary>
|
||||||
|
public string? ValidToDate { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 出生日期(纯数字格式)
|
||||||
|
/// </summary>
|
||||||
|
public string? BirthDateYmd { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 签发日期(格式化显示)
|
||||||
|
/// </summary>
|
||||||
|
public string? IssueDateYmd { get; set; }
|
||||||
|
}
|
||||||
@ -4332,39 +4332,39 @@
|
|||||||
赞助单位
|
赞助单位
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
<member name="T:YD_Event.Core.Infrastructure.Aliyun.Ocr.OcrResult">
|
<member name="T:YD_Event.Core.Infrastructure.Aliyun.Ocr.IdCardRecognitionResult">
|
||||||
<summary>
|
<summary>
|
||||||
OCR识别结果
|
身份证识别结果
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
<member name="P:YD_Event.Core.Infrastructure.Aliyun.Ocr.OcrResult.Success">
|
<member name="P:YD_Event.Core.Infrastructure.Aliyun.Ocr.IdCardRecognitionResult.Success">
|
||||||
<summary>
|
<summary>
|
||||||
是否成功
|
是否成功
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
<member name="P:YD_Event.Core.Infrastructure.Aliyun.Ocr.OcrResult.Message">
|
<member name="P:YD_Event.Core.Infrastructure.Aliyun.Ocr.IdCardRecognitionResult.Message">
|
||||||
<summary>
|
<summary>
|
||||||
错误信息
|
错误信息
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
<member name="P:YD_Event.Core.Infrastructure.Aliyun.Ocr.OcrResult.Name">
|
<member name="P:YD_Event.Core.Infrastructure.Aliyun.Ocr.IdCardRecognitionResult.Name">
|
||||||
<summary>
|
<summary>
|
||||||
姓名
|
姓名
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
<member name="P:YD_Event.Core.Infrastructure.Aliyun.Ocr.OcrResult.Gender">
|
<member name="P:YD_Event.Core.Infrastructure.Aliyun.Ocr.IdCardRecognitionResult.Gender">
|
||||||
<summary>
|
<summary>
|
||||||
性别
|
性别
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
<member name="P:YD_Event.Core.Infrastructure.Aliyun.Ocr.OcrResult.IdCardNumber">
|
<member name="P:YD_Event.Core.Infrastructure.Aliyun.Ocr.IdCardRecognitionResult.IdCardNumber">
|
||||||
<summary>
|
<summary>
|
||||||
身份证号
|
身份证号
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
<member name="P:YD_Event.Core.Infrastructure.Aliyun.Ocr.OcrResult.BirthDate">
|
<member name="P:YD_Event.Core.Infrastructure.Aliyun.Ocr.IdCardRecognitionResult.BirthDate">
|
||||||
<summary>
|
<summary>
|
||||||
出生日期 (可选)
|
出生日期
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
<member name="T:YD_Event.Core.Infrastructure.Aliyun.Ocr.OcrService">
|
<member name="T:YD_Event.Core.Infrastructure.Aliyun.Ocr.OcrService">
|
||||||
@ -4379,6 +4379,83 @@
|
|||||||
<param name="imageUrl">图片URL</param>
|
<param name="imageUrl">图片URL</param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:YD_Event.Core.Infrastructure.Aliyun.Ocr.OcrService.RecognizePassportAsync(System.String)">
|
||||||
|
<summary>
|
||||||
|
识别护照信息
|
||||||
|
</summary>
|
||||||
|
<param name="imageUrl">护照图片URL</param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="T:YD_Event.Core.Infrastructure.Aliyun.Ocr.PassportRecognitionResult">
|
||||||
|
<summary>
|
||||||
|
护照识别结果
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:YD_Event.Core.Infrastructure.Aliyun.Ocr.PassportRecognitionResult.Success">
|
||||||
|
<summary>
|
||||||
|
是否成功
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:YD_Event.Core.Infrastructure.Aliyun.Ocr.PassportRecognitionResult.Message">
|
||||||
|
<summary>
|
||||||
|
错误信息
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:YD_Event.Core.Infrastructure.Aliyun.Ocr.PassportRecognitionResult.Name">
|
||||||
|
<summary>
|
||||||
|
姓名
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:YD_Event.Core.Infrastructure.Aliyun.Ocr.PassportRecognitionResult.Gender">
|
||||||
|
<summary>
|
||||||
|
性别
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:YD_Event.Core.Infrastructure.Aliyun.Ocr.PassportRecognitionResult.PassportNumber">
|
||||||
|
<summary>
|
||||||
|
护照号码
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:YD_Event.Core.Infrastructure.Aliyun.Ocr.PassportRecognitionResult.Nationality">
|
||||||
|
<summary>
|
||||||
|
国籍
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:YD_Event.Core.Infrastructure.Aliyun.Ocr.PassportRecognitionResult.IssuingAuthority">
|
||||||
|
<summary>
|
||||||
|
签发地点
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:YD_Event.Core.Infrastructure.Aliyun.Ocr.PassportRecognitionResult.IssueDate">
|
||||||
|
<summary>
|
||||||
|
签发日期
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:YD_Event.Core.Infrastructure.Aliyun.Ocr.PassportRecognitionResult.ExpiryDate">
|
||||||
|
<summary>
|
||||||
|
有效期至
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:YD_Event.Core.Infrastructure.Aliyun.Ocr.PassportRecognitionResult.BirthDate">
|
||||||
|
<summary>
|
||||||
|
出生日期
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:YD_Event.Core.Infrastructure.Aliyun.Ocr.PassportRecognitionResult.ValidToDate">
|
||||||
|
<summary>
|
||||||
|
有效期至(格式化显示)
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:YD_Event.Core.Infrastructure.Aliyun.Ocr.PassportRecognitionResult.BirthDateYmd">
|
||||||
|
<summary>
|
||||||
|
出生日期(纯数字格式)
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:YD_Event.Core.Infrastructure.Aliyun.Ocr.PassportRecognitionResult.IssueDateYmd">
|
||||||
|
<summary>
|
||||||
|
签发日期(格式化显示)
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
<member name="M:YD_Event.Core.Infrastructure.Aliyun.Oss.OssService.GetFullUrl(System.String)">
|
<member name="M:YD_Event.Core.Infrastructure.Aliyun.Oss.OssService.GetFullUrl(System.String)">
|
||||||
<summary>
|
<summary>
|
||||||
获取完整的URL
|
获取完整的URL
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user