.NET 8集成阿里云短信服务完全指南【短信接口】 - 详解
前言
在当今的互联网应用中,短信验证码、通知等功能已成为必不可少的部分。阿里云短信服务(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(
)
{
// 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 性能优化建议
- 使用
HttpClient
池化技术 - 实现短信发送限流,防止短时间内发送过多短信
- 使用缓存存储验证码,避免重复生成
- 实现异步发送队列,提高系统响应速度
六、安全注意事项
- 不要将
AccessKey
硬编码在代码中,使用安全的方式存储 - 实现短信发送频率限制,防止短信轰炸
- 验证码应该有有效期(通常5-10分钟)
- 对手机号进行格式验证和黑名单检查
- 敏感操作日志记录
七、总结
本文详细介绍了在.NET 8应用中集成阿里云短信服务的完整流程,包括:
- 阿里云短信服务的申请和配置
- .NET项目中SDK的集成
- 短信服务的封装实现
- 控制器的创建和测试
- 性能优化和安全注意事项
通过本文的指导,开发者可以快速在自己的.NET 8应用中实现短信发送功能,为应用增加短信验证、通知等能力。
参考:阿里云短信服务官方文档