.NET8集成阿里云短信服務(wù)實(shí)現(xiàn)短信發(fā)送功能
前言
在當(dāng)今的互聯(lián)網(wǎng)應(yīng)用中,短信驗(yàn)證碼、通知等功能已成為必不可少的部分。阿里云短信服務(wù)(SMS)作為國(guó)內(nèi)領(lǐng)先的短信平臺(tái),提供了穩(wěn)定可靠的短信發(fā)送能力。本文將詳細(xì)介紹如何在.NET 8應(yīng)用中集成阿里云短信服務(wù),實(shí)現(xiàn)短信發(fā)送功能。
一、準(zhǔn)備工作
1.1 阿里云賬號(hào)準(zhǔn)備
注冊(cè)阿里云賬號(hào)并完成實(shí)名認(rèn)證
開(kāi)通短信服務(wù)(SMS)
申請(qǐng)短信簽名和模板(需企業(yè)資質(zhì))
獲取 AccessKey ID 和 AccessKey Secret
1.2 .NET 8項(xiàng)目創(chuàng)建
dotnet new webapi -n AliyunSmsDemo cd AliyunSmsDemo
二、集成阿里云短信SDK
2.1 安裝NuGet包
dotnet add package Aliyun.SDK.Core dotnet add package Aliyun.SDK.Dysmsapi
2.2 配置阿里云短信參數(shù)
在 appsettings.json 中添加配置:
{
"AliyunSms": {
"AccessKeyId": "your-access-key-id",
"AccessKeySecret": "your-access-key-secret",
"Endpoint": "dysmsapi.aliyuncs.com",
"SignName": "your-sign-name",
"TemplateCode": "your-template-code"
}
}
2.3 創(chuàng)建配置類
public class AliyunSmsSettings
{
public string AccessKeyId { get; set; }
public string AccessKeySecret { get; set; }
public string Endpoint { get; set; }
public string SignName { get; set; }
public string TemplateCode { get; set; }
}
三、實(shí)現(xiàn)短信發(fā)送服務(wù)
3.1 創(chuàng)建短信服務(wù)接口
public interface ISmsService
{
Task<bool> SendVerificationCodeAsync(string phoneNumber, string code);
}
3.2 實(shí)現(xiàn)短信服務(wù)
public class AliyunSmsService : ISmsService
{
private readonly AliyunSmsSettings _settings;
private readonly ILogger<AliyunSmsService> _logger;
public AliyunSmsService(IOptions<AliyunSmsSettings> settings, ILogger<AliyunSmsService> logger)
{
_settings = settings.Value;
_logger = logger;
}
public async Task<bool> SendVerificationCodeAsync(string phoneNumber, string code)
{
try
{
var client = CreateClient();
var request = new SendSmsRequest
{
PhoneNumbers = phoneNumber,
SignName = _settings.SignName,
TemplateCode = _settings.TemplateCode,
TemplateParam = $"{{\"code\":\"[code]\"}}"
};
var response = await client.SendSmsAsync(request);
_logger.LogInformation($"短信發(fā)送結(jié)果: {JsonSerializer.Serialize(response)}");
return response.Body.Code == "OK";
}
catch (Exception ex)
{
_logger.LogError(ex, "發(fā)送短信時(shí)發(fā)生異常");
return false;
}
}
private DysmsapiClient CreateClient()
{
var config = new Config
{
AccessKeyId = _settings.AccessKeyId,
AccessKeySecret = _settings.AccessKeySecret,
Endpoint = _settings.Endpoint
};
return new DysmsapiClient(config);
}
}
3.3 注冊(cè)服務(wù)
在 Program.cs 中添加:
builder.Services.Configure<AliyunSmsSettings>(builder.Configuration.GetSection("AliyunSms"));
builder.Services.AddTransient<ISmsService, AliyunSmsService>();
四、創(chuàng)建控制器
[ApiController]
[Route("api/[controller]")]
public class SmsController : ControllerBase
{
private readonly ISmsService _smsService;
private readonly ILogger<SmsController> _logger;
public SmsController(ISmsService smsService, ILogger<SmsController> logger)
{
_smsService = smsService;
_logger = logger;
}
[HttpPost("send-verification-code")]
public async Task<IActionResult> SendVerificationCode([FromBody] SendVerificationCodeRequest request)
{
// 生成隨機(jī)驗(yàn)證碼(實(shí)際項(xiàng)目中可能需要更復(fù)雜的生成邏輯)
var code = new Random().Next(100000, 999999).ToString();
// 發(fā)送短信
var result = await _smsService.SendVerificationCodeAsync(request.PhoneNumber, code);
if (result)
{
// 實(shí)際項(xiàng)目中應(yīng)該將驗(yàn)證碼存儲(chǔ)到數(shù)據(jù)庫(kù)或緩存中,并設(shè)置過(guò)期時(shí)間
_logger.LogInformation($"驗(yàn)證碼發(fā)送成功: [code]");
return Ok(new { Success = true, Message = "驗(yàn)證碼發(fā)送成功" });
}
return BadRequest(new { Success = false, Message = "驗(yàn)證碼發(fā)送失敗" });
}
}
public class SendVerificationCodeRequest
{
[Required]
[Phone]
public string PhoneNumber { get; set; }
}
五、測(cè)試與優(yōu)化
5.1 單元測(cè)試
[Fact]
public async Task SendVerificationCode_ShouldReturnSuccess_WhenSmsSent()
{
// Arrange
var mockSmsService = new Mock<ISmsService>();
mockSmsService.Setup(x => x.SendVerificationCodeAsync(It.IsAny<string>(), It.IsAny<string>()))
.ReturnsAsync(true);
var controller = new SmsController(mockSmsService.Object, Mock.Of<ILogger<SmsController>>());
var request = new SendVerificationCodeRequest { PhoneNumber = "13800138000" };
// Act
var result = await controller.SendVerificationCode(request);
// Assert
var okResult = Assert.IsType<OkObjectResult>(result);
var response = Assert.IsType<dynamic>(okResult.Value);
Assert.True(response.Success);
}
5.2 性能優(yōu)化建議
使用 HttpClient 池化技術(shù)
實(shí)現(xiàn)短信發(fā)送限流,防止短時(shí)間內(nèi)發(fā)送過(guò)多短信
使用緩存存儲(chǔ)驗(yàn)證碼,避免重復(fù)生成
實(shí)現(xiàn)異步發(fā)送隊(duì)列,提高系統(tǒng)響應(yīng)速度
六、安全注意事項(xiàng)
不要將 AccessKey硬編碼在代碼中,使用安全的方式存儲(chǔ)
實(shí)現(xiàn)短信發(fā)送頻率限制,防止短信轟炸
驗(yàn)證碼應(yīng)該有有效期(通常5-10分鐘)
對(duì)手機(jī)號(hào)進(jìn)行格式驗(yàn)證和黑名單檢查
敏感操作日志記錄
七、總結(jié)
本文詳細(xì)介紹了在.NET 8應(yīng)用中集成阿里云短信服務(wù)的完整流程,包括:
- 阿里云短信服務(wù)的申請(qǐng)和配置
- .NET項(xiàng)目中SDK的集成
- 短信服務(wù)的封裝實(shí)現(xiàn)
- 控制器的創(chuàng)建和測(cè)試
- 性能優(yōu)化和安全注意事項(xiàng)
通過(guò)本文的指導(dǎo),開(kāi)發(fā)者可以快速在自己的.NET 8應(yīng)用中實(shí)現(xiàn)短信發(fā)送功能,為應(yīng)用增加短信驗(yàn)證、通知等能力。
到此這篇關(guān)于.NET8集成阿里云短信服務(wù)實(shí)現(xiàn)短信發(fā)送功能的文章就介紹到這了,更多相關(guān).NET8集成阿里云短信服務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SQL為查詢的結(jié)果加上序號(hào)(ROW_NUMBER) 合并多個(gè)查詢結(jié)果
SQL為查詢的結(jié)果加上序號(hào)(ROW_NUMBER) 合并多個(gè)查詢結(jié)果2010-03-03
.NET下文本相似度算法余弦定理和SimHash淺析及應(yīng)用實(shí)例分析
這篇文章主要介紹了.NET下文本相似度算法余弦定理和SimHash淺析及應(yīng)用,實(shí)例形式詳細(xì)講述了相似度算法余弦定理和SimHash的原理與用法,需要的朋友可以參考下2015-01-01
ASP.NET?Core在Task中使用IServiceProvider的問(wèn)題解析
這篇文章主要介紹了解決ASP.NET?Core在Task中使用IServiceProvider的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08
asp.net 讀取并修改config文件實(shí)現(xiàn)代碼
讀取并修改 config 文件的asp.net代碼,方便我們用asp.net修改配置文件。2009-11-11
ASP.NET Core使用HttpClient調(diào)用WebService
這篇文章介紹了ASP.NET Core使用HttpClient調(diào)用WebService的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03
Entity Framework Core使用控制臺(tái)程序生成數(shù)據(jù)庫(kù)表
這篇文章介紹了Entity Framework Core使用控制臺(tái)程序生成數(shù)據(jù)庫(kù)表的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03
Web.Config文件配置之限制上傳文件大小和時(shí)間的屬性配置
在Web.Config文件中配置限制上傳文件大小與時(shí)間字符串時(shí),是在httpRuntime httpRuntime節(jié)中完成的,需要設(shè)置以下2個(gè)屬性:maxRequestLength屬性與ExecutionTimeout屬性,感興趣的朋友可以了解下,或許對(duì)你有所幫助2013-02-02
詳解.NET?Core如何構(gòu)建一個(gè)彈性的HTTP請(qǐng)求機(jī)制
在分布式系統(tǒng)中,服務(wù)間的依賴關(guān)系復(fù)雜,任何一個(gè)服務(wù)的故障都可能導(dǎo)致整個(gè)系統(tǒng)的不可用,這時(shí)彈性?HTTP?請(qǐng)求機(jī)制就可以幫助我們,下面我們就來(lái)看看.NET?Core如何構(gòu)建一個(gè)彈性的HTTP請(qǐng)求機(jī)制吧2025-01-01

