/// <summary>
/// 百度接口签名帮助类
/// </summary>
public class BaiduApiHelper
{
#region 构造函数 /// <summary>
/// 构造函数
/// </summary>
/// <param name="accessKeyId">百度AccessKeyId(AK)</param>
/// <param name="secretAccessKey">百度SecretAccessKey(SK)</param>
public BaiduApiHelper(string accessKeyId, string secretAccessKey)
{
_accessKeyId = accessKeyId;
_secretAccessKey = secretAccessKey;
} #endregion #region 内部成员 private string _accessKeyId { get; }
private string _secretAccessKey { get; }
private string UriEncode(string input, bool encodeSlash = false)
{
StringBuilder builder = new StringBuilder();
foreach (byte b in Encoding.UTF8.GetBytes(input))
{
if ((b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || (b >= '' && b <= '') || b == '_' || b == '-' || b == '~' || b == '.')
{
builder.Append((char)b);
}
else if (b == '/')
{
if (encodeSlash)
{
builder.Append("%2F");
}
else
{
builder.Append((char)b);
}
}
else
{
builder.Append('%').Append(b.ToString("X2"));
}
}
return builder.ToString();
}
private string Hex(byte[] data)
{
var sb = new StringBuilder();
foreach (var b in data)
{
sb.Append(b.ToString("x2"));
}
return sb.ToString();
}
private string CanonicalRequest(HttpWebRequest req)
{
Uri uri = req.RequestUri;
StringBuilder canonicalReq = new StringBuilder();
canonicalReq.Append(req.Method).Append("\n").Append(UriEncode(Uri.UnescapeDataString(uri.AbsolutePath))).Append("\n"); var parameters = HttpUtility.ParseQueryString(uri.Query);
List<string> parameterStrings = new List<string>();
foreach (KeyValuePair<string, string> entry in parameters)
{
parameterStrings.Add(UriEncode(entry.Key) + '=' + UriEncode(entry.Value));
}
parameterStrings.Sort();
canonicalReq.Append(string.Join("&", parameterStrings.ToArray())).Append("\n"); string host = uri.Host;
if (!(uri.Scheme == "https" && uri.Port == ) && !(uri.Scheme == "http" && uri.Port == ))
{
host += ":" + uri.Port;
}
canonicalReq.Append("host:" + UriEncode(host));
return canonicalReq.ToString();
} #endregion #region 外部接口 /// <summary>
/// 发送POST请求
/// </summary>
/// <param name="method">请求方法,需要大写,列如(POST)</param>
/// <param name="host">主机地址列如(http://sms.bj.baidubce.com)</param>
/// <param name="url">接口地址列如(/bce/v2/message)</param>
/// <param name="paramters">参数列表</param>
/// <returns></returns>
public string RequestData(string method, string host, string url, Dictionary<string, object> paramters = null)
{
string ak = _accessKeyId;
string sk = _secretAccessKey;
DateTime now = DateTime.Now;
int expirationInSeconds = ; HttpWebRequest req = WebRequest.Create(host + url) as HttpWebRequest;
Uri uri = req.RequestUri;
req.Method = method;
req.ContentType = "application/json"; if (paramters != null)
{
Stream requestStream = req.GetRequestStream();
byte[] data = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(paramters));
requestStream.Write(data, , data.Length);
} string signDate = now.ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ssK");
string authString = "bce-auth-v1/" + ak + "/" + signDate + "/" + expirationInSeconds;
string signingKey = Hex(new HMACSHA256(Encoding.UTF8.GetBytes(sk)).ComputeHash(Encoding.UTF8.GetBytes(authString))); string canonicalRequestString = CanonicalRequest(req); string signature = Hex(new HMACSHA256(Encoding.UTF8.GetBytes(signingKey)).ComputeHash(Encoding.UTF8.GetBytes(canonicalRequestString)));
string authorization = authString + "/host/" + signature; req.Headers.Add("x-bce-date", signDate);
req.Headers.Add(HttpRequestHeader.Authorization, authorization); HttpWebResponse res;
string message = "";
try
{
res = req.GetResponse() as HttpWebResponse;
}
catch (WebException e)
{
res = e.Response as HttpWebResponse;
}
message = new StreamReader(res.GetResponseStream()).ReadToEnd(); return message;
} /// <summary>
/// 发送短信
/// </summary>
/// <param name="phoneNum">手机号码</param>
/// <param name="code">验证码</param>
/// <returns></returns>
public static bool SendMsg(string phoneNum, string code)
{
try
{
BaiduApiHelper baiduApiHelper = new BaiduApiHelper("", ""); string host = "http://sms.bj.baidubce.com";
string url = "/bce/v2/message";
Dictionary<string, object> paramters = new Dictionary<string, object>();
paramters.Add("invokeId", "Vhn0B-vCXn-8888");
paramters.Add("phoneNumber", phoneNum);
paramters.Add("templateCode", "smsTpl:e747612888e9018888");
paramters.Add("contentVar", new { code = code }); string resJsonStr = baiduApiHelper.RequestData("POST", host, url, paramters);
var resJson = JsonConvert.DeserializeObject<JObject>(resJsonStr); return resJson["code"]?.ToString() == "";
}
catch
{
return false;
}
} #endregion
}

直接调用,传入手机号和验证码即可。

百度SMS发送短信C#的更多相关文章

  1. java 使用网建SMS发送短信验证码

    首先, 注册并登录网建用户, 新注册用户将获得5条的测试短信 网建短信通地址: http://sms.webchinese.cn/default.shtml 注册账号在此就不多做赘述了, 直接上代码 ...

  2. java 短信猫发送短信的方法

    用java实现短信收发的功能,目前一般项目中短信群发功能的实现方法大致有下面三种: ·                 1. 向运行商申请短信网关,不需要额外的设备,利用运行商提供的API调用程序发送 ...

  3. java中用中国网建提供的SMS短信平台发送短信

    接下来的项目需求中提到需要短信发送功能,以前没有做过,因此便在网上搜了一下.大体上说的都是有三种方法,分别是sina提供的webservice接口.短信mao和中国网建提供的SMS短信平台. 这三种方 ...

  4. 基于SMS短信平台给手机发送短信

    JAVA发送手机短信,我知道的有三种方式,恰逢项目需求,自己整理了基于SMS的短信发送,其他两种这里就说说一下 使用webservice接口发送手机短信,这个可以使用sina提供的webservice ...

  5. Matlab 程序结束后发送短信或者邮件

    近期,在服务器上运行matlab程序,由于数据比较多,程序比较复杂,运行时间不固定,而且需要经常改变参数,重复运行几次,所以不清楚程序何时结束,以便于修改参数,继续运行.开始有时间就看看程序是否运行结 ...

  6. 个人永久性免费-Excel催化剂功能第85波-灵活便捷的批量发送短信功能(使用腾讯云接口)

    微信时代的今天,短信一样不可缺席,大系统都有集成短信接口.若只是临时用一下,若能够直接在Excel上加工好内容就可以直接发送,这些假设在此篇批量群发短信功能中都为大家带来完美答案. 业务场景 不多说, ...

  7. python-在python3中使用容联云通讯发送短信验证码

    容联云通讯是第三方平台,能够提供短信验证码和语音通信等功能,这里只测试使用短信验证码的功能,因此只需完成注册登录(无需实名认证等)即可使用其短信验证码免费测试服务,不过免费测试服务只能给控制台中指定的 ...

  8. NetCore 阿里大于发送短信

    使用阿里大于API发送短信,但阿里没有提供NetCore 的API,自己看了下源码重写了发短信这个部分 public class MessageSender { private readonly st ...

  9. Android 学习第13课,android 实现发送短信的功能

    1. 界面布局 界面代码: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" ...

随机推荐

  1. 导入Excel——解析Excel——优化

    package com.it.excel.excelLearn; import java.io.FileInputStream; import java.io.IOException; import ...

  2. 虚拟机将ip修改为静态

  3. Properties 取值和设置函数 Hashtable的静态内部类Entry的结构和克隆方法

  4. 学习:STL_vector容器

    vector基本概念: 功能: vector数据结构和数组非常相似,也称为单端数组 vector与普通数组区别: 不同之处在于数组是静态空间,而vector可以动态扩展 动态扩展: 并不是在原空间之后 ...

  5. A1139 | 玩成模拟题的DFS

    考试的时候有思路了,但是没写完.这题起码要40min写,思路太诡异了. 刚刚写了一段,只过了一个case,得了18分,还行.明日再战. #include <stdio.h> #includ ...

  6. openjudge1.3

    目录 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.3.7 1.3.8 1.3.9 1.3.10 1.3.11 1.3.12 1.3.13 1.3.14 1.3.15 1 ...

  7. X86 下的SSDT HOOK

    目录 SSDTHOOK 1.SSDTHOOK 原理. 1.x32下的SSDT HOOK 2.SSDT HOOK代码 3.结果 4.总结 SSDTHOOK 1.SSDTHOOK 原理. x32下,直接获 ...

  8. [后渗透]获取到 Meterpreter 之后的操作

    sysinfo 列出受控主机的系统信息 ls 列出目标主机的文件和文件夹信息 use priv 加载特权提升扩展模块,来扩展meterpreter库 ps 显示所有运行进程以及关联的用户账户 gets ...

  9. Nagios HTTP WARNING: HTTP/1.1 403 Forbidden

    当我们第一次搭建好nagios后会有Nagios HTTP WARNING: HTTP/1.1 403 Forbidden告警 要解决这个问题, 可以创建一个html文件,然后重启两个服务,等待几分钟 ...

  10. 服务器负载过高问题分析-不是cpu高负载也不是IO负载如何处理(阿里 几乎是必考题)

    关于top命令 经常问load average 参考:load average 定义(网易面试) jvm dump的使用 参考:Jvm dump jstack jmap jstat 介绍与使用(内存与 ...