diff --git a/src/blazor/admin/BootstrapAdmin.Web/Services/SMS/DefaultSMSProvider.cs b/src/blazor/admin/BootstrapAdmin.Web/Services/SMS/DefaultSMSProvider.cs index 891dcba3..e21322ae 100644 --- a/src/blazor/admin/BootstrapAdmin.Web/Services/SMS/DefaultSMSProvider.cs +++ b/src/blazor/admin/BootstrapAdmin.Web/Services/SMS/DefaultSMSProvider.cs @@ -7,120 +7,116 @@ using System.Security.Cryptography; using System.Text; using System.Text.Json; -namespace BootstrapAdmin.Web.Services.SMS +namespace BootstrapAdmin.Web.Services.SMS; + +/// +/// 手机号登陆帮助类 +/// +public class DefaultSMSProvider : ISMSProvider { + private static readonly ConcurrentDictionary _pool = new ConcurrentDictionary(); + /// - /// 手机号登陆帮助类 + /// 获得 短信配置信息 /// - public class DefaultSMSProvider : ISMSProvider + public SMSOptions Options { get { return _options; } } + + private readonly DefaultSMSOptions _options; + private readonly HttpClient _client; + + /// + /// 构造函数 + /// + /// + /// + public DefaultSMSProvider(IConfiguration configuration, IHttpClientFactory factory) { - private static readonly ConcurrentDictionary _pool = new ConcurrentDictionary(); - - /// - /// 获得 短信配置信息 - /// - public SMSOptions Options { get { return _options; } } - - private readonly DefaultSMSOptions _options; - private readonly HttpClient _client; - - /// - /// 构造函数 - /// - /// - /// - public DefaultSMSProvider(IConfiguration configuration, IHttpClientFactory factory) - { - _options = configuration.GetSection(nameof(SMSOptions)).Get(); - _client = factory.CreateClient(); - } - - /// - /// 下发验证码方法 - /// - /// - /// - public async Task SendCodeAsync(string phoneNumber) - { - Options.Timestamp = (DateTimeOffset.UtcNow.Ticks - 621355968000000000) / 10000000; - Options.Phone = phoneNumber; - var requestParameters = new Dictionary() - { - { "CompanyCode", _options.CompanyCode }, - { "Phone", Options.Phone }, - { "TimeStamp", Options.Timestamp.ToString() }, - { "Sign", Sign() } - }; - - var url = QueryHelpers.AddQueryString(Options.RequestUrl, requestParameters); - var req = await _client.GetAsync(url); - var content = await req.Content.ReadAsStringAsync(); -#if !NETSTANDARD2_0 - var result = JsonSerializer.Deserialize(content, new JsonSerializerOptions() { PropertyNameCaseInsensitive = true }); -#else - var result = JsonConvert.DeserializeObject(content); -#endif - var ret = new SMSResult() { Result = result!.Code == 1, Msg = result.Msg }; - if (ret.Result) - { - _pool.AddOrUpdate(Options.Phone, key => new AutoExpireValidateCode(Options.Phone, result.Data, Options.Expires, phone => _pool.TryRemove(phone, out var _)), (key, v) => v.Reset(result.Data)); - } - else - { - new Exception(result.Msg).Format(new NameValueCollection() - { - ["UserId"] = Options.Phone, - ["url"] = url, - ["content"] = content - }); - } - return ret; - } - - /// - /// 验证验证码方法 - /// - /// 手机号 - /// 验证码 - /// - public bool Validate(string phone, string code) => _pool.TryGetValue(phone, out var signKey) && Hash($"{code}{_options.MD5Key}") == signKey.Code; - - private string Sign() - { - return Hash($"{_options.CompanyCode}{Options.Phone}{Options.Timestamp}{_options.MD5Key}"); - } - - private static string Hash(string data) - { - using var md5 = MD5.Create(); - var sign = BitConverter.ToString(md5.ComputeHash(Encoding.UTF8.GetBytes(data))); - sign = sign.Replace("-", "").ToLowerInvariant(); - return sign; - } - - private class DefaultSMSResult - { - public int Code { get; set; } - - public string Data { get; set; } = ""; - - public string Msg { get; set; } = ""; - } + _options = configuration.GetSection(nameof(SMSOptions)).Get(); + _client = factory.CreateClient(); } /// - /// + /// 下发验证码方法 /// - public class DefaultSMSOptions : SMSOptions + /// + /// + public async Task SendCodeAsync(string phoneNumber) { - /// - /// 获得/设置 公司编码 - /// - public string CompanyCode { get; set; } = ""; + Options.Timestamp = (DateTimeOffset.UtcNow.Ticks - 621355968000000000) / 10000000; + Options.Phone = phoneNumber; + var requestParameters = new Dictionary() + { + { "CompanyCode", _options.CompanyCode }, + { "Phone", Options.Phone }, + { "TimeStamp", Options.Timestamp.ToString() }, + { "Sign", Sign() } + }; - /// - /// 获得/设置 签名密钥 - /// - public string MD5Key { get; set; } = ""; + var url = QueryHelpers.AddQueryString(Options.RequestUrl, requestParameters); + var req = await _client.GetAsync(url); + var content = await req.Content.ReadAsStringAsync(); + var result = JsonSerializer.Deserialize(content, new JsonSerializerOptions() { PropertyNameCaseInsensitive = true }); + + var ret = new SMSResult() { Result = result!.Code == 1, Msg = result.Msg }; + if (ret.Result) + { + _pool.AddOrUpdate(Options.Phone, key => new AutoExpireValidateCode(Options.Phone, result.Data, Options.Expires, phone => _pool.TryRemove(phone, out var _)), (key, v) => v.Reset(result.Data)); + } + else + { + new Exception(result.Msg).Format(new NameValueCollection() + { + ["UserId"] = Options.Phone, + ["url"] = url, + ["content"] = content + }); + } + return ret; + } + + /// + /// 验证验证码方法 + /// + /// 手机号 + /// 验证码 + /// + public bool Validate(string phone, string code) => _pool.TryGetValue(phone, out var signKey) && Hash($"{code}{_options.MD5Key}") == signKey.Code; + + private string Sign() + { + return Hash($"{_options.CompanyCode}{Options.Phone}{Options.Timestamp}{_options.MD5Key}"); + } + + private static string Hash(string data) + { + using var md5 = MD5.Create(); + var sign = BitConverter.ToString(md5.ComputeHash(Encoding.UTF8.GetBytes(data))); + sign = sign.Replace("-", "").ToLowerInvariant(); + return sign; + } + + private class DefaultSMSResult + { + public int Code { get; set; } + + public string Data { get; set; } = ""; + + public string Msg { get; set; } = ""; } } + +/// +/// +/// +public class DefaultSMSOptions : SMSOptions +{ + /// + /// 获得/设置 公司编码 + /// + public string CompanyCode { get; set; } = ""; + + /// + /// 获得/设置 签名密钥 + /// + public string MD5Key { get; set; } = ""; +}