腾讯云短信服务使用记录与.NET Core C#代码分享

1、即使是相同的短信签名与短信正文模板,也需要针对“国内文本短信”与“海外文本短信”分别申请。开始不知道,以为只要申请一次,给国外手机发短信时给api传对应的国家码就行,后来才发现需要分别申请。

2、短信服务web api响应“手机号内容频率限制”错误。这是由于在30秒内向同一手机号多次发送了相同内容的短信,这是腾讯云短信服务的默认限制——“相同内容短信对同一个手机号,30秒内发送短信条数不超过1条”,可以通过“应用配置”的“短信频率配置”修改这个限制。

3、腾讯云短信服务没有提供 .NET Core 的 SDK,我们自己实现的代码如下:

public class TencentCloudSmsService : ISmsService

{

    private static readonly HttpClient _httpClient = 

        new HttpClient { BaseAddress = new Uri("https://yun.tim.qq.com") };

    private readonly string _appId;

    private readonly string _appKey;

    private const string SIGNATURE = "...";

    private const int DOMESTIC_TEMPLATE_ID = 1234;

    private const int OVERSEA_TEMPLATE_ID = 5678;

    private readonly ILogger _logger;


    public TencentCloudSmsService(IConfiguration conf,

        ILoggerFactory loggerFactory)

    {

        _appId = conf["tencentCloudSms:appId"];

        if (string.IsNullOrEmpty(_appId))

            throw new ArgumentException($"{nameof(_appId)} must have a value");


        _appKey = conf["tencentCloudSms:appKey"];

        if (string.IsNullOrEmpty(_appKey))

            throw new ArgumentException($"{nameof(_appKey)} must have a value");


        _logger = loggerFactory.CreateLogger<TencentCloudSmsService>();

    }


    public async Task<bool> SendCode(string countryCode, long mobile, int code)

    {

        var random = GetRandom();

        var timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();

        var data = new

        {

            tel = new { nationcode = countryCode.Replace("+", ""), mobile = mobile.ToString() },

            sign = SIGNATURE,

            tpl_id = countryCode == "+86" ? DOMESTIC_TEMPLATE_ID : OVERSEA_TEMPLATE_ID ,

            @params = new[] { code.ToString() },

            sig = ComputeSignature(mobile, random, timestamp),

            time = timestamp,

            extend = "",

            ext = ""

        };


        var url = $"/v5/tlssmssvr/sendsms?sdkappid={_appId}&random={random}";

        _logger.LogDebug("Post to " + _httpClient.BaseAddress + url);

        var response = await _httpClient.PostAsJsonAsync<dynamic>(url, data);

        _logger.LogDebug("Post data:\n" + JsonConvert.SerializeObject(data));

        response.EnsureSuccessStatusCode();


        var result = await response.Content.ReadAsAsync<dynamic>();

        if(result.result != 0)

        {

            _logger.LogError($"Failed to send message to {countryCode}-{mobile}: {result.errmsg}");                

            return false;

        }


        return true;

    }


    private string ComputeSignature(long mobile, int random, long timestamp)

    {

        var input = $"appkey={_appKey}&random={random}&time={timestamp}&mobile={mobile}";

        var hasBytes = SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(input));

        return string.Join("", hasBytes.Select(b => b.ToString("x2")));

    }


    private int GetRandom()

    {

        return new Random().Next(100000, 999999);

    }

}

原文地址:http://www.cnblogs.com/dudu/p/7782376.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/323014.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop入门(九)Mapreduce高级shuffle之Combiner

一、Combiner的出现 &#xff08;1&#xff09;为什么需要进行Map规约操 作 在上述过程中&#xff0c;我们看到至少两个性能瓶颈&#xff1a; &#xff08;1&#xff09;如果我们有10亿个数据&#xff0c;Mapper会生成10亿个键值对在网络间进行传输&#xff0c;但如果我们只…

欢乐纪中某A组赛【2019.1.19】

前言 因为BBB有一堆(两道)题都做过&#xff0c;于是就来做A组了。 成绩 RankRankRank是有算别人的 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCC3332017myself2017myself2017myself2102102101001001001001001001010102222222017lrz2017lrz2017lrz1001001000001001…

使用Identity Server 4建立Authorization Server (2)

第一部分: 使用Identity Server 4建立Authorization Server (1) 第一部分主要是建立了一个简单的Identity Server. 接下来继续: 建立Web Api项目 如图可以在同一个解决方案下建立一个web api项目: (可选)然后修改webapi的launchSettings.json, 我习惯使用控制台, 所以把IISExpr…

建立Vue脚手架的必要性

首先所有文件都放到一个html&#xff0c;代码多了之后阅读体验非常差。 其次建立这样的文件夹后&#xff0c;发现竟然不能随时更新&#xff0c;有缓存的情况

【实验手册】使用Visual Studio Code 开发.NET Core应用程序

.NET Core with Visual Studio Code 目录 概述... 2 先决条件... 2 练习1&#xff1a; 安装和配置.NET Core以及Visual Studio Code 扩展... 2 任务1&#xff1a;安装Visual Studio Code和.NET Core. 2 任务2&#xff1a;安装插件... 4 练习2&#xff1a;使用命令行界面构建. N…

Hadoop入门(八)Mapreduce高级shuffle之Partitioner

一、Partitioner概述 Map阶段总共五个步骤&#xff0c;2就是一个分区操作 哪个key到哪个Reducer的分配过程&#xff0c;是由Partitioner规定的。 二、Hadoop内置Partitioner MapReduce的使用者通常会指定Reduce任务和Reduce任务输出文件的数量&#xff08;R&#xff09;。 用…

在ASP.NET Core中使用AOP来简化缓存操作

前言 关于缓存的使用&#xff0c;相信大家都是熟悉的不能再熟悉了&#xff0c;简单来说就是下面一句话。 优先从缓存中取数据&#xff0c;缓存中取不到再去数据库中取&#xff0c;取到了在扔进缓存中去。 然后我们就会看到项目中有类似这样的代码了。 public Product Get(int p…

Hadoop入门(七)Mapreduce高级Shuffle

一、Shuffle概述 Reduce阶段三个步骤&#xff0c;Shuffle就是一个随机、洗牌操作 Shuffle是什么 针对多个map任务的输出按照不同的分区&#xff08;Partition&#xff09;通过网络复制到不同的reduce任务节点上&#xff0c;这个过程就称作为Shuffle。 二、Shuffle过程 &#…

methods中axios里的数据无法渲染到页面

最近在研究axios聊天室室遇到一个问题 将axios获取到的数据传递给data&#xff0c;从而改变页面中的数值&#xff0c;但是结果令人失望 这是data里的数据 原想将data中的items数组换成axios里的response.data&#xff0c;后来发现items一直为空&#xff0c;就拿字符串做实验了…

.NET Core跨平台的奥秘[上篇]:历史的枷锁

微软推出的第一个版本的.NET Framework是一个面向Windows桌面和服务器的基础框架&#xff0c;在此之后&#xff0c;为此微软根据设备自身的需求对.NET Framework进行裁剪&#xff0c;不断推出了针对具体设备类型的.NET Framework版本以实现针对移动、平板和嵌入式设备提供支持。…

Hadoop入门(十)Mapreduce高级shuffle之Sort和Group

一、排序分组概述 MapReduce中排序和分组在哪里被执行 第3步中需要对不同分区中的数据进行排序和分组&#xff0c;默认情况按照key进行排序和分组 二、排序 在Hadoop默认的排序算法中&#xff0c;只会针对key值进行排序 任务&#xff1a; 数据文件中&#xff0c;如果按照第一…

使用Identity Server 4建立Authorization Server (3)

预备知识: 学习Identity Server 4的预备知识 第一部分: 使用Identity Server 4建立Authorization Server (1) 第二部分: 使用Identity Server 4建立Authorization Server (2) 上一部分简单的弄了个web api 并通过Client_Credentials和ResourceOwnerPassword两种方式获取token然…

php接口跨域问题

报错是因为接口跨域&#xff0c;不允许访问 只需在php头部加入此行代码就行了 header(Access-Control-Allow-Origin:*);

spring boot输出hello world几种方法

1、手动配置&#xff0c;三个文件 打开创建maven,创建这三个文件从上到下依次复制即可 配置文件&#xff08;重要&#xff09;&#xff08;否则后面会报错&#xff09; pom.xml <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w…

欢乐纪中某B组赛【2019.1.20】

前言 有回来做BBB组了&#xff0c;话说第3道题就是AAA组第一道。 成绩 RankRankRank是有算别人的 今天XJQXJQXJQ不在 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCC1112017wyc2017wyc2017wyc2702702701001001001001001007070701010102017hjq2017hjq2017hjq13013013…

向ASP.NET Core迁移

我们首先来看看ASP.NET Core有哪些优势&#xff1f; 跨平台&#xff1a;可以部署到Linux服务器上 内置一套对云和部署环境非常友好的配置模块 内置依赖注入 IIS或者Kestrel&#xff08;或者其它自定义&#xff09; 轻量级、高性能、模块化的Http处理管线 .NET Core 是开源…

ASP.NET Core集成现有系统认证

我们现在大多数转向ASP.NET Core来使用开发的团队&#xff0c;应该都不是从0开始搭建系统&#xff0c;而是老的业务系统已经在运行&#xff0c;ASP.NET Core用来开发新模块。那么解决用户认证的问题&#xff0c;成为我们的第一个拦路虎。 认证与授权 什么是认证&#xff1f; …

使用Identity Server 4建立Authorization Server (4)

预备知识: 学习Identity Server 4的预备知识 第一部分: 使用Identity Server 4建立Authorization Server (1) 第二部分: 使用Identity Server 4建立Authorization Server (2) 第三部分: 使用Identity Server 4建立Authorization Server (3) 上一篇讲了使用OpenId Connect进行Au…

Hadoop入门(十八)Mapreduce的倒排索引程序

一、简介 "倒排索引"是文档检索系统中最常用的数据结构&#xff0c;被广泛地应用于全文搜索引擎。它主要是用来存储某个单词&#xff08;或词组&#xff09;在一个文档或一组文档中的存储位置的映射&#xff0c;即提供了一种根据内容来查找文档的方式。由于不是根据…

.NET Core跨平台的奥秘[中篇]:复用之殇

在《.NET Core跨平台的奥秘[上篇]&#xff1a;历史的枷锁》中我们谈到&#xff1a;由于.NET是建立在CLI这一标准的规范之上&#xff0c;所以它天生就具有了“跨平台”的基因。在微软发布了第一个针对桌面和服务器平台的.NET Framework之后&#xff0c;它开始 “乐此不疲” 地对…