.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)證
開通短信服務(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ù)庫或緩存中,并設(shè)置過期時(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ā)送過多短信
使用緩存存儲(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)
通過本文的指導(dǎo),開發(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)文章
Asp.net 連接MySQL的實(shí)現(xiàn)代碼[]
ASP.NET連接MySQL需要一個(gè)組件(.net本身不提供訪問MySQL的驅(qū)動(dòng))MySQL.Data.Dll,此為官方提供(純C#開發(fā),開源噢),有多個(gè)版本選擇,采用的數(shù)據(jù)訪問模式為ADO.NET,跟asp.net訪問sqlserver很像,非常簡(jiǎn)單。2009-08-08asp.net Google的translate工具翻譯 API
很久前的一天,我想使用這個(gè)東西,然后看了下,GooGle的Translate工具目前沒有公開API,還是一個(gè)逐漸完善的過程,另一方面,利用一段很小的程序就可以得到我們想要的效果。2008-12-12收集學(xué)習(xí)asp.net比較完整的面向?qū)ο箝_發(fā)流程
如果你已經(jīng)有較多的面向?qū)ο箝_發(fā)經(jīng)驗(yàn),跳過以下這兩步 第一步:掌握一門.NET面向?qū)ο笳Z言第二步:對(duì).NET Framework類庫有一定的了解;在具備了OO基礎(chǔ)之后,以下是具體的學(xué)習(xí)ASP.NET技術(shù)步驟2012-12-12Debian 8或Debian 9(64 位)安裝 .NET Core
這篇文章主要為大家詳細(xì)介紹了Debian 8或Debian 9(64 位)安裝 .NET Core,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03asp.net datalist綁定數(shù)據(jù)后可以上移下移實(shí)現(xiàn)示例
這篇文章主要介紹了asp.net datalist綁定數(shù)據(jù)后可以上移下移的示例代碼,需要的朋友可以參考下2014-02-02asp.net IList查詢數(shù)據(jù)后格式化數(shù)據(jù)再綁定控件
這篇文章送給.net初學(xué)者或者遇到類似問題的朋友,就是IList如何格式化數(shù)據(jù)再綁定,我看到網(wǎng)上沒有多少朋友講到這方面的最基本的問題,現(xiàn)在我簡(jiǎn)單說說吧,代碼我就截取其中一些講,如果不明白的朋友可以留言或者聯(lián)系我。2009-11-11