Bitzsoft.Integrations.Sms
1.0.0-alpha.6
See the version list below for details.
dotnet add package Bitzsoft.Integrations.Sms --version 1.0.0-alpha.6
NuGet\Install-Package Bitzsoft.Integrations.Sms -Version 1.0.0-alpha.6
<PackageReference Include="Bitzsoft.Integrations.Sms" Version="1.0.0-alpha.6" />
<PackageVersion Include="Bitzsoft.Integrations.Sms" Version="1.0.0-alpha.6" />
<PackageReference Include="Bitzsoft.Integrations.Sms" />
paket add Bitzsoft.Integrations.Sms --version 1.0.0-alpha.6
#r "nuget: Bitzsoft.Integrations.Sms, 1.0.0-alpha.6"
#:package Bitzsoft.Integrations.Sms@1.0.0-alpha.6
#addin nuget:?package=Bitzsoft.Integrations.Sms&version=1.0.0-alpha.6&prerelease
#tool nuget:?package=Bitzsoft.Integrations.Sms&version=1.0.0-alpha.6&prerelease
Bitzsoft.Integrations.Sms
短信双通道集成 -- 阿里云短信 + 腾讯云短信统一抽象,一套接口切换两大云厂商。
功能
- 统一
ISMS接口,屏蔽阿里云与腾讯云 SDK 差异 - 支持
SendAsync异步发送,返回标准化SMSResult - 阿里云短信:基于 OpenPlatform POP 签名调用
- 腾讯云短信:基于腾讯云 API 3.0 签名调用
- Options 强类型配置,支持
IConfigurationSection绑定 - 独立 DI 注册,可按需引入单通道或双通道
安装
dotnet add package Bitzsoft.Integrations.Sms
或直接在项目文件中引用:
<PackageReference Include="Bitzsoft.Integrations.Sms" Version="*" />
配置
在 appsettings.json 中添加对应通道配置:
{
"AliyunSms": {
"AccessKeyId": "your-access-key-id",
"AccessKeySecret": "your-access-key-secret",
"RegionId": "cn-hangzhou",
"Domain": "dysmsapi.aliyuncs.com",
"Version": "2017-05-25"
},
"TencentSms": {
"SecretId": "your-secret-id",
"SecretKey": "your-secret-key",
"AppId": "1400xxxxxx",
"Region": "ap-guangzhou",
"CountryCode": "+86"
}
}
注册
阿里云短信通道
using Bitzsoft.Integrations.Sms.Aliyun;
// 方式一:通过 IConfigurationSection 绑定
builder.Services.AddAliyunSms(builder.Configuration.GetSection("AliyunSms"));
// 方式二:通过委托手动配置
builder.Services.AddAliyunSms(options =>
{
options.AccessKeyId = "your-access-key-id";
options.AccessKeySecret = "your-access-key-secret";
options.RegionId = "cn-hangzhou";
options.Domain = "dysmsapi.aliyuncs.com";
options.Version = "2017-05-25";
});
腾讯云短信通道
using Bitzsoft.Integrations.Sms.Tencent;
// 方式一:通过 IConfigurationSection 绑定
builder.Services.AddTencentSms(builder.Configuration.GetSection("TencentSms"));
// 方式二:通过委托手动配置
builder.Services.AddTencentSms(options =>
{
options.SecretId = "your-secret-id";
options.SecretKey = "your-secret-key";
options.AppId = "1400xxxxxx";
options.Region = "ap-guangzhou";
options.CountryCode = "+86";
});
第三方请求日志
⚠️ 机制说明:本连接器基于阿里云
aliyun-net-sdk-core与腾讯云TencentCloudAPI3.0SDK,HTTP 管道封装在各自 SDK 内部,无法用DelegatingHandler拦截(与 HttpClient 直连实现不同)。因此请求日志改由IRequestLogRecorder回调钩子实现——在短信发送包装层记录每次 API 调用,汇入与 HttpClient 拦截同一个日志管道(IRequestLogStore),由宿主统一持久化。
记录内容(每次短信 API 调用产生一条):
| 字段 | 取值 |
|---|---|
Provider |
Sms.Aliyun(阿里云通道)/ Sms.Tencent(腾讯云通道) |
Endpoint |
dysmsapi.aliyuncs.com(阿里云)/ sms.tencentcloudapi.com(腾讯云) |
Method |
SDK(非标准 HTTP 方法,标识为 SDK 管道调用) |
ApiName |
SendSms(发送动作) |
RequestBody / ResponseBody |
请求/响应 DTO 序列化(经 SensitiveFields 脱敏) |
StatusCode |
尽力而为(成功 200;SDK 抛异常时为空——见下方局限) |
Exception |
SDK 异常信息(含错误码) |
DurationMs |
本次调用耗时 |
局限(诚实声明):
- SDK 不暴露原始 HTTP 状态码与响应头,故无法像 HttpClient 拦截那样记录真实 HTTP
StatusCode/RequestHeaders,StatusCode仅为尽力而为(成功记200、异常时留空)。 - 仅本连接器实现的
SendSms发送动作会被记录;SDK 的其他能力(签名管理、模板审核、回执拉取等)本连接器未实现,不在记录范围。
// ① 默认:启用回调但不持久化(日志丢弃)
services.AddAliyunSms(options => { /* ... */ });
// 或
services.AddTencentSms(options => { /* ... */ });
// ② 持久化:宿主注册 IRequestLogStore 实现后,短信调用自动落库
// AddXxxSms 内部已注入 IRequestLogRecorder,宿主无需再额外挂载 handler
services.AddRequestLogging<MyRequestLogStore>(opts =>
{
opts.MaxBodyLength = 8192; // 单条正文截断上限
opts.SensitiveFields.Add("mySecret"); // 额外脱敏字段
});
services.AddAliyunSms(options => { /* ... */ });
自定义
IRequestLogStore实现(SqlSugar / Dapper / MongoDB)详见Bitzsoft.Integrations.RequestLogging。
使用
以下示例展示在业务服务中通过阿里云通道发送验证码短信:
using System.Text.Json;
using Bitzsoft.Integrations.Sms;
/// <summary>
/// 用户注册服务
/// </summary>
public class RegistrationService
{
private readonly ISMS _sms;
/// <summary>
/// 初始化注册服务实例
/// </summary>
/// <param name="sms">短信发送服务(由 DI 注入具体通道实现)</param>
public RegistrationService(ISMS sms)
{
_sms = sms;
}
/// <summary>
/// 发送手机验证码
/// </summary>
/// <param name="phoneNumber">目标手机号</param>
/// <param name="verificationCode">6 位数字验证码</param>
/// <param name="cancellationToken">取消令牌</param>
public async Task<bool> SendVerificationCodeAsync(
string phoneNumber,
string verificationCode,
CancellationToken cancellationToken = default)
{
var templateParams = JsonSerializer.Serialize(new { code = verificationCode });
SMSResult result = await _sms.SendAsync(
phoneNumber: phoneNumber,
signName: "我的应用",
templateCode: "SMS_123456789",
templateParams: templateParams,
cancellationToken: cancellationToken);
if (!result.Success)
{
// 记录失败日志,包含错误码与错误消息
Console.WriteLine(
"短信发送失败: ErrorCode={0}, ErrorMessage={1}",
result.ErrorCode,
result.ErrorMessage);
return false;
}
// 可将 result.BizId 存储用于后续状态查询
Console.WriteLine("短信发送成功, BizId={0}", result.BizId);
return true;
}
}
依赖
Microsoft.Extensions.Logging.Abstractions-- 日志抽象Microsoft.Extensions.Configuration.Abstractions-- 配置抽象Microsoft.Extensions.Options-- Options 配置模式Microsoft.Extensions.Options.ConfigurationExtensions-- 配置节点绑定aliyun-net-sdk-core-- 阿里云 OpenAPI SDKAliyun.OSS.SDK.NetCore-- 阿里云 SDK 基础依赖TencentCloudSDK-- 腾讯云短信 SDK
相关包
- Bitzsoft.Integrations.MFA -- 多因素认证集成(短信验证码通道)
- Bitzsoft.Integrations.CrawlingService -- 网页爬取服务集成客户端
- Bitzsoft.Integrations.Ocr -- OCR 文字识别集成
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 is compatible. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- Aliyun.OSS.SDK.NetCore (>= 2.14.1)
- aliyun-net-sdk-core (>= 1.6.2)
- Bitzsoft.Integrations.RequestLogging (>= 1.0.0-alpha.6)
- Microsoft.Extensions.Configuration.Abstractions (>= 10.0.9)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.9)
- Microsoft.Extensions.Options (>= 10.0.9)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 10.0.9)
- TencentCloudSDK (>= 3.0.1363)
-
net5.0
- Aliyun.OSS.SDK.NetCore (>= 2.14.1)
- aliyun-net-sdk-core (>= 1.6.2)
- Bitzsoft.Integrations.RequestLogging (>= 1.0.0-alpha.6)
- Microsoft.Extensions.Configuration.Abstractions (>= 5.0.0)
- Microsoft.Extensions.Logging.Abstractions (>= 5.0.0)
- Microsoft.Extensions.Options (>= 5.0.0)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 5.0.0)
- TencentCloudSDK (>= 3.0.1363)
-
net8.0
- Aliyun.OSS.SDK.NetCore (>= 2.14.1)
- aliyun-net-sdk-core (>= 1.6.2)
- Bitzsoft.Integrations.RequestLogging (>= 1.0.0-alpha.6)
- Microsoft.Extensions.Configuration.Abstractions (>= 10.0.9)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.9)
- Microsoft.Extensions.Options (>= 10.0.9)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 10.0.9)
- TencentCloudSDK (>= 3.0.1363)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on Bitzsoft.Integrations.Sms:
| Package | Downloads |
|---|---|
|
Bitzsoft.Integrations.All
Bitzsoft 第三方集成聚合包 — 包含全部 Integration 模块 |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.0.0-alpha.8 | 37 | 7/1/2026 |
| 1.0.0-alpha.7 | 63 | 6/16/2026 |
| 1.0.0-alpha.6 | 69 | 6/16/2026 |
| 1.0.0-alpha.5 | 60 | 6/14/2026 |
| 1.0.0-alpha.3 | 59 | 6/7/2026 |
| 1.0.0-alpha.2 | 60 | 5/29/2026 |
| 1.0.0-alpha.1 | 59 | 5/28/2026 |