国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C# 阿里云短信接口調(diào)用(不使用SDK,單文件完成)

這篇具有很好參考價(jià)值的文章主要介紹了C# 阿里云短信接口調(diào)用(不使用SDK,單文件完成)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

雖然阿里云短信接口,提供了很多種語(yǔ)言的SKD,但是對(duì)應(yīng)C#而言,如果使用阿里云SDK,你的項(xiàng)目中需要引入一大堆的dll,像這樣:

c# 阿里云短信,C#,阿里云,云計(jì)算

我只需要發(fā)個(gè)短信,沒(méi)必要引入這么多dll吧。于是,根據(jù)阿里云官方文檔,接口SDK源碼,自己整理封裝了一個(gè)類,完成發(fā)短信的操作。閑話不多說(shuō),直接上代碼:

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>
    /// 【相關(guān)文檔】
    ///  RPC調(diào)用機(jī)制:https://help.aliyun.com/document_detail/315526.htm?spm=a2c4g.11186623.0.0.46b027b5vlfd0X
    ///  發(fā)送短信文檔: 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>
        ///     阿里云訪問(wèn)密鑰
        /// </summary>
        public static string AccessKeyId = "***替換為自己的AccessKeyId***"; //用戶標(biāo)識(shí)
        public static string AccessKeySecret = "***替換為自己的AccessKeySecret***"; //用戶密鑰

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

        /// <summary>
        ///     發(fā)送短信
        /// </summary>
        /// <param name="phone">手機(jī)號(hào)碼</param>
        /// <param name="signName">短信簽名</param>
        /// <param name="templateCode">模板編號(hào)</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>();

            //公共請(qǐng)求參數(shù)
            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");

            //請(qǐng)求參數(shù)
            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) + "&"; //參數(shù)值需用阿里云約定編碼方式進(jìn)行編碼
            parms = parms.TrimEnd('&');

            return HttpGet(Url + parms);
        }

        /// <summary>
        ///     發(fā)起網(wǎng)絡(luò)請(qǐng)求
        /// </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;
            }
        }
    }
}

調(diào)用方式如下:(以發(fā)送短信驗(yàn)證碼短信為例)

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

?參考文檔:

1.RPC調(diào)用機(jī)制:https://help.aliyun.com/document_detail/315526.htm?spm=a2c4g.11186623.0.0.46b027b5vlfd0X

2.發(fā)送短信文檔: 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文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-518524.html

到了這里,關(guān)于C# 阿里云短信接口調(diào)用(不使用SDK,單文件完成)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • C#使用Asp.Net創(chuàng)建Web Service接口并調(diào)用

    C#使用Asp.Net創(chuàng)建Web Service接口并調(diào)用

    目錄 一.創(chuàng)建Asp.net web應(yīng)用以及Web Service服務(wù) (1).運(yùn)行環(huán)境 (2)創(chuàng)建項(xiàng)目 二.創(chuàng)建控制臺(tái)應(yīng)用來(lái)調(diào)用上面創(chuàng)建的Web Service 開(kāi)發(fā)工具: Visual Studio 2022 Current (免費(fèi)社區(qū)版) 框架版本: .net framework4.7.2,更高的.net 5 、net6貌似沒(méi)有默認(rèn)提供帶web service的asp.net 應(yīng)用模板了。 確保VS的工作負(fù)荷有

    2024年01月18日
    瀏覽(29)
  • ABAP調(diào)用阿里云接口-短信服務(wù)-HTTP協(xié)議及簽名(abap版本)<轉(zhuǎn)載>

    ABAP調(diào)用阿里云接口-短信服務(wù)-HTTP協(xié)議及簽名(abap版本)<轉(zhuǎn)載>

    原文鏈接:https://blog.csdn.net/xiefireworks/article/details/113037650 阿里云接口文檔請(qǐng)參考官網(wǎng)地址 https://help.aliyun.com/document_detail/59210.html?spm=5176.8195934.J_5834642020.5.11ba4378DLVi4O 此處僅介紹使用ABAP完成阿里云短信服務(wù)簽名請(qǐng)求的完成。 第一步:請(qǐng)求參數(shù) 1 abap 生成的uuid為32位不帶“-”

    2024年02月16日
    瀏覽(19)
  • C# 開(kāi)源SDK 工業(yè)相機(jī)庫(kù) 調(diào)用??迪鄼C(jī) 大恒相機(jī)

    C# 開(kāi)源SDK 工業(yè)相機(jī)庫(kù) 調(diào)用??迪鄼C(jī) 大恒相機(jī)

    c# 相機(jī)庫(kù),含海康、大恒品牌2D相機(jī)的常用功能。 底層采用回調(diào)+信號(hào)量模式封裝 ,最大程度減小線程資源,提高采圖效率。 開(kāi)源地址 :https://gitee.com/laomaogu/mgcamctrl 現(xiàn)只兼容了大恒和海康,都是常用的 其他相機(jī),看我老板啥時(shí)候換品牌吧,或者換老板? 當(dāng)然如果小伙伴感興

    2024年04月26日
    瀏覽(79)
  • C#調(diào)用C++封裝的SDK庫(kù)(dll動(dòng)態(tài)庫(kù))——下

    C#調(diào)用C++封裝的SDK庫(kù)(dll動(dòng)態(tài)庫(kù))——下

    一、說(shuō)明 上一篇我們相當(dāng)于封裝的是C語(yǔ)言風(fēng)格的動(dòng)態(tài)dll庫(kù),供C#來(lái)調(diào)用的。 C#調(diào)用C++封裝的SDK庫(kù)(dll動(dòng)態(tài)庫(kù))——上 如果我們要封裝的是下面的類呢?我們?cè)撛趺崔k?大家先思考下。 ?二、思路 不知道大家還記得設(shè)計(jì)模式中的單例模式嗎? 我們可以采用類似的處理方式,通過(guò)

    2023年04月25日
    瀏覽(16)
  • stable diffusion webui 文生圖(txt2img)api接口調(diào)用(使用C#)

    stable diffusion webui 文生圖(txt2img)api接口調(diào)用(使用C#)

    本次將跟讀者講一下如何通過(guò)C#請(qǐng)求sd webui api 【txt2img】接口,如果讀者覺(jué)得文章有用,請(qǐng)給【點(diǎn)個(gè)贊】吧,有問(wèn)題可以評(píng)論區(qū)提問(wèn)。 啟動(dòng)webui時(shí),需加上【–api】 命令以保證api接口可以被調(diào)用。如果需要設(shè)置密碼,可以通過(guò)【–api-auth 賬號(hào):密碼】和【–gradio-auth 賬號(hào):密碼】

    2024年02月09日
    瀏覽(91)
  • C# webapi接口調(diào)用實(shí)例

    C# webapi接口調(diào)用實(shí)例

    書接上回C# WebServiceWebApi接口項(xiàng)目創(chuàng)建,在demo的基礎(chǔ)上進(jìn)行webapi接口調(diào)用實(shí)例開(kāi)發(fā)。 WebApi接口項(xiàng)目public分支https://gitee.com/xiuhuang/webapi_demo 進(jìn)行接口調(diào)用的類庫(kù)項(xiàng)目public分支https://gitee.com/xiuhuang/dll_demo 下文中提到的所有修改都可以在gitee上看到與demo的修改處直觀對(duì)比,并且復(fù)制

    2024年02月07日
    瀏覽(22)
  • 詳解dedecms使用整合阿里大魚短信接口進(jìn)行短信發(fā)送的教程

    阿里大魚雖免費(fèi),但不足的是內(nèi)容、簽名什么都要進(jìn)行審核,且短信內(nèi)容必須以模版方式進(jìn)行調(diào)用,不能根據(jù)自己的需求隨意發(fā)送, 接下介紹下阿里大魚免費(fèi)短信具體實(shí)現(xiàn)方法,該方法php程序可通用。 首先要去阿里大魚下載sdk,引用其中5個(gè)基礎(chǔ)文件即可,然后進(jìn)入阿里大魚

    2024年02月02日
    瀏覽(23)
  • C#調(diào)用外部接口(POST、GET)

    ? public? string? HttpPost( ) { //把用戶傳過(guò)來(lái)的數(shù)據(jù)轉(zhuǎn)成“UTF-8”的字節(jié)流 Encoding encoding = Encoding.UTF8; //創(chuàng)建一個(gè)HTTP請(qǐng)求 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(\\\"http://接口IP地址:端口號(hào)/接口路徑\\\");? ? ?//比如:http://192.168.123.12:8080/api/post ? //調(diào)用POST方法 request.Method = \\\"PO

    2024年02月13日
    瀏覽(25)
  • 用Java調(diào)用C#的WebService接口

    這是一個(gè)用Java調(diào)用C#版程序的例子,廢話不多說(shuō),上代碼: C#接口代碼: Java調(diào)用這個(gè)Webservice中的Add方法和HelloWorld方法: 1.有參方法:Add 運(yùn)行,結(jié)果返回:Result:3 2.無(wú)參方法:HelloWorld 可以看到,調(diào)用無(wú)參的webservice和有參的基本相同,不過(guò)無(wú)參調(diào)用時(shí),不需要調(diào)用Call的ad

    2024年02月12日
    瀏覽(18)
  • C#通過(guò)請(qǐng)求url調(diào)用接口返回?cái)?shù)據(jù)

    ?方法描述:通過(guò)請(qǐng)求url,調(diào)用對(duì)方系統(tǒng)的接口,拿到數(shù)據(jù)并返回; 方法參數(shù):訪問(wèn)系統(tǒng)的url地址 url請(qǐng)求參數(shù):searchDate(當(dāng)前請(qǐng)求的年月:2023-7),需進(jìn)行url編碼

    2024年02月15日
    瀏覽(21)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包