.NET 8集成阿里云短信服务完全指南【短信接口】 - 详解


在这里插入图片描述

前言

在当今的互联网应用中,短信验证码、通知等功能已成为必不可少的部分。阿里云短信服务(SMS)作为国内领先的短信平台,提供了稳定可靠的短信发送能力。本文将详细介绍如何在.NET 8应用中集成阿里云短信服务,实现短信发送功能。

一、准备工作

1.1 阿里云账号准备

  1. 注册阿里云账号并完成实名认证
  2. 开通短信服务(SMS)
  3. 申请短信签名和模板(需企业资质)
  4. 获取 AccessKey IDAccessKey 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 性能优化建议

  1. 使用 HttpClient 池化技术
  2. 实现短信发送限流,防止短时间内发送过多短信
  3. 使用缓存存储验证码,避免重复生成
  4. 实现异步发送队列,提高系统响应速度

六、安全注意事项

  1. 不要将 AccessKey硬编码在代码中,使用安全的方式存储
  2. 实现短信发送频率限制,防止短信轰炸
  3. 验证码应该有有效期(通常5-10分钟)
  4. 对手机号进行格式验证和黑名单检查
  5. 敏感操作日志记录

七、总结

本文详细介绍了在.NET 8应用中集成阿里云短信服务的完整流程,包括:

  1. 阿里云短信服务的申请和配置
  2. .NET项目中SDK的集成
  3. 短信服务的封装实现
  4. 控制器的创建和测试
  5. 性能优化和安全注意事项

通过本文的指导,开发者可以快速在自己的.NET 8应用中实现短信发送功能,为应用增加短信验证、通知等能力。

参考:阿里云短信服务官方文档

posted @ 2025-07-15 11:18  yjbjingcha  阅读(19)  评论(0)    收藏  举报