.net之阿里云短信服务集成
概念
集成阿里云短信服务
引用阿里云包
封装AliyunSmsClient(二次封装阿里云短信基类)
public class AliyunSmsClient
{
private readonly Client _client;
private readonly AliyunSmsOptions _options;
public AliyunSmsClient(IOptions<AliyunSmsOptions> options)
{
_options = options.Value;
_client = new Client(new Config()
{
AccessKeyId = _options.AccessKeyId,
AccessKeySecret = _options.AccessKeySecret,
Endpoint = "dysmsapi.aliyuncs.com"
});
}
public SendSmsResponse Send(SendSmsRequest req)
{
if (!string.IsNullOrEmpty(_options.SignName))
req.SignName = _options.SignName;
return _client.SendSms(req);
}
public async Task<SendSmsResponse> SendAsync(SendSmsRequest req)
{
if (!string.IsNullOrEmpty(_options.SignName))
req.SignName = _options.SignName;
return await _client.SendSmsAsync(req);
}
}
封装参数构造类AliyunSmsSendRequestBuilder
public class AliyunSmsSendRequestBuilder
{
private readonly SendSmsRequest _request;
private readonly List<string> _phones;
private readonly Dictionary<string, object> _templateParams;
public AliyunSmsSendRequestBuilder(string templateCode)
{
_request = new SendSmsRequest();
_request.TemplateCode = templateCode;
_phones = new List<string>();
_templateParams = new Dictionary<string, object>();
}
public AliyunSmsSendRequestBuilder AddPhone(IEnumerable<string> phones) => AddPhone(phones.ToArray());
public AliyunSmsSendRequestBuilder AddPhone(params string[] phones)
{
_phones.AddRange(phones);
return this;
}
public AliyunSmsSendRequestBuilder AddSignName( string signName)
{
_request.SignName = signName;
return this;
}
public AliyunSmsSendRequestBuilder AddTemplateParam(string key, object value)
{
_templateParams.Add(key, value);
return this;
}
public SendSmsRequest Build()
{
_request.PhoneNumbers = string.Join(",", _phones.Distinct());
_request.TemplateParam = JsonConvert.SerializeObject(_templateParams as dynamic);
return _request;
}
}
封装初始化参数类AliyunSmsOptions
public class AliyunSmsOptions
{
public string AccessKeyId { get; set; }
public string AccessKeySecret { get; set; }
public string SignName { get; set; }
}
封装服务扩展静态类ServiceCollectionExtensions
public static class ServiceCollectionExtensions
{
public static IServiceCollection AddAliyunSms(this IServiceCollection services, Action<AliyunSmsOptions> setup)
{
services.Configure(setup);
services.AddSingleton<AliyunSmsClient>();
return services;
}
}
项目打包推送至nuget仓库
打包传送门 https://www.cnblogs.com/inclme/p/16053978.html
.net6中使用
引用上述nuget包
添加扩展服务
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddAliyunSms((op) =>
{
builder.Configuration.Bind("BPA:AliyunSms", op);
});
参数参考
"AliyunSms": {
"AccessKeyId": "参考Key",
"AccessKeySecret": "参考Secret",
"SignName": "参考"
},
使用示例
/// <summary>
/// Api控制器基类
/// </summary>
/// <typeparam name="TService">默认需要解析的服务,等同于构造函数解析</typeparam>
public abstract class ApiControllerBase<TService> : ApiControllerBase where TService : class
{
/// <summary>
/// 默认解析的服务实例
/// </summary>
protected TService Service { get; private set; }
[NonAction]
public override Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
Service = (TService)HttpContext.RequestServices.GetService(typeof(TService));
return base.OnActionExecutionAsync(context, next);
}
}
[ApiController]
[Route("[controller]")]
public class AliyunSmsController : ApiControllerBase<AliyunSmsClient>
{
[HttpGet("Send")]
public async Task Send()
{
var req = new AliyunSmsSendRequestBuilder("SMS_289330024")
.AddPhone("13688142124")
.AddPhone("19138566642")
.AddTemplateParam("code", "456789")
.Build();
var result = await Service.SendAsync(req);
}
}