受欢迎的博客标签

短信服务-腾讯云sms短信API服务注册、申请、开发工具,开发、发布流程记录

Published

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://cloud.tencent.com/

使用微信公众号注册
进入 腾讯云官网 首页,单击页面右上角【免费注册】。
在页面右侧“其他注册方式”中单击【微信公众号】,前往微信公众平台进行账号授权。
使用公众平台绑定的管理员个人微信号,微信扫描公众平台帐号授权页面的二维码。
微信进入登录授权页面,请确认您要登录到腾讯云的公众号。可单击“修改权限集”查看授权说明。

页面跳转到注册或关联账号,单击【注册新账号】,请阅读《腾讯云服务协议》和《腾讯云隐私声明》后单击【下一步】。
使用手机微信扫码关注腾讯云助手,或单击【暂不关注】。
注册完成。您可以继续完成实名认证或完善行业信息

使用公众平台绑定的管理员个人微信号扫描

账号提示
您的微信公众账号已注册或关联腾讯云账号,无须再次注册。您可立即登录腾讯云,或使用其他方式进行注册。

控制台显示:

您已完成企业实名认证

https://console.cloud.tencent.com/developer/auth

step 2.企业实名认证

类型个人实名认证企业实名认证
适用对象个人企业、政府、事业单位、学校、组织等
账号归属个人企业
支持认证方式
  • 微信认证
  • QQ 认证
  • 人脸识别认证
  • 微信公众号认证
  • 充值认证
  • 企业对公打款认证
实名区别
  • 可参加个人类运营活动
  • 无法申请增值税专用发票
  • 可参加企业类运营活动
  • 可以申请增值税专用发票
操作指引个人实名认证指引企业实名认证指引

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:打开腾讯云平台首页

https://cloud.tencent.com/

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)

短信 发送API 文档(腾讯云)

https://cloud.tencent.com/document/product/382/38778

SDK 3.0