美文网首页
阿里云短信服务之HTTP调用==>C#实现

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

作者: RSDTE | 来源:发表于2019-08-08 21:14 被阅读0次

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

实现代码

/// <summary>
/// 阿里云发送短信
/// </summary>
/// <param name="mobile">手机号码</param>
/// <param name="code">需要发送的验证码</param>
/// <returns>数据如: {"Message":"OK","RequestId":"9B9F542D-8A74-4841-9EEA-194E079ED9B7","BizId":"720216365251647997^0","Code":"OK"}</returns>
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<string, string> 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<string, string> keyValues = new System.Collections.Generic.Dictionary<string, string>();//声明一个字典
    
    #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<string, string> 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

感谢观看

相关文章

网友评论

      本文标题:阿里云短信服务之HTTP调用==>C#实现

      本文链接:https://www.haomeiwen.com/subject/kqwfjctx.html