腾讯云短信服务使用记录与.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 = ;
private const int OVERSEA_TEMPLATE_ID = ;
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 != )
{
_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(, );
}
}
腾讯云短信服务使用记录与.NET Core C#代码分享的更多相关文章
- 反射实现Model修改前后的内容对比 【API调用】腾讯云短信 Windows操作系统下Redis服务安装图文详解 Redis入门学习
反射实现Model修改前后的内容对比 在开发过程中,我们会遇到这样一个问题,编辑了一个对象之后,我们想要把这个对象修改了哪些内容保存下来,以便将来查看和追责. 首先我们要创建一个User类 1 p ...
- php腾讯云短信验证码
腾讯云短信控制台:https://console.cloud.tencent.com/sms 腾讯云短信 PHP SDK:https://github.com/qcloudsms/qcloudsms_ ...
- 基于tp3.2的腾讯云短信验证码的实现
新手小白在公司要完成短信验证码注册功能,最初由于没有经验,网上的教程又不是很全,便参考着官方API文档,进行开发 直接进入正题:使用composer下载腾讯云短信接口(记得添加依赖).在项目目录下新建 ...
- java实现发短信功能---腾讯云短信
目录 java实现发短信功能 前言 开发环境 腾讯云 ---短信 代码 效果 结束语 java实现发短信功能 前言 如今发短信功能已经成为互联网公司的标配,本篇文章将一步步实现java发送短信 考察了 ...
- Python 腾讯云短信,发送手机验证码
1.安装包 pip install qcloudsms_py 2.准备好相关参数 腾讯云短信每个月赠送100条短信,申请一个应用,获取appid,然后创建短信签名,然后创建正文模版 3.发送短信 我们 ...
- python调用腾讯云短信接口
目录 python调用腾讯云短信接口 账号注册 python中封装腾讯云短信接口 python调用腾讯云短信接口 账号注册 去腾讯云官网注册一个腾讯云账号,通过实名认证 然后开通短信服务,创建短信应用 ...
- 使用springboot集成腾讯云短信服务,解决配置文件读取乱码问题
springboot集成腾讯云短信服务: (1)导入依赖 <dependency> <groupId>org.springframework.boot</groupId& ...
- 腾讯云短信 nodejs 接入, 通过验证码修改手机示例
腾讯云短信 nodejs 接入, 通过验证码修改手机示例 参考:腾讯云短信文档国内短信快速入门qcloudsms Node.js SDK文档中心>短信>错误码 nodejs sdk 使用示 ...
- 云-腾讯云-短信:短信(SMS)
ylbtech-云-腾讯云-短信:短信(SMS) 快速稳定.简单易用.触达全球的短信服务,支持国内短信.语音短信与国际短信 1.返回顶部 1. 腾讯云短信 SMS 简介 腾讯云短信(Short Mes ...
随机推荐
- plsql 操纵表数据的2种方式
1.情景展示 在plsql中,对表的操作(增.删.改.查),其实有2种方式,只是很多人都只会第一种方式罢了. 2.方式介绍 第1种方式:直接将值与sql写到一起 直接按F8运行即可. 第2种方式: ...
- redis性能测试报告
服务器配置:16核心,64G 250个并发读:250个并发写性能[内容8千byte] 163为读:164为写:
- PNG、 JPG图片压缩方法
参考链接 https://tinypng.com/developers/reference/python 1.安装 pip install --upgrade tinify 2.使用python脚本压 ...
- 微信小程序场景值
场景值 基础库 1.1.0 开始支持,低版本需做兼容处理 当前支持的场景值有: 场景值ID 说明 1001 发现栏小程序主入口 1005 顶部搜索框的搜索结果页 1006 发现栏小程序主入口搜索框的搜 ...
- 在Centos 6 64bit 上安装 Hyperic HQ 5.8.2.1 中文版
原文:https://my.oschina.net/hyperichq/blog/306791 环境描述: [test@tester ~]$ cat /etc/issue CentOS release ...
- wrk压测工具使用
介绍分为四部分 1.wrk简述 2.wrk安装 3.wrk运行参数 4.wrk高级用法 1.wrk简述 当使用ab做压测的时候发现,ab的客户端消耗很大,而且测试时性能较差,测试redis,sprin ...
- easyui-combox(tagbox) 多选操作 显示为tagbox
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Java知多少(14)数组
如果希望保存一组有相同类型的数据,可以使用数组. 数组的定义和内存分配 Java 中定义数组的语法有两种: type arrayName[]; type[] arrayName; type 为Java ...
- Java知多少(33)多态对象的类型转换
这里所说的对象类型转换,是指存在继承关系的对象,不是任意类型的对象.当对不存在继承关系的对象进行强制类型转换时,java 运行时将抛出 java.lang.ClassCastException 异常. ...
- spring事务传播
http://my.oschina.net/u/1166271/blog?catalog=448293