using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace CallCenter.Utility
{
///
/// 短信
///
public static class SmsHelper
{
///
/// 发送短信
///
/// 手机号、多个手机号英文逗号隔开
/// 模板编号
/// [\"工单号\"]、[\"工单号\",\"工单号\",\"工单号\",...]
///
public static string Send(string phones,string templateCode,string templateParam="")
{
string result = string.Empty;
try
{
string apiKey = Configs.GetValue("SmsNewApiKey");
string accessKey = Configs.GetValue("SmsNewSecretKey");
string authHost = Configs.GetValue("SmsNewUrl");
var ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
var currentTime = Convert.ToInt64(ts.TotalMilliseconds).ToString();
HttpClient client = new HttpClient();
var requestHeaders = new Dictionary();
//签名算法。支持HmacSHA256、HmacMD5、HmacSHA224、HmacSHA384、HmacSHA512
requestHeaders.Add("x-sign-method", "HmacSHA256");
requestHeaders.Add("x-api-key", $"{apiKey}");
//随机数。每次请求随机数建议不相同
requestHeaders.Add("x-nonce", $"{GetRandom()}");
//时间戳
requestHeaders.Add("x-timestamp", $"{currentTime}");
// client.DefaultRequestHeaders.Host = "recognition.image.myqcloud.com";
//设置headers请求参数
foreach (var item in requestHeaders)
{
client.DefaultRequestHeaders.Add(item.Key, item.Value);
}
//短信接口请求参数。参见接口规范
var jsArr = new Dictionary();
jsArr.Add("phones", phones);
jsArr.Add("templateCode", templateCode);
if (!string.IsNullOrEmpty(templateParam))
{
jsArr.Add("templateParam", templateParam);
}
//将headers参与与接口报文参数合并、排序,并生成本次请求的签名信息
var signDic = jsArr.Union(requestHeaders).ToDictionary(k => k.Key, v => v.Value);
var dicStr = GetSignContent(signDic);
var sign = Hmacsha256Encrypt(dicStr, accessKey);
//在header中设置本次请求签名信息
client.DefaultRequestHeaders.Add("x-sign", sign);
HttpContent str = new StringContent(jsArr.ToJson());
str.Headers.Remove("Content-Type");
str.Headers.Add("Content-Type", "application/json");
HttpResponseMessage response = client.PostAsync(authHost, str).Result;
var result1 = response.Content.ReadAsStringAsync().Result;
var objresult = result1.ToJObject();
if (objresult["code"].ToString() != "200")
{
LogFactory.GetLogger("SmsHelper").Error(phones + "\r\n" + templateCode + "\r\n" + templateParam + "\r\n" + result1);
}
}
catch (Exception ex)
{
LogFactory.GetLogger("SmsHelper").Error(phones + "\r\n" + templateCode + "\r\n" + templateParam + "\r\n" + ex.ToString());
}
return result;
}
///
/// Get Sign Content
///
///
///
private static string GetSignContent(IDictionary parameters)
{
// 第一步:把字典按Key的字母顺序排序
IDictionary sortedParams = new SortedDictionary(parameters);
IEnumerator> dem = sortedParams.GetEnumerator();
// 第二步:把所有参数名和参数值串在一起
StringBuilder query = new StringBuilder("");
while (dem.MoveNext())
{
string key = dem.Current.Key;
string value = dem.Current.Value;
if (!string.IsNullOrEmpty(key) && !string.IsNullOrEmpty(value))
{
query.Append(key).Append("=").Append(value).Append("&");
}
}
string content = query.ToString().Substring(0, query.Length - 1);
return content;
}
///
/// HMACSHA1算法加密
///
private static string Hmacsha256Encrypt(string encryptText, string encryptKey)
{
var encoding = new System.Text.UTF8Encoding();
StringBuilder builder = new StringBuilder();
using (var hmacsha256 = new HMACSHA256(encoding.GetBytes(encryptKey)))
{
byte[] hashmessage = hmacsha256.ComputeHash(encoding.GetBytes(encryptText));
for (int i = 0; i < hashmessage.Length; i++)
{
builder.Append(hashmessage[i].ToString("x2"));
}
}
return builder.ToString();
}
///
/// 获取随机数
///
private static int GetRandom()
{
var random = new Random();
var rand = random.Next(10000, 999999999);
return rand;
}
}
}