C# 阿里云短信接口调用(不使用SDK,单文件完成)

这篇具有很好参考价值的文章主要介绍了C# 阿里云短信接口调用(不使用SDK,单文件完成)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

虽然阿里云短信接口,提供了很多种语言的SKD,但是对应C#而言,如果使用阿里云SDK,你的项目中需要引入一大堆的dll,像这样:

c# 阿里云短信,C#,阿里云,云计算

我只需要发个短信,没必要引入这么多dll吧。于是,根据阿里云官方文档,接口SDK源码,自己整理封装了一个类,完成发短信的操作。闲话不多说,直接上代码:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Net;
using System.Security.Cryptography;
using System.Text;

namespace AliyunSMS
{
    /// <summary>
    /// 【相关文档】
    ///  RPC调用机制:https://help.aliyun.com/document_detail/315526.htm?spm=a2c4g.11186623.0.0.46b027b5vlfd0X
    ///  发送短信文档: https://help.aliyun.com/document_detail/419273.htm?spm=a2c4g.11186623.0.0.34374198G2b44u
    ///  短信接口文档:https://help.aliyun.com/document_detail/419298.html?spm=5176.25163407.help.dexternal.774dbb6eylDOx0
    /// </summary>
    public static class AliyunSmsHelper
    {
        /// <summary>
        ///     阿里云访问密钥
        /// </summary>
        public static string AccessKeyId = "***替换为自己的AccessKeyId***"; //用户标识
        public static string AccessKeySecret = "***替换为自己的AccessKeySecret***"; //用户密钥

        private static readonly string Separator = "&";
        public static string Url = "http://dysmsapi.aliyuncs.com?"; //短信接口地址

        /// <summary>
        ///     发送短信
        /// </summary>
        /// <param name="phone">手机号码</param>
        /// <param name="signName">短信签名</param>
        /// <param name="templateCode">模板编号</param>
        /// <param name="templateParam">模板变量</param>
        /// <returns></returns>
        public static string SendSms(string phone, string signName, string templateCode, string templateParam)
        {
            var dic = new Dictionary<string, string>();

            //公共请求参数
            dic.Add("Action", "SendSms");
            dic.Add("Version", "2017-05-25");
            dic.Add("Format", "JSON");
            dic.Add("AccessKeyId", AccessKeyId);
            dic.Add("SignatureNonce", Guid.NewGuid().ToString());
            dic.Add("Timestamp", DateTime.UtcNow.ToString("yyyy-MM-dd'T'HH:mm:ss'Z'"));
            dic.Add("SignatureMethod", "HMAC-SHA1");
            dic.Add("SignatureVersion", "1.0");

            //请求参数
            dic.Add("PhoneNumbers", phone);
            dic.Add("SignName", signName);
            dic.Add("TemplateCode", templateCode);
            dic.Add("TemplateParam", templateParam);

            //接口签名
            var signature = GetSignature(dic, "GET", AccessKeySecret);
            dic.Add("Signature", signature);

            var parms = "";
            foreach (var pair in dic) parms += pair.Key + "=" + PercentEncode(pair.Value) + "&"; //参数值需用阿里云约定编码方式进行编码
            parms = parms.TrimEnd('&');

            return HttpGet(Url + parms);
        }

        /// <summary>
        ///     发起网络请求
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        public static string HttpGet(string url)
        {
            var encode = Encoding.UTF8;
            var request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "GET";
            request.ContentType = "text/html, application/xhtml+xml, */*";

            var response = (HttpWebResponse)request.GetResponse();
            var rs = response.GetResponseStream();
            var sr = new StreamReader(rs, encode);
            var result = sr.ReadToEnd();
            sr.Close();
            rs.Close();
            return result;
        }

        /// <summary>
        ///     签名算法
        /// </summary>
        /// <param name="signedParams"></param>
        /// <param name="method"></param>
        /// <param name="secret"></param>
        /// <returns></returns>
        public static string GetSignature(
            Dictionary<string, string> signedParams,
            string method,
            string secret)
        {
            var list = signedParams.Keys.ToList();

            list.Sort(StringComparer.Ordinal); //排序

            var builder = new StringBuilder();
            foreach (var key in list)
                if (signedParams[key] != null)
                    builder.Append("&").Append(PercentEncode(key)).Append("=").Append(PercentEncode(signedParams[key]));

            var builder2 = new StringBuilder();
            builder2.Append(method);
            builder2.Append(Separator);
            builder2.Append(PercentEncode("/"));
            builder2.Append(Separator);
            builder2.Append(PercentEncode(builder.ToString().Substring(1)));

            byte[] hash = { };
            using (var fromName = CryptoConfig.CreateFromName("HMACSHA1") as KeyedHashAlgorithm)
            {
                if (fromName != null)
                {
                    fromName.Key = Encoding.UTF8.GetBytes(secret + Separator);
                    hash = fromName.ComputeHash(Encoding.UTF8.GetBytes(builder2.ToString().ToCharArray()));
                }
            }

            return Convert.ToBase64String(hash);
        }

        /// <summary>
        ///     编码
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        private static string PercentEncode(string value)
        {
            if (value == null)
                return null;
            var stringBuilder = new StringBuilder();
            var str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~";
            foreach (char ch in Encoding.UTF8.GetBytes(value))
                if (str.IndexOf(ch) >= 0)
                    stringBuilder.Append(ch);
                else
                    stringBuilder.Append("%").Append(string.Format(CultureInfo.InvariantCulture, "{0:X2}", (int)ch));
            return stringBuilder.ToString().Replace("+", "%20").Replace("*", "%2A").Replace("%7E", "~");
        }

        public static string ToForm(IDictionary filter)
        {
            if (filter == null)
                return string.Empty;
            var dictionary = filter.Keys.Cast<string>().ToDictionary(key => key, key => filter[key]);
            var dicOut = new Dictionary<string, string>();
            TileDict(dicOut, dictionary);
            var values = new List<string>();
            foreach (var keyValuePair in dicOut)
                if (!string.IsNullOrEmpty(keyValuePair.Value))
                    values.Add(PercentEncode(keyValuePair.Key) + "=" + PercentEncode(keyValuePair.Value));
            return string.Join("&", values.ToArray());
        }

        internal static void TileDict(Dictionary<string, string> dicOut, object obj, string parentKey = "")
        {
            if (obj == null)
                return;
            if (typeof(IDictionary).IsAssignableFrom(obj.GetType()))
            {
                foreach (var keyValuePair in ((IDictionary)obj).Keys.Cast<string>()
                         .ToDictionary(key => key, key => ((IDictionary)obj)[key]))
                {
                    var parentKey1 = parentKey + "." + keyValuePair.Key;
                    if (keyValuePair.Value != null)
                        TileDict(dicOut, keyValuePair.Value, parentKey1);
                }
            }
            else if (typeof(IList).IsAssignableFrom(obj.GetType()))
            {
                var num = 1;
                foreach (var obj1 in (IEnumerable)obj)
                {
                    TileDict(dicOut, obj1, parentKey + "." + num.ToSafeString());
                    ++num;
                }
            }
            else if (obj.GetType() == typeof(byte[]))
            {
                dicOut.Add(parentKey.TrimStart('.'), Encoding.UTF8.GetString((byte[])obj));
            }
            else
            {
                dicOut.Add(parentKey.TrimStart('.'), obj.ToSafeString(""));
            }
        }

        public static string ToSafeString(this object obj, string defaultStr = null)
        {
            if (obj == null)
                return defaultStr;
            try
            {
                return obj.ToString();
            }
            catch
            {
                return defaultStr;
            }
        }
    }
}

调用方式如下:(以发送短信验证码短信为例)

var random = new Random().Next(100000, 999999).ToString();
AliyunSmsHelper.SendSms("1******4902", "短信签名", "SMS_262******", "{\"code\":\"" + random + "\"}");
       

 参考文档:

1.RPC调用机制:https://help.aliyun.com/document_detail/315526.htm?spm=a2c4g.11186623.0.0.46b027b5vlfd0X

2.发送短信文档: https://help.aliyun.com/document_detail/419273.htm?spm=a2c4g.11186623.0.0.34374198G2b44u

3.短信接口文档:https://help.aliyun.com/document_detail/419298.html?spm=5176.25163407.help.dexternal.774dbb6eylDOx0文章来源地址https://www.toymoban.com/news/detail-518524.html

到了这里,关于C# 阿里云短信接口调用(不使用SDK,单文件完成)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C#使用Asp.Net创建Web Service接口并调用

    目录 一.创建Asp.net web应用以及Web Service服务 (1).运行环境 (2)创建项目 二.创建控制台应用来调用上面创建的Web Service 开发工具: Visual Studio 2022 Current (免费社区版) 框架版本: .net framework4.7.2,更高的.net 5 、net6貌似没有默认提供带web service的asp.net 应用模板了。 确保VS的工作负荷有

    2024年01月18日
    浏览(33)
  • ABAP调用阿里云接口-短信服务-HTTP协议及签名(abap版本)<转载>

    原文链接:https://blog.csdn.net/xiefireworks/article/details/113037650 阿里云接口文档请参考官网地址 https://help.aliyun.com/document_detail/59210.html?spm=5176.8195934.J_5834642020.5.11ba4378DLVi4O 此处仅介绍使用ABAP完成阿里云短信服务签名请求的完成。 第一步:请求参数 1 abap 生成的uuid为32位不带“-”

    2024年02月16日
    浏览(33)
  • C# 开源SDK 工业相机库 调用海康相机 大恒相机

    c# 相机库,含海康、大恒品牌2D相机的常用功能。 底层采用回调+信号量模式封装 ,最大程度减小线程资源,提高采图效率。 开源地址 :https://gitee.com/laomaogu/mgcamctrl 现只兼容了大恒和海康,都是常用的 其他相机,看我老板啥时候换品牌吧,或者换老板? 当然如果小伙伴感兴

    2024年04月26日
    浏览(38)
  • C#调用C++封装的SDK库(dll动态库)——下

    一、说明 上一篇我们相当于封装的是C语言风格的动态dll库,供C#来调用的。 C#调用C++封装的SDK库(dll动态库)——上 如果我们要封装的是下面的类呢?我们该怎么办?大家先思考下。  二、思路 不知道大家还记得设计模式中的单例模式吗? 我们可以采用类似的处理方式,通过

    2023年04月25日
    浏览(33)
  • stable diffusion webui 文生图(txt2img)api接口调用(使用C#)

    本次将跟读者讲一下如何通过C#请求sd webui api 【txt2img】接口,如果读者觉得文章有用,请给【点个赞】吧,有问题可以评论区提问。 启动webui时,需加上【–api】 命令以保证api接口可以被调用。如果需要设置密码,可以通过【–api-auth 账号:密码】和【–gradio-auth 账号:密码】

    2024年02月09日
    浏览(30)
  • C# webapi接口调用实例

    书接上回C# WebServiceWebApi接口项目创建,在demo的基础上进行webapi接口调用实例开发。 WebApi接口项目public分支https://gitee.com/xiuhuang/webapi_demo 进行接口调用的类库项目public分支https://gitee.com/xiuhuang/dll_demo 下文中提到的所有修改都可以在gitee上看到与demo的修改处直观对比,并且复制

    2024年02月07日
    浏览(37)
  • 详解dedecms使用整合阿里大鱼短信接口进行短信发送的教程

    阿里大鱼虽免费,但不足的是内容、签名什么都要进行审核,且短信内容必须以模版方式进行调用,不能根据自己的需求随意发送, 接下介绍下阿里大鱼免费短信具体实现方法,该方法php程序可通用。 首先要去阿里大鱼下载sdk,引用其中5个基础文件即可,然后进入阿里大鱼

    2024年02月02日
    浏览(33)
  • C#调用外部接口(POST、GET)

      public  string  HttpPost( ) { //把用户传过来的数据转成“UTF-8”的字节流 Encoding encoding = Encoding.UTF8; //创建一个HTTP请求 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(\\\"http://接口IP地址:端口号/接口路径\\\");     //比如:http://192.168.123.12:8080/api/post   //调用POST方法 request.Method = \\\"PO

    2024年02月13日
    浏览(41)
  • C#通过请求url调用接口返回数据

     方法描述:通过请求url,调用对方系统的接口,拿到数据并返回; 方法参数:访问系统的url地址 url请求参数:searchDate(当前请求的年月:2023-7),需进行url编码

    2024年02月15日
    浏览(39)
  • 用Java调用C#的WebService接口

    这是一个用Java调用C#版程序的例子,废话不多说,上代码: C#接口代码: Java调用这个Webservice中的Add方法和HelloWorld方法: 1.有参方法:Add 运行,结果返回:Result:3 2.无参方法:HelloWorld 可以看到,调用无参的webservice和有参的基本相同,不过无参调用时,不需要调用Call的ad

    2024年02月12日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包