文章目錄
- 前言
- 一、準備工作
- 1.1 阿里云賬號準備
- 1.2 .NET 8項目創建
- 二、集成阿里云短信SDK
- 2.1 安裝NuGet包
- 2.2 配置阿里云短信參數
- 2.3 創建配置類
- 三、實現短信發送服務
- 3.1 創建短信服務接口
- 3.2 實現短信服務
- 3.3 注冊服務
- 四、創建控制器
- 五、測試與優化
- 5.1 單元測試
- 5.2 性能優化建議
- 六、安全注意事項
- 七、總結
前言
在當今的互聯網應用中,短信驗證碼、通知等功能已成為必不可少的部分。阿里云短信服務(SMS)作為國內領先的短信平臺,提供了穩定可靠的短信發送能力。本文將詳細介紹如何在.NET 8應用中集成阿里云短信服務,實現短信發送功能。
一、準備工作
1.1 阿里云賬號準備
- 注冊阿里云賬號并完成實名認證
- 開通短信服務(SMS)
- 申請短信簽名和模板(需企業資質)
- 獲取
AccessKey ID
和AccessKey Secret
1.2 .NET 8項目創建
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 配置阿里云短信參數
在 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 創建配置類
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; }
}
三、實現短信發送服務
3.1 創建短信服務接口
public interface ISmsService
{Task<bool> SendVerificationCodeAsync(string phoneNumber, string code);
}
3.2 實現短信服務
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($"短信發送結果: {JsonSerializer.Serialize(response)}");return response.Body.Code == "OK";}catch (Exception ex){_logger.LogError(ex, "發送短信時發生異常");return false;}}private DysmsapiClient CreateClient(){var config = new Config{AccessKeyId = _settings.AccessKeyId,AccessKeySecret = _settings.AccessKeySecret,Endpoint = _settings.Endpoint};return new DysmsapiClient(config);}
}
3.3 注冊服務
在 Program.cs
中添加:
builder.Services.Configure<AliyunSmsSettings>(builder.Configuration.GetSection("AliyunSms"));
builder.Services.AddTransient<ISmsService, AliyunSmsService>();
四、創建控制器
[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){// 生成隨機驗證碼(實際項目中可能需要更復雜的生成邏輯)var code = new Random().Next(100000, 999999).ToString();// 發送短信var result = await _smsService.SendVerificationCodeAsync(request.PhoneNumber, code);if (result){// 實際項目中應該將驗證碼存儲到數據庫或緩存中,并設置過期時間_logger.LogInformation($"驗證碼發送成功: {code}");return Ok(new { Success = true, Message = "驗證碼發送成功" });}return BadRequest(new { Success = false, Message = "驗證碼發送失敗" });}
}public class SendVerificationCodeRequest
{[Required][Phone]public string PhoneNumber { get; set; }
}
五、測試與優化
5.1 單元測試
[Fact]
public async Task SendVerificationCode_ShouldReturnSuccess_WhenSmsSent()
{// Arrangevar 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" };// Actvar result = await controller.SendVerificationCode(request);// Assertvar okResult = Assert.IsType<OkObjectResult>(result);var response = Assert.IsType<dynamic>(okResult.Value);Assert.True(response.Success);
}
5.2 性能優化建議
- 使用
HttpClient
池化技術 - 實現短信發送限流,防止短時間內發送過多短信
- 使用緩存存儲驗證碼,避免重復生成
- 實現異步發送隊列,提高系統響應速度
六、安全注意事項
- 不要將
AccessKey
硬編碼在代碼中,使用安全的方式存儲 - 實現短信發送頻率限制,防止短信轟炸
- 驗證碼應該有有效期(通常5-10分鐘)
- 對手機號進行格式驗證和黑名單檢查
- 敏感操作日志記錄
七、總結
本文詳細介紹了在.NET 8應用中集成阿里云短信服務的完整流程,包括:
- 阿里云短信服務的申請和配置
- .NET項目中SDK的集成
- 短信服務的封裝實現
- 控制器的創建和測試
- 性能優化和安全注意事項
通過本文的指導,開發者可以快速在自己的.NET 8應用中實現短信發送功能,為應用增加短信驗證、通知等能力。
參考:阿里云短信服務官方文檔