live-forum/server/webapi/LiveForum/LiveForum.Service/RealName/AliyunRealNameProvider.cs
2026-03-24 11:27:37 +08:00

122 lines
4.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using LiveForum.IService.Others;
using LiveForum.IService.RealName;
using LiveForum.Model.Dto.RealName;
using Microsoft.Extensions.Logging;
using System.Net.Http;
using System.Net.Http.Json;
using System.Text.Json;
namespace LiveForum.Service.RealName
{
/// <summary>
/// 阿里云身份二要素核验实现
/// 使用阿里云实人认证 - 信息核验 - Id2MetaVerify API
/// SDK: AlibabaCloud.SDK.Cloudauth20200618
/// </summary>
public class AliyunRealNameProvider : IRealNameVerifyProvider
{
private readonly ISystemSettingsService _settings;
private readonly ILogger<AliyunRealNameProvider> _logger;
public string ProviderName => "aliyun";
public AliyunRealNameProvider(ISystemSettingsService settings, ILogger<AliyunRealNameProvider> logger)
{
_settings = settings;
_logger = logger;
}
public async Task<RealNameVerifyResult> VerifyAsync(string realName, string idCardNumber)
{
try
{
var accessKeyId = await _settings.GetSettingAsync("aliyun_access_key_id");
var accessKeySecret = await _settings.GetSettingAsync("aliyun_access_key_secret");
if (string.IsNullOrEmpty(accessKeyId) || string.IsNullOrEmpty(accessKeySecret))
{
_logger.LogError("阿里云 AccessKey 未配置");
return new RealNameVerifyResult
{
IsMatch = false,
Message = "实名认证服务未配置,请联系管理员"
};
}
// 使用阿里云 SDK 调用 Id2MetaVerify
var config = new AlibabaCloud.OpenApiClient.Models.Config
{
AccessKeyId = accessKeyId,
AccessKeySecret = accessKeySecret,
Endpoint = "cloudauth.aliyuncs.com"
};
var client = new AlibabaCloud.SDK.Cloudauth20190307.Client(config);
var request = new AlibabaCloud.SDK.Cloudauth20190307.Models.Id2MetaVerifyRequest
{
ParamType = "normal",
UserName = realName,
IdentifyNum = idCardNumber
};
var response = await client.Id2MetaVerifyAsync(request);
var body = response.Body;
_logger.LogInformation("阿里云身份核验响应: RequestId={RequestId}, Code={Code}, BizCode={BizCode}",
body.RequestId, body.Code, body.ResultObject?.BizCode);
if (body.Code == "200" || body.Code == "OK")
{
var bizCode = body.ResultObject?.BizCode;
return bizCode switch
{
"1" => new RealNameVerifyResult
{
IsMatch = true,
Message = "实名认证成功",
RequestId = body.RequestId
},
"2" => new RealNameVerifyResult
{
IsMatch = false,
Message = "姓名与身份证号不匹配",
RequestId = body.RequestId
},
"3" => new RealNameVerifyResult
{
IsMatch = false,
Message = "身份信息未查得,请检查后重试",
RequestId = body.RequestId
},
_ => new RealNameVerifyResult
{
IsMatch = false,
Message = $"核验异常BizCode={bizCode}",
RequestId = body.RequestId
}
};
}
return new RealNameVerifyResult
{
IsMatch = false,
Message = body.Message ?? "核验服务异常",
RequestId = body.RequestId
};
}
catch (Exception ex)
{
_logger.LogError(ex, "阿里云身份核验异常");
return new RealNameVerifyResult
{
IsMatch = false,
Message = "实名认证服务异常,请稍后重试"
};
}
}
}
}