陈欧 發表於 2025-6-6 09:13:04

.NET8集成阿里云短信服务实现短信发送功能

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">前言</a></li><li><a href="#_label1">一、准备工作</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_0">1.1 阿里云账号准备</a></li><li><a href="#_lab2_1_1">1.2 .NET 8项目创建</a></li></ul><li><a href="#_label2">二、集成阿里云短信SDK</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_2">2.1 安装NuGet包</a></li><li><a href="#_lab2_2_3">2.2 配置阿里云短信参数</a></li><li><a href="#_lab2_2_4">2.3 创建配置类</a></li></ul><li><a href="#_label3">三、实现短信发送服务</a></li><ul class="second_class_ul"><li><a href="#_lab2_3_5">3.1 创建短信服务接口</a></li><li><a href="#_lab2_3_6">3.2 实现短信服务</a></li><li><a href="#_lab2_3_7">3.3 注册服务</a></li></ul><li><a href="#_label4">四、创建控制器</a></li><ul class="second_class_ul"></ul><li><a href="#_label5">五、测试与优化</a></li><ul class="second_class_ul"><li><a href="#_lab2_5_8">5.1 单元测试</a></li><li><a href="#_lab2_5_9">5.2 性能优化建议</a></li></ul><li><a href="#_label6">六、安全注意事项</a></li><ul class="second_class_ul"></ul><li><a href="#_label7">七、总结</a></li><ul class="second_class_ul"></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>前言</h2>
<p>在当今的互联网应用中,短信验证码、通知等功能已成为必不可少的部分。阿里云短信服务(SMS)作为国内领先的短信平台,提供了稳定可靠的短信发送能力。本文将详细介绍如何在.NET 8应用中集成阿里云短信服务,实现短信发送功能。</p>
<p class="maodian"><a name="_label1"></a></p><h2>一、准备工作</h2>
<p class="maodian"><a name="_lab2_1_0"></a></p><h3>1.1 阿里云账号准备</h3>
<p>注册阿里云账号并完成实名认证</p>
<p>开通短信服务(SMS)</p>
<p>申请短信签名和模板(需企业资质)</p>
<p>获取 AccessKey ID 和 AccessKey Secret</p>
<p class="maodian"><a name="_lab2_1_1"></a></p><h3>1.2 .NET 8项目创建</h3>
<div class="jb51code"><pre class="brush:bash;">dotnet new webapi -n AliyunSmsDemo
cd AliyunSmsDemo
</pre></div>
<p class="maodian"><a name="_label2"></a></p><h2>二、集成阿里云短信SDK</h2>
<p class="maodian"><a name="_lab2_2_2"></a></p><h3>2.1 安装NuGet包</h3>
<div class="jb51code"><pre class="brush:bash;">dotnet add package Aliyun.SDK.Core
dotnet add package Aliyun.SDK.Dysmsapi
</pre></div>
<p class="maodian"><a name="_lab2_2_3"></a></p><h3>2.2 配置阿里云短信参数</h3>
<p>在 appsettings.json 中添加配置:</p>
<div class="jb51code"><pre class="brush:json;">{
"AliyunSms": {
    "AccessKeyId": "your-access-key-id",
    "AccessKeySecret": "your-access-key-secret",
    "Endpoint": "dysmsapi.aliyuncs.com",
    "SignName": "your-sign-name",
    "TemplateCode": "your-template-code"
}
}
</pre></div>
<p class="maodian"><a name="_lab2_2_4"></a></p><h3>2.3 创建配置类</h3>
<div class="jb51code"><pre class="brush:csharp;">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; }
}
</pre></div>
<p class="maodian"><a name="_label3"></a></p><h2>三、实现短信发送服务</h2>
<p class="maodian"><a name="_lab2_3_5"></a></p><h3>3.1 创建短信服务接口</h3>
<div class="jb51code"><pre class="brush:csharp;">public interface ISmsService
{
    Task&lt;bool&gt; SendVerificationCodeAsync(string phoneNumber, string code);
}
</pre></div>
<p class="maodian"><a name="_lab2_3_6"></a></p><h3>3.2 实现短信服务</h3>
<div class="jb51code"><pre class="brush:csharp;">public class AliyunSmsService : ISmsService
{
    private readonly AliyunSmsSettings _settings;
    private readonly ILogger&lt;AliyunSmsService&gt; _logger;

    public AliyunSmsService(IOptions&lt;AliyunSmsSettings&gt; settings, ILogger&lt;AliyunSmsService&gt; logger)
    {
      _settings = settings.Value;
      _logger = logger;
    }

    public async Task&lt;bool&gt; SendVerificationCodeAsync(string phoneNumber, string code)
    {
      try
      {
            var client = CreateClient();
            var request = new SendSmsRequest
            {
                PhoneNumbers = phoneNumber,
                SignName = _settings.SignName,
                TemplateCode = _settings.TemplateCode,
                TemplateParam = $"{{\"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);
    }
}
</pre></div>
<p class="maodian"><a name="_lab2_3_7"></a></p><h3>3.3 注册服务</h3>
<p>在 Program.cs 中添加:</p>
<div class="jb51code"><pre class="brush:csharp;">builder.Services.Configure&lt;AliyunSmsSettings&gt;(builder.Configuration.GetSection("AliyunSms"));
builder.Services.AddTransient&lt;ISmsService, AliyunSmsService&gt;();
</pre></div>
<p class="maodian"><a name="_label4"></a></p><h2>四、创建控制器</h2>
<div class="jb51code"><pre class="brush:csharp;">
")]
public class SmsController : ControllerBase
{
    private readonly ISmsService _smsService;
    private readonly ILogger&lt;SmsController&gt; _logger;

    public SmsController(ISmsService smsService, ILogger&lt;SmsController&gt; logger)
    {
      _smsService = smsService;
      _logger = logger;
    }

   
    public async Task&lt;IActionResult&gt; SendVerificationCode( SendVerificationCodeRequest request)
    {
      // 生成随机验证码(实际项目中可能需要更复杂的生成逻辑)
      var code = new Random().Next(100000, 999999).ToString();
      
      // 发送短信
      var result = await _smsService.SendVerificationCodeAsync(request.PhoneNumber, code);
      
      if (result)
      {
            // 实际项目中应该将验证码存储到数据库或缓存中,并设置过期时间
            _logger.LogInformation($"验证码发送成功: ");
            return Ok(new { Success = true, Message = "验证码发送成功" });
      }
      
      return BadRequest(new { Success = false, Message = "验证码发送失败" });
    }
}

public class SendVerificationCodeRequest
{
   
   
    public string PhoneNumber { get; set; }
}
</pre></div>
<p class="maodian"><a name="_label5"></a></p><h2>五、测试与优化</h2>
<p class="maodian"><a name="_lab2_5_8"></a></p><h3>5.1 单元测试</h3>
<div class="jb51code"><pre class="brush:csharp;">
public async Task SendVerificationCode_ShouldReturnSuccess_WhenSmsSent()
{
    // Arrange
    var mockSmsService = new Mock&lt;ISmsService&gt;();
    mockSmsService.Setup(x =&gt; x.SendVerificationCodeAsync(It.IsAny&lt;string&gt;(), It.IsAny&lt;string&gt;()))
               .ReturnsAsync(true);
   
    var controller = new SmsController(mockSmsService.Object, Mock.Of&lt;ILogger&lt;SmsController&gt;&gt;());
    var request = new SendVerificationCodeRequest { PhoneNumber = "13800138000" };
   
    // Act
    var result = await controller.SendVerificationCode(request);
   
    // Assert
    var okResult = Assert.IsType&lt;OkObjectResult&gt;(result);
    var response = Assert.IsType&lt;dynamic&gt;(okResult.Value);
    Assert.True(response.Success);
}
</pre></div>
<p class="maodian"><a name="_lab2_5_9"></a></p><h3>5.2 性能优化建议</h3>
<p>使用 HttpClient 池化技术</p>
<p>实现短信发送限流,防止短时间内发送过多短信</p>
<p>使用缓存存储验证码,避免重复生成</p>
<p>实现异步发送队列,提高系统响应速度</p>
<p class="maodian"><a name="_label6"></a></p><h2>六、安全注意事项</h2>
<p>不要将 AccessKey硬编码在代码中,使用安全的方式存储</p>
<p>实现短信发送频率限制,防止短信轰炸</p>
<p>验证码应该有有效期(通常5-10分钟)</p>
<p>对手机号进行格式验证和黑名单检查</p>
<p>敏感操作日志记录</p>
<p class="maodian"><a name="_label7"></a></p><h2>七、总结</h2>
<p>本文详细介绍了在.NET 8应用中集成阿里云短信服务的完整流程,包括:</p>
<ul><li>阿里云短信服务的申请和配置</li><li>.NET项目中SDK的集成</li><li>短信服务的封装实现</li><li>控制器的创建和测试</li><li>性能优化和安全注意事项</li></ul>
<p>通过本文的指导,开发者可以快速在自己的.NET 8应用中实现短信发送功能,为应用增加短信验证、通知等能力。</p>
頁: [1]
查看完整版本: .NET8集成阿里云短信服务实现短信发送功能