美文网首页
阿里云短信服务之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