阿里云短信需TemplateCode和TemplateParam严格匹配审核模板,腾讯云需Endpoint与Region一致;内容含未备案URL会被静默拦截;SDK须适配TLS 1.2,变量需前置校验。

阿里云短信 SDK 的 SendSmsRequest 必须设 TemplateCode 和 TemplateParam
不填或格式错,直接报 InvalidParameter.TemplateCode 或 InvalidParameter.TemplateParam。阿里云强制要求模板审核通过后才能用,不能临时拼接内容。
实操建议:
-
TemplateCode是控制台申请后分配的固定字符串(如SMST_123456789),不是模板 ID 或名称 -
TemplateParam必须是合法 JSON 字符串,且字段名要和模板里定义的占位符完全一致(比如模板写的是{code},就得传{"code":"123456"}) - 别用
Newtonsoft.Json直接序列化匿名对象再塞进去——容易多出引号或转义异常,老实用JsonConvert.SerializeObject(new { code = "123456" }) - 签名
SignName也得是审核通过的,大小写、空格、标点都得一模一样
腾讯云 SmsClient.SendSms 要提前配置 Endpoint 和 Credential
常见错误是只填了 SecretId/SecretKey,但没设 Endpoint,结果默认连到广州区,而你的签名/模板只在成都区审核通过,返回 InvalidParameterValue.SignatureIncorrect。
实操建议:
-
Endpoint必须显式指定,例如https://sms.tencentcloudapi.com,不能依赖 SDK 默认值 -
Credential中的Region参数必须和你申请签名/模板的地域一致(如ap-chengdu),否则权限校验失败 - 测试时先用腾讯云控制台的「API 调试工具」跑通一次,复制生成的完整请求参数,再反推 C# 里怎么构造
SendSmsRequest - 别把
PhoneNumberSet写成单个手机号字符串,它必须是string[],哪怕只发一个也要包成数组
验证码类短信发不出?检查 Content 是否被自动过滤
阿里云和腾讯云都不允许在短信正文里出现未备案的 URL、联系方式、营销话术。哪怕你用模板变量传入,只要最终渲染结果含 http:// 或 www.,就会静默拦截,日志里只显示 Ok,但用户收不到。
实操建议:
- 模板里别写“点击链接重置密码”,改用“验证码有效期5分钟”这类纯提示语
- 所有变量值在传入前做基础校验:
code只含数字、minutes是整数、不含空格和特殊符号 - 阿里云控制台的「短信发送记录」里查状态为
success但接收方没收到,大概率是内容触发了风控,不是代码问题 - 腾讯云可在控制台开启「短信日志投递」到 CLS,比 SDK 返回的
SendStatusSet更早暴露过滤原因
本地调试时 HttpRequestException 或证书错误
.NET Core 3.1+ 默认禁用不安全协议,而部分老版阿里云 SDK(如 AlibabaCloud.SDK.Dysmsapi20170525 v1.x)仍依赖 TLS 1.0/1.1,会抛 AuthenticationException: The remote certificate is invalid。
实操建议:
- 优先升级 SDK:阿里云推荐用
AlibabaCloud.SDK.Core+AlibabaCloud.SDK.Dysmsapi最新版(v2+),已默认适配 TLS 1.2 - 腾讯云 SDK(
TencentCloud.Common)需确保 .NET 运行时 ≥ 4.7.2 或 .NET Core ≥ 2.1,否则手动加ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 - 别在生产环境用
HttpClientHandler.ServerCertificateCustomValidationCallback = (a,b,c,d) => true绕过证书校验——这是安全红线 - 如果公司内网有代理,
HttpClient实例必须显式传入WebProxy,否则请求卡死无报错
最麻烦的不是调不通,而是发出去了却收不到——这时候八成是模板内容、签名地域、变量格式三者中有一个对不上控制台备案信息。盯着控制台里的「已审核通过」那几行字逐字核对,比改代码快得多。


















