Table of Contents
------------------------------------具备短信开通资格-------------------------
注册(登录)腾讯云平台账号
认证账号(企业认证)
---------------------------------在控制台测试发送短信是否成功------------------
开通短信服务功能
申请短信签名
申请短信模板
-----------------------------------开始c#编程,选用 API 或 .Net SDK 方式编程-----
创建应用,获取SDKAppID
创建SecretId和SecretKey
控制台群发短信测试:https://console.cloud.tencent.com/smsv2/csms-mass-send/detail/1400461724/911756
API or SDK
20210111版源代码参考:https://cloud.tencent.com/document/product/382/43198
控制台短信发送之签名生成过程:https://console.cloud.tencent.com/api/explorer?Product=cvm&Version=2017-03-12&Action=DescribeZones&SignVersion=
控制台提供的短信发送api错误码说明文档:https://cloud.tencent.com/api/error-center?sub_group=basic-communication&page=2
c# .Net 5.x 调用腾讯云最新签名方法v3 TC3-HMAC-SHA256发送短信
购买买国内短信连接:https://cloud.tencent.com/act/pro/csms?from=12055
控制台购买短信包链接:https://console.cloud.tencent.com/smsv2/manage-package
1.简介
1.企业认证用户可以发送短信验证码、短信通知、营销短信等。
2.个人认证用户只能发送短信验证码、短信通知等,不能用于营销短信;
腾讯云短信发送方式(任选一种)
1.控制台(客户使用,直接在控制台发送短信)
2.API(程序开发者使用)
3.SDKs(程序开发者使用)-依赖环境:.NET Framework 4.5+ 或者 .NET Core 2.1
https://cloud.tencent.com/document/sdk/.NET
https://cloud.tencent.com/product/sms/getting-started
https://github.com/tencentcloud/tencentcloud-sdk-dotnet
https://github.com/TencentCloud/tencentcloud-sdk-dotnet-intl-en
1.首次开通短信服务流程
第 1 步:登录控制台
登录 短信控制台。如果没有腾讯云账号,请参考 账号注册教程。
第 2 步:企业认证
如果您的账号未实名认证,请到 账户信息中心 进行实名认证,具体操作参照 实名认证指引。
注意:个人认证用户只能发送短信验证码、短信通知等,不能用于营销短信;企业认证用户可以发送短信验证码、短信通知、营销短信等。
第 3 步:开通短信服务
如果您已经通过实名认证,单击开始接入。
申请开通短信服务、创建短信签名、短信模板图文界面: https://mp.weixin.qq.com/s/Iew4UyQ4yZIPuxpu5BhRWw
第 4 步:发送前准备
添加应用:添加应用获取 SDK AppID 和 App Key。详细操作请参阅 添加应用文档。添加应用后每月将获得100条免费短信,免费短信用完之后请购买短信套餐包,以免影响继续使用。
创建签名:一个完整的短信由短信签名和短信正文内容两部分组成,短信签名规则详见 签名审核标准,详细操作请参阅 国内短信-创建签名、国际/港澳台短信-创建签名。
创建正文模版:短信正文模版规则详见 正文模板审核标准,详细操作请参阅 国内短信-创建正文模版、国际/港澳台短信-创建正文模板。
第 5 步:发送短信
正文模板和短信签名都通过审核后,才可以开始发送短信。
发送短信方式有种:通过控制台、云短信 API 或 SDK 发送短信。
控制台发送文本短信详细流程请参阅 发送文本短信。
API 发送短信请参阅 API 文档,需要 SMPP 接入请 提交申请。
SDK 发送短信请参阅 SDK 文档。
detail:https://cloud.tencent.com/product/sms/getting-started
2.第一次开通短信服务
(1)在腾讯云平台申请注册一个账号;
(2)登录腾讯云账号并企业信息实名认证(记住自己的SDK AppID和App Key )
(3)申请自己的短信签名和创建自己的短信模版。这两项需要腾讯云官方的审核。
(3)申请开通短信服务
上传企业营业执照
(4)创建短信模板
等待短信模板审核通过
3.第一次短信接入流程详细步骤
step 1.注册腾讯云账号
短信功能在腾讯云控制台->云信通->短信 里面。所以首先得有一个腾讯云账号。
账号注册教程:https://cloud.tencent.com/document/product/378/17985
注册腾讯云提供了4种注册方式,我们选择用微信服务号来注册.因为微信服务号已经认证过,可以省去重新认证一次的麻烦。
注册方式 | 描述 |
---|---|
微信扫码快速注册 | 使用您的微信扫码快速注册腾讯云,后续您可以使用微信扫码登录腾讯云。 |
邮箱注册 | 使用邮箱注册腾讯云,方便企业客户维护账号。 |
QQ 注册 | 使用您已有的 QQ 帐号注册腾讯云,直接用 QQ 帐号快捷登录腾讯云。 |
微信公众号注册 | 使用您已有的公众号注册腾讯云。 |
说明:用公众绑定的小程序也可以扫描注册成功。
微信公众号注册:用微信公众号注册一个 腾讯云账号
step 1.1:使用微信公众号注册
进入 腾讯云官网 首页
使用微信公众号注册
进入 腾讯云官网 首页,单击页面右上角【免费注册】。
在页面右侧“其他注册方式”中单击【微信公众号】,前往微信公众平台进行账号授权。
使用公众平台绑定的管理员个人微信号,微信扫描公众平台帐号授权页面的二维码。
微信进入登录授权页面,请确认您要登录到腾讯云的公众号。可单击“修改权限集”查看授权说明。
页面跳转到注册或关联账号,单击【注册新账号】,请阅读《腾讯云服务协议》和《腾讯云隐私声明》后单击【下一步】。
使用手机微信扫码关注腾讯云助手,或单击【暂不关注】。
注册完成。您可以继续完成实名认证或完善行业信息
使用公众平台绑定的管理员个人微信号扫描
账号提示
您的微信公众账号已注册或关联腾讯云账号,无须再次注册。您可立即登录腾讯云,或使用其他方式进行注册。
控制台显示:
您已完成企业实名认证
https://console.cloud.tencent.com/developer/auth
step 2.企业实名认证
类型 | 个人实名认证 | 企业实名认证 |
---|---|---|
适用对象 | 个人 | 企业、政府、事业单位、学校、组织等 |
账号归属 | 个人 | 企业 |
支持认证方式 |
|
|
实名区别 |
|
|
操作指引 | 个人实名认证指引 | 企业实名认证指引 |
detail:https://cloud.tencent.com/document/product/378/3629
第一开发前的准备工作
Step 1:申请接入短信服务
【腾讯科技】您的QQ登录验证码是1234,5分钟内有效。
对于上述示例,发送短信前,需完成以下操作:
申请【签名内容】为腾讯科技的短信签名。
申请【短信内容】为
您的QQ登录验证码是{1},{2}分钟内有效。
的短信正文模板,其中{1}和{2}是实际下发短信时自定义的参数。
detail:https://cloud.tencent.com/document/product/382/13299
Step 2:创建短信签名
驳回原因:签名类型为公司名,请使用与上传的营业执照(或组织机构代码证)上一致的公司全称或简称申请签名。如有其他疑问可联系腾讯云短信技术支持(QQ:3012203387)。
第1次选的签名类型为公司,签名需要和营业执照上的公司名称一样。
第2次改为:
签名类型:公众号
签名:公众号名称
Step 3:创建短信内容模板
驳回原因:短信内容模版不够详细,请完善内容5 后重新提交。如有疑问可联系腾讯云短信技术支持(QQ:3012203387)。
创建短信签名
https://cloud.tencent.com/document/product/382/37794
正文模板
https://cloud.tencent.com/document/product/382/39031
step 3:创建应用,获取SDKAppID
https://console.cloud.tencent.com/smsv2/app-manage
step 4:创建SecretId和SecretKey
code
SecretId:用于标识 API 调用者身份,可以简单类比为用户名。
SecretKey:用于验证 API 调用者的身份,可以简单类比为密码。
SecretId和SecretKey的获取
https://console.cloud.tencent.com/cam/capi
用管理员 微信 雾**花 登录
访问管理->API密钥管理->新建密钥,获取
999999999999999999
APPID | 密钥 | 创建时间 | 最近访问时间 | 状态 | 操作 |
---|
1258299871 | SecretId: AKIDXE SecretKey: wbYz92ey2pLaYFf | 2021-06-05 03:13:15 | 2021-06-06 | 已启用 |
https://cloud.tencent.com/document/sdk/.NET
2.登录流程
step 1:打开腾讯云平台首页
step 2:点击登录,进入登录页面
step 3:用小程序公众号方式登录
选择“其他登录方式”
step 4:用微信服务号绑定的管理员 微信登录
1。先用 微信号 雾**花
2.然后选择 小程序 “wjl助手”
code
SMS相关接口API:https://cloud.tencent.com/document/product/382/52077
SMS接口业务逻辑相关的错误码:https://cloud.tencent.com/document/api/382/55981#6.-.E9.94.99.E8.AF.AF.E7.A0.81
4.API(程序开发者使用)
4.1 C# 调用腾讯云的短信发送服务API发送验证码
参数实体类:SendCode
namespace ConsoleApp3
{
/// <summary>
/// 参数类
/// </summary>
class SendCode
{
public string Ext { get; set; }
public string Extend { get; set; }
public string[] Params { get; set; }
public string Sig { get; set; }
public string Sign { get; set; }
public Phone Tel { get; set; }
public string Time { get; set; }
public string Tpl_id { get; set; }
}
/// <summary>
/// 电话参数
/// </summary>
class Phone
{
public string Mobile { get; set; }
public string Nationcode { get; set; }
}
}
静态方法类:StaticClass
using System;
using System.IO;
using System.Net;
using System.Security.Cryptography;
using System.Text;
namespace ConsoleApp3
{
public static class StaticClass
{
/// <summary>
/// 返回指定个数的随机数
/// </summary>
/// <param name="length">个数</param>
/// <returns>随机数</returns>
public static string GenerateRandomCode(int length)
{
var result = new StringBuilder();
for (var i = 0; i < length; i++)
{
var r = new Random(Guid.NewGuid().GetHashCode());
result.Append(r.Next(0, 10));
}
return result.ToString();
}
/// <summary>
/// 获取时间戳格式
/// </summary>
/// <param name="flg">多少位的时间戳</param>
/// <returns>时间戳</returns>
public static long GetTimeStamp(int flg)
{
long time = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
switch (flg)
{
case 10:
time = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
break;
case 13:
DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1, 0, 0, 0, 0));
time = (DateTime.Now.Ticks - startTime.Ticks) / 10000;
break;
}
return time;
}
/// <summary>
/// Sha256加密算法
/// </summary>
/// <param name="data">加密的内容</param>
/// <returns>加密后的数据</returns>
public static string Sha256(string data)
{
byte[] bytes = Encoding.UTF8.GetBytes(data);
StringBuilder builder = new StringBuilder();
for (int i = 0; i < SHA256.Create().ComputeHash(bytes).Length; i++)
{
builder.Append(SHA256.Create().ComputeHash(bytes)[i].ToString("X2"));
}
return builder.ToString();
}
/// <summary>
/// post请求
/// </summary>
/// <param name="url">地址</param>
/// <param name="postdata">参数</param>
/// <returns>返回内容</returns>
public static string HttpPost(string url, string postdata)
{
string result = "";
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
req.Referer = null;
req.AllowAutoRedirect = true;
req.Accept = "*/*";
byte[] data = Encoding.UTF8.GetBytes(postdata);
using (Stream reqStream = req.GetRequestStream())
{
reqStream.Write(data, 0, data.Length);
}
try
{
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
using (StreamReader reader = new StreamReader(resp.GetResponseStream()))
{
result = reader.ReadToEnd();
}
}
catch (Exception ex)
{
throw ex;
}
return result;
}
}
}
程序主入口:
using Newtonsoft.Json;
using System;
namespace ConsoleApp3
{
class Program
{
static void Main(string[] args)
{
string mobile = "***********";//自己要验证收短信的手机号
string appkey = "*****************";//自己在腾讯云上申请的App Key
string random = StaticClass.GenerateRandomCode(10);
string time = StaticClass.GetTimeStamp(10).ToString();
string sig = StaticClass.Sha256($"appkey={appkey}&random={random}&time={time}&mobile={mobile}");
var postData = new SendCode
{
Ext = "",
Extend = "",
Params = new string[] { "5566" },
Sig = sig,
Sign = "***********",//自己审核通过的短信签名
Tel = new Phone { Mobile = "**********",/*自己要验证收短信的手机号*/ Nationcode = "86"/*国家标识*/ },
Time = time,
Tpl_id = "************"//自己审核通过的短信模版id
};
string url = $"https://yun.tim.qq.com/v5/tlssmssvr/sendsms?sdkappid=******&random={random}";//sdkappid=自己在腾讯云上申请的SDK AppID
string postDataStr = JsonConvert.SerializeObject(postData).ToLower();
string result = StaticClass.HttpPost(url, postDataStr);
Console.WriteLine(result);
Console.ReadKey();
}
}
}
step 1:生成签名方法 v3
签名方法 v3 过程:https://cloud.tencent.com/document/api/213/30654
签名方法 v3 代码:https://cloud.tencent.com/document/api/213/30654#DotNet
using System;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Text;
public class Application
{
public static string SHA256Hex(string s)
{
using (SHA256 algo = SHA256.Create())
{
byte[] hashbytes = algo.ComputeHash(Encoding.UTF8.GetBytes(s));
StringBuilder builder = new StringBuilder();
for (int i = 0; i < hashbytes.Length; ++i)
{
builder.Append(hashbytes[i].ToString("x2"));
}
return builder.ToString();
}
}
public static byte[] HmacSHA256(byte[] key, byte[] msg)
{
using (HMACSHA256 mac = new HMACSHA256(key))
{
return mac.ComputeHash(msg);
}
}
public static Dictionary<String, String> BuildHeaders(string secretid,
string secretkey, string service, string endpoint, string region,
string action, string version, DateTime date, string requestPayload)
{
string datestr = date.ToString("yyyy-MM-dd");
DateTime startTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
long requestTimestamp = (long)Math.Round((date - startTime).TotalMilliseconds, MidpointRounding.AwayFromZero) / 1000;
// ************* 步骤 1:拼接规范请求串 *************
string algorithm = "TC3-HMAC-SHA256";
string httpRequestMethod = "POST";
string canonicalUri = "/";
string canonicalQueryString = "";
string contentType = "application/json";
string canonicalHeaders = "content-type:" + contentType + "; charset=utf-8\n" + "host:" + endpoint + "\n";
string signedHeaders = "content-type;host";
string hashedRequestPayload = SHA256Hex(requestPayload);
string canonicalRequest = httpRequestMethod + "\n"
+ canonicalUri + "\n"
+ canonicalQueryString + "\n"
+ canonicalHeaders + "\n"
+ signedHeaders + "\n"
+ hashedRequestPayload;
Console.WriteLine(canonicalRequest);
Console.WriteLine("----------------------------------");
// ************* 步骤 2:拼接待签名字符串 *************
string credentialScope = datestr + "/" + service + "/" + "tc3_request";
string hashedCanonicalRequest = SHA256Hex(canonicalRequest);
string stringToSign = algorithm + "\n" + requestTimestamp.ToString() + "\n" + credentialScope + "\n" + hashedCanonicalRequest;
Console.WriteLine(stringToSign);
Console.WriteLine("----------------------------------");
// ************* 步骤 3:计算签名 *************
byte[] tc3SecretKey = Encoding.UTF8.GetBytes("TC3" + secretkey);
byte[] secretDate = HmacSHA256(tc3SecretKey, Encoding.UTF8.GetBytes(datestr));
byte[] secretService = HmacSHA256(secretDate, Encoding.UTF8.GetBytes(service));
byte[] secretSigning = HmacSHA256(secretService, Encoding.UTF8.GetBytes("tc3_request"));
byte[] signatureBytes = HmacSHA256(secretSigning, Encoding.UTF8.GetBytes(stringToSign));
string signature = BitConverter.ToString(signatureBytes).Replace("-", "").ToLower();
Console.WriteLine(signature);
Console.WriteLine("----------------------------------");
// ************* 步骤 4:拼接 Authorization *************
string authorization = algorithm + " "
+ "Credential=" + secretid + "/" + credentialScope + ", "
+ "SignedHeaders=" + signedHeaders + ", "
+ "Signature=" + signature;
Console.WriteLine(authorization);
Console.WriteLine("----------------------------------");
Dictionary<string, string> headers = new Dictionary<string, string>();
headers.Add("Authorization", authorization);
headers.Add("Host", endpoint);
headers.Add("Content-Type", contentType + "; charset=utf-8");
headers.Add("X-TC-Timestamp", requestTimestamp.ToString());
headers.Add("X-TC-Version", version);
headers.Add("X-TC-Action", action);
headers.Add("X-TC-Region", region);
return headers;
}
public static void Main(string[] args)
{
// 密钥参数
string SECRET_ID = "AKIDz8krbsJ5yKBZQpn74WFkmLPx3*******";
string SECRET_KEY = "Gu5t9xGARNpq86cd98joQYCN3*******";
string service = "cvm";
string endpoint = "cvm.tencentcloudapi.com";
string region = "ap-guangzhou";
string action = "DescribeInstances";
string version = "2017-03-12";
// 此处由于示例规范的原因,采用时间戳2019-02-26 00:44:25,此参数作为示例,如果在项目中,您应当使用:
// DateTime date = DateTime.UtcNow;
// 注意时区,建议此时间统一采用UTC时间戳,否则容易出错
DateTime date = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).AddSeconds(1551113065);
string requestPayload = "{\"Limit\": 1, \"Filters\": [{\"Values\": [\"\\u672a\\u547d\\u540d\"], \"Name\": \"instance-name\"}]}";
Dictionary<string, string> headers = BuildHeaders(SECRET_ID, SECRET_KEY, service
, endpoint, region, action, version, date, requestPayload);
Console.WriteLine("POST https://cvm.tencentcloudapi.com");
foreach (KeyValuePair<string, string> kv in headers)
{
Console.WriteLine(kv.Key + ": " + kv.Value);
}
Console.WriteLine();
Console.WriteLine(requestPayload);
}
}
.Net Sdk api 3.0
c# .Net Sdk api 3.0 短信源代码 https://cloud.tencent.com/document/product/382/43198
短信发送.Net SDK 3.0 for .Net 5.x(https://github.com/iaspnetcore/tencentcloud-sdk-dotnet-sms)
https://cloud.tencent.com/document/product/382/38778