C# .NET 5.0+和腾讯云短信API实现自定义短信发送的完整解决方案
PhoneNumberSet = new[] { $"+86{phoneNumber}" }, // 国内号码示例TemplateParamSet = templateParams // 模板变量按序传入trythrow new SmsException($"短信发送失败:{ex.Message}");
·
一、环境配置与准备
-
腾讯云账号设置
-
在腾讯云控制台创建短信应用,获取
SdkAppId、SecretId和SecretKey -
申请国内短信签名(如企业名称或品牌标识)和自定义短信模板,需通过审核后方可使用
-
-
项目依赖
-
安装官方SDK(NuGet命令):
Install-Package TencentCloud.Sms -Version 3.0.0
-
二、自定义短信发送实现
核心代码示例
using TencentCloud.Common;
using TencentCloud.Common.Profile;
using TencentCloud.Sms.V20210111;
using TencentCloud.Sms.V20210111.Models;
public class CustomSmsSender
{
private readonly string _secretId;
private readonly string _secretKey;
private readonly string _sdkAppId;
private readonly string _signature;
public CustomSmsSender(string secretId, string secretKey, string sdkAppId, string signature)
{
_secretId = secretId;
_secretKey = secretKey;
_sdkAppId = sdkAppId;
_signature = signature;
}
public async Task<bool> SendCustomSmsAsync(string phoneNumber, string templateId, params string[] templateParams)
{
var cred = new Credential { SecretId = _secretId, SecretKey = _secretKey };
var clientProfile = new ClientProfile();
clientProfile.HttpProfile.Endpoint = "sms.tencentcloudapi.com";
using var client = new SmsClient(cred, "ap-guangzhou", clientProfile);
var request = new SendSmsRequest
{
PhoneNumberSet = new[] { $"+86{phoneNumber}" }, // 国内号码示例
SmsSdkAppId = _sdkAppId,
SignName = _signature,
TemplateId = templateId,
TemplateParamSet = templateParams // 模板变量按序传入
};
try
{
var response = await client.SendSms(request);
var status = response.SendStatusSet.FirstOrDefault();
return status?.Code == "Ok";
}
catch (Exception ex)
{
throw new SmsException($"短信发送失败:{ex.Message}");
}
}
}
三、关键配置说明
| 参数 | 说明 | 注意点 |
|---|---|---|
PhoneNumberSet |
使用国际标准格式(如+8618012345678),避免缺少国家码导致发送失败 |
需验证手机号有效性 |
TemplateParamSet |
动态参数数组,需与模板中定义的{1}、{2}等占位符顺序匹配 |
参数类型需符合模板要求 |
Region |
地域编码需与短信应用创建时选择的地域一致(如ap-guangzhou代表广州) |
错误配置会导致API调用失败 |
SignName |
签名内容需与审核通过的文本完全一致(如【腾讯云】) |
包含括号时需完整保留 |
四、典型问题处理
-
模板参数不匹配
-
检查模板中变量数量是否与代码传入的参数数组长度一致
-
验证参数类型(例如验证码应为纯数字,时间字段应为
"5分钟"格式)
-
-
发送频率限制
-
腾讯云默认限制同一手机号30秒内不可重复接收相同内容短信,可通过控制台调整频率策略
-
-
签名未生效
-
确保签名已通过审核且状态为“已通过”,海外短信需单独申请对应地域的签名
-
五、服务调用示例
// 初始化服务(建议通过DI容器注入配置)
var smsSender = new CustomSmsSender(
secretId: "xxxx",
secretKey: "xxxx",
sdkAppId: "xxxx",
signature: "腾讯云"
);
// 发送自定义模板短信(模板ID需已审核)
var success = await smsSender.SendCustomSmsAsync(
phoneNumber: "xxxxxxxxxxxx",
templateId: "12345", // 自定义模板ID
templateParams: new[] { "A1234", "2025-05-13" } // 替换模板中的占位符
);
注:若需发送海外短信,需单独申请国际/港澳台短信签名和模板,并调整
PhoneNumberSet中的国家码。
更多推荐
所有评论(0)