Skip to content
Bitzsoft.Integrationsbitzsoft.integrations

Reference

短信包

短信单体包概述——阿里云、腾讯云、华为云、Twilio、Vonage、云片 6 家供应商在一个 NuGet 包内,ISMS 接口与配置。

Last updated

短信域是单体包结构——6 家短信供应商(阿里云、腾讯云、华为云、Twilio、Vonage、云片)全部在 Bitzsoft.Integrations.Sms 一个 NuGet 包内,而非每家供应商一个包。这是因为短信接口极简(一个 SendAsync 方法),拆分收益不大。

ISMS 接口

public interface ISMS
{
string ProviderName { get; }
Task<SMSResult> SendAsync(SmsMessage message, CancellationToken cancellationToken = default);
}

SmsMessage

字段说明
PhoneNumbers手机号列表
SignName短信签名
TemplateCode模板编号
TemplateParams模板参数(键值对)

SMSResult

字段说明
Success是否成功
RequestId请求 ID(追踪用)
BizId短信发送流水号
ErrorCode错误码
ErrorMessage错误消息

6 家供应商配置一览

供应商DI 注册方法配置类鉴权字段
阿里云AddAliyunSmsAliyunSmsOptionsAccessKeyId + AccessKeySecret + RegionId
腾讯云AddTencentSmsTencentSmsOptionsSecretId + SecretKey + AppId + Region
华为云AddHuaweiSmsHuaweiSmsOptionsAppKey + AppSecret + Endpoint + Sender
TwilioAddTwilioSmsTwilioSmsOptionsAccountSid + AuthToken + From
VonageAddVonageSmsVonageSmsOptionsApiKey + ApiSecret + From
云片AddYunpianSmsYunpianSmsOptionsApiKey + Domain

配置与注册示例(阿里云)

{
"Sms": {
"Aliyun": {
"AccessKeyId": "LTAIxxxxxxxx",
"AccessKeySecret": "your-secret-key",
"RegionId": "cn-hangzhou"
}
}
}
builder.Services.AddAliyunSms(options =>
{
options.AccessKeyId = "LTAIxxxxxxxx";
options.AccessKeySecret = "your-secret-key";
options.RegionId = "cn-hangzhou";
});

使用示例

public class SmsService(ISMS sms)
{
public async Task<SMSResult> SendVerificationCodeAsync(string phone, string code)
{
return await sms.SendAsync(new SmsMessage
{
PhoneNumbers = new() { phone },
SignName = "Bitzsoft",
TemplateCode = "SMS_123456789",
TemplateParams = new() { ["code"] = code },
});
}
}

为什么是单体包

短信接口只有一个 SendAsync,各家供应商实现差异仅在签名方式和 API 端点。拆成 6 个包的收益不足以覆盖包管理成本。与 TeamWork(15 个能力接口、能力差异巨大)的多包结构形成对比。

已知限制

  • 国内供应商(阿里云/腾讯云/华为云/云片)需要预先审批签名和模板。
  • 国际供应商(Twilio/Vonage)支持任意文本内容,但需购买号码。
  • 华为云的 Endpoint 含端口(如 smsapi.cn-north-4.myhuaweicloud.com:443)。

相关

100%

滚轮或按钮缩放 · 放大后拖动画面 · 双击切换 100% / 200%