阿里云短信服务之HTTP调用==>C#实现

使用前提: 假设你已经购买以及配置好阿里云短信服务

实现代码

/// 
/// 阿里云发送短信
/// 
/// 手机号码
/// 需要发送的验证码
/// 数据如: {"Message":"OK","RequestId":"9B9F542D-8A74-4841-9EEA-194E079ED9B7","BizId":"720216365251647997^0","Code":"OK"}
public string SendSms(string mobile, int code)
{
    const string endpoint = "dysmsapi.aliyuncs.com";   // 阿里云服务器地址
    const string AccessKeyId = "kljksadfjl";      // 密匙ID
    const string AccessKeySecret = "lkjfiovdalkj34r"; // 密匙
    const string SignName = "RSDTE";                // 短信签名
    const string templateCode = "SMS_172165200";        // 短信模板id

    // UrlEncode的特殊转换
    Func specialUrlEncode = (string temp) =>
    {
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < temp.Length; i++)
        {
            string t = temp[i].ToString();
            string k = System.Web.HttpUtility.UrlEncode(t, Encoding.UTF8);
            if (t == k)
            {
                stringBuilder.Append(t);
            }
            else
            {
                stringBuilder.Append(k.ToUpper());
            }
        }

        return stringBuilder.ToString().Replace("+", "%20").Replace("*", "%2A").Replace("%7E", "~");
    };
    
    string nowDate = DateTime.Now.ToUniversalTime().ToString("yyyy-MM-dd'T'HH:mm:ss'Z'");//GTM时间
    System.Collections.Generic.Dictionary keyValues = new System.Collections.Generic.Dictionary();//声明一个字典
    
    #region 系统参数                                        
    keyValues.Add("SignatureMethod", "HMAC-SHA1");
    keyValues.Add("SignatureNonce", Guid.NewGuid().ToString()); // ==========
    keyValues.Add("AccessKeyId", AccessKeyId);
    keyValues.Add("SignatureVersion", "1.0");
    keyValues.Add("Timestamp", nowDate);
    keyValues.Add("Format", "Json");//可换成xml
    #endregion

    #region 业务api参数
    keyValues.Add("Action", "SendSms");
    keyValues.Add("Version", "2017-05-25");
    keyValues.Add("RegionId", "cn-hangzhou");
    keyValues.Add("PhoneNumbers", mobile);
    keyValues.Add("SignName", SignName);
    keyValues.Add("TemplateParam", "{\"code\":\"" + code + "\"}");
    keyValues.Add("TemplateCode", templateCode);
    keyValues.Add("OutId", "123");
    #endregion

    //去除签名关键字Signature key
    if (keyValues.ContainsKey("Signature"))
    {
        keyValues.Remove("Signature");
    }

    // 参数key排序
    System.Collections.Generic.Dictionary ascDic = keyValues.OrderBy(o => o.Key).ToDictionary(o => o.Key, p => p.Value.ToString());

    #region 构造待签名的字符串
    StringBuilder builder = new StringBuilder();
    foreach (var item in ascDic)
    {
        if (item.Key == "SignName")
        {
        }
        else
        {
            builder.Append("&").Append(specialUrlEncode(item.Key)).Append("=").Append(specialUrlEncode(item.Value));
        }
        if (item.Key == "RegionId")
        {
            builder.Append("&").Append(specialUrlEncode("SignName")).Append("=").Append(specialUrlEncode(keyValues["SignName"]));
        }
    }
    string sorteQueryString = builder.ToString().Substring(1);
    #endregion

    StringBuilder stringToSign = new StringBuilder();
    stringToSign.Append("GET").Append("&");
    stringToSign.Append(specialUrlEncode("/")).Append("&");
    stringToSign.Append(specialUrlEncode(sorteQueryString));

    #region macsha加密
    var hmacsha1 = new System.Security.Cryptography.HMACSHA1(Encoding.UTF8.GetBytes(AccessKeySecret + "&"));
    var dataBuffer = Encoding.UTF8.GetBytes(stringToSign.ToString());
    var hashBytes = hmacsha1.ComputeHash(dataBuffer);
    string stringbyte = BitConverter.ToString(hashBytes, 0).Replace("-", string.Empty).ToLower();
    string hexString = stringbyte.Replace(" ", "");
    if ((hexString.Length % 2) != 0)
        hexString += " ";
    byte[] bytes = new byte[hexString.Length / 2];
    for (int i = 0; i < bytes.Length; i++)
        bytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);

    string Sign = Convert.ToBase64String(bytes);
    #endregion

    // 签名特殊URL编码
    string signture = specialUrlEncode(Sign);

    // 格式化GET请求的URL
    string url = string.Format("http://{0}/?Signature={1}{2}", endpoint, signture, builder);

    #region 请求发送短信
    string strRet = string.Empty;
    if (url == null || url.Trim().ToString() == "")
    {
        return strRet;
    }
    string targeturl = url.Trim().ToString();
    try
    {
        HttpWebRequest hr = (HttpWebRequest)WebRequest.Create(targeturl);
        hr.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
        hr.Method = "GET";
        hr.Timeout = 30 * 60 * 1000;
        WebResponse hs = hr.GetResponse();
        Stream sr = hs.GetResponseStream();
        StreamReader ser = new StreamReader(sr, Encoding.UTF8);

        strRet = ser.ReadToEnd();
    }
    catch (Exception ex)
    {
        strRet = "短信发送失败!" + ex.Message;
    }
    #endregion

    return strRet;
}











使用方法

        在以上代码中直接修改以下数据为你私人对应的数据, 之后复制到你的程序中, 直接调用即可.

const string AccessKeyId = "kljksadfjl";      // 密匙ID
const string AccessKeySecret = "lkjfiovdalkj34r"; // 密匙
const string SignName = "RSDTE";                // 短信签名
const string templateCode = "SMS_172165200";        // 短信模板id

感谢观看!

 

 

 

 

 

 

你可能感兴趣的:(C#)