C#版使用融合通信API发送手机短信息

news2025/7/19 15:19:14

目录

功能实现

范例运行环境

实现范例

类设计

类代码实现

调用范例

总结


功能实现

融合云通信服务平台,为企业提供全方位通信服务,发送手机短信是其一项核心功能,本文将讲述如何使用融合云服务API为终端手机用户发送短信信息,并使用 C# 进行实现。

范例运行环境

操作系统: Windows Server 2019 DataCenter

.net版本: .netFramework4.7.2 或以上

开发工具:VS2019  C#

实现范例

类设计

设计UTC(融合通信)类,子类SMS类实现发送短信功能,SMS类设计见下表:

序号成员类型名称类型说明
1属性ErrorMessagestring此值代表调用API时发生的任何错误信息
2属性ResultJsonstring返回调用API成功后返回的结果(并不代表一定发送成功)
3属性errcodestring成功调用API后返回的错误码:0代表发送成功,其它值请参照 errmsg 值提示
4属性errmsgstring请参照 errcode属性的解释
5属性cTypestring默认值为xml(小写值),还可选择 json(小写值),这是云平台提供的两种 POST 消息体的类型
6属性signstring申请云API开发者,被授权提供的签名,如【XX公司】
7属性uidstring申请云API开发者,被授权提供的用户名
8属性pwdstring申请云API开发者,被授权提供的密码
9属性desttypestring目标手机用户运营商类型:1 移动,2 联通,3电信 ,默认为 0 (通用)
10属性sendUrlstring

申请云API开发者,被授权提供的可调用API地址,一般会有两个地址:

POST XML 消息体的请调用例如:

http://api.uctyun.cn:0000/adc_posthandler_new
 

 POST JSON 消息体的请调用例如:

http://api.uctyun.cn:0000/adc_posthandler_json

11属性postInfostring这是一个调试信息,返回生成的 POST 消息体信息
12方法sendvoid

send方法有两个参数:

1:string phoneNumber (手机号)

2:string msgContent (要发送的消息)

本方法无返回类型,返回值均返写到 ErrorMessage / ResultJson / errcode / errmsg / postInfo 属性值上

类代码实现


实现代码如下:

public class UTC
{
            public class SMS
            {
                public string ErrorMessage = "";
                public string ResultJson = "";
                public string errcode = "";
                public string errmsg = "";
                public string cType = "xml";
                public string sign { get; set; }
                public string uid { get; set; }
                public string pwd { get; set; }
                public string desttype { get; set; }
                public string sendUrl { get; set; }
                public string postInfo = "";
                public SMS() {
                    desttype = "0";

                }
                public void send(string phoneNumber, string msgContent) {
                    byte[] bytes = System.Text.Encoding.UTF8.GetBytes(msgContent + sign);
                    string base64msg = System.Convert.ToBase64String(bytes);

                    
                    string[] headers = new string[3];
                    headers[0] = "Connection:close";
                    headers[1] = "Content-Type:text/" + cType + ";charset=utf-8";
                    headers[2] = "Action:\"submitreq\"";

                    string postData = "{\"user\":\"" + uid + "\",\"password\":\"" + pwd + "\",\"submit\":[" +
                                    "{\"srctermid\":\"\"," +
                                    "\"desttermid\":\"" + phoneNumber + "\",\"msgcontent\":\"" + base64msg + "\"," +
                                    "\"usermsgid\":\"" + msgid + "\"," +
                                    "\"desttype\":\"" + desttype + "\"}]}";
                    if (cType == "xml")
                    {
                        string xmlData = "<?xml version=\"1.0\" encoding=\"utf-8\"?><Body>" +
                        "<user>" + uid + "</user><password>" + pwd + "</password>" +
                        "<version>1.2</version><submit><usermsgid>" + msgid + "</usermsgid><desttermid>" +
                        phoneNumber + "</desttermid><srctermid></srctermid><msgcontent>" + base64msg
                        + "</msgcontent><signid>0</signid><desttype>" + desttype + "</desttype><needreply>1</needreply>" +
                        "</submit></Body> ";
                        postData = xmlData;
                    }
                    postInfo = postData;

                    ErrorMessage = "";
                    ResultJson = "";
                    errcode = "";
                    errmsg = "";
                    string rs=GetResponseResult(sendUrl, Encoding.UTF8, "POST", postData, headers);
                    ErrorMessage = ws.ErrorMessage;
                    ResultJson = rs;
                    if (ErrorMessage == "" && ResultJson != "")
                    {
                        if (cType == "xml")
                        {
                            string[] rv_xml = GetBetweenStr(rs, "<result>", "</result>").Split(':');
                            errcode = rv_xml[0];
                            if (rv_xml.Length>1)
                            {
                                errmsg = rv_xml[1];
                            }
                        }
                        else if (cType == "json")
                        {
                            try
                            {
                                Newtonsoft.Json.Linq.JObject jsonObj = Newtonsoft.Json.Linq.JObject.Parse(rs);
                                string[] rv = jsonObj["result"].ToString().Split(':');
                                errcode = rv[0];
                                if (rv.Length > 1)
                                {
                                    errmsg = rv[1];
                                }
                            }
                            catch (Exception e)
                            {
                                ErrorMessage += "\r\n" + e.Message;
                                ResultJson = rs;
                            }
                        }
                    }

                }
        public string GetBetweenStr(string wholestr,string beginstr,string endstr)
		{				

			string _temp="";
            if (beginstr == null && endstr == null) return "";
			int _start=(beginstr==null?0:wholestr.IndexOf(beginstr,0));
            if (_start == -1)
            {
                return "";
            }
            if (beginstr == null)
            {
                beginstr = "";
                if (wholestr.IndexOf(endstr, 0) == -1)
                {
                    return "";
                }
            }
            if (endstr != null)
            {
                int _end = wholestr.IndexOf(endstr,_start+beginstr.Length);
                if ((_end - _start - beginstr.Length > 0) && (_end > _start))
                {
                    _temp = wholestr.Substring(_start + beginstr.Length, _end - _start - beginstr.Length);
                }
            }
            else
            {
                if (wholestr.IndexOf(beginstr, 0) == -1)
                {
                    return "";
                }
                int _end = wholestr.Length;
                if ((_end - _start - beginstr.Length > 0) && (_end > _start))
                {
                    _temp = wholestr.Substring(_start + beginstr.Length, _end - _start - beginstr.Length);
                }
            }
			return _temp;
		    }

       }
}

调用范例

示例代码如下:

UTC.SMS utcsms = new UTC.SMS();
utcsms.cType = "xml";   //设置为 POST XML 消息体类型
utcsms.uid = "888888";              
utcsms.pwd = "TJ999999";
utcsms.sign = "【XX公司】";
utcsms.sendUrl = "http://api.uctyun.cn:0000/adc_posthandler_new";
//utcsms.sendUrl = "http://api.uctyun.cn:0000/adc_posthandler_json";  //如果是JSON请访问这个类型的API 地址

//发送短信,提供手机号和短信息内容
utcsms.send("13899999999", "融合通信提醒您,您正在执行登录操作,验证码:12345678");

string debug = string.Format("API:errcode:{4}\r\nerrmsg:{5}\r\n{3}\r\nErrMessage:{0}\r\nResultJson:{1}\r\nPostInfo:{2}", utcsms.ErrorMessage, utcsms.ResultJson, utcsms.postInfo, utcsms.sendUrl,utcsms.errcode,utcsms.errmsg);

总结

GetResponseResult 方法本次得到了更新,主要包括消息头的 Connection 名称,在 C#中使用 request.KeepAlive= Value == "close"?false : true; 的写法来实现。更新后的代码如下:

        public string GetResponseResult(string url, System.Text.Encoding encoding, string method, string postData,string[] headers,string ContentType= "application/x-www-form-urlencoded",bool secValid=true)
        {
            method = method.ToUpper();
            if (secValid == false)
            {
                ServicePointManager.ServerCertificateValidationCallback = validSecurity;
            }
            System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls | System.Net.SecurityProtocolType.Tls11 | System.Net.SecurityProtocolType.Tls12;
            
            if (method == "GET")
            {
                try
                {
                    WebRequest request2 = WebRequest.Create(@url);
                    request2.Method = method;
                    WebResponse response2 = request2.GetResponse();
                    Stream stream = response2.GetResponseStream();
                    StreamReader reader = new StreamReader(stream, encoding);
                    string content = reader.ReadToEnd();
                    return content;
                }
                catch (Exception ex)
                {
                    ErrorMessage = ex.Message;
                    return "";
                }

            }
            Stream outstream = null;
            Stream instream = null;
            StreamReader sr = null;
            HttpWebResponse response = null;
            HttpWebRequest request = null;
            byte[] data = encoding.GetBytes(postData);
            // 准备请求...
            try
            {
                // 设置参数
                request = WebRequest.Create(url) as HttpWebRequest;
                CookieContainer cookieContainer = new CookieContainer();
                request.CookieContainer = cookieContainer;
                request.AllowAutoRedirect = true;
                request.Method = method;
                request.Timeout = 1000000;
                if (headers != null)
                {
                    for(int i = 0; i < headers.GetLength(0); i++)
                    {
                        if (headers[i].Split(':').Length <2)
                        {
                            continue;
                        }

                        if (headers[i].Split(':').Length > 1) {
                            if (headers[i].Split(':')[0] == "Host") {
                                request.Host = headers[i].Split(':')[1];
                                continue;
                            }else if (headers[i].Split(':')[0] == "Content-Type")
                            {
                                request.ContentType = headers[i].Split(':')[1];
                                continue;
                            }
                            else if (headers[i].Split(':')[0] == "Connection")
                            {
                                request.KeepAlive= headers[i].Split(':')[1]== "close"?false : true;
                                continue;
                            }

                        }
                        request.Headers.Add(headers[i]);
                    }
                }
                request.ContentType = ContentType;
                request.ContentLength = data.Length;
                outstream = request.GetRequestStream();
                outstream.Write(data, 0, data.Length);
                outstream.Close();
                //发送请求并获取相应回应数据
                response = request.GetResponse() as HttpWebResponse;
                //直到request.GetResponse()程序才开始向目标网页发送Post请求
                instream = response.GetResponseStream();
                sr = new StreamReader(instream, encoding);
                //返回结果网页(html)代码
                string content = sr.ReadToEnd();
                sr.Close();
                sr.Dispose();
                
                return content;
            }
            catch (Exception ex)
            {
                ErrorMessage = ex.Message;
                return "";
            }
        }//get response result

更多介绍请参阅我的文章:《C# 实现访问 Web API Url 提交数据并获取处理结果》

融合通信官网首页请访问:https://www.uctyun.cn/

技术开发文档请访问:https://www.uctyun.cn/jswd.html

感谢您的阅读,希望本文能够对您有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2240317.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第四十五章 Vue之Vuex模块化创建(module)

目录 一、引言 二、模块化拆分创建方式 三、模块化拆分完整代码 3.1. index.js 3.2. module1.js 3.3. module2.js 3.4. module3.js 3.5. main.js 3.6. App.vue 3.7. Son1.vue 3.8. Son2.vue 四、访问模块module的state ​五、访问模块中的getters ​六、mutati…

如何解决不能将开发板连接到虚拟机的问题(连接显示灰色,不能选中)

-- 如果连接上rk3588单片机&#xff0c;虚拟机无法来连接&#xff0c;如何更改 -- 先将虚拟机关机 -- 将虚拟机的配置文件以文本文件的形式打开 -- 再将所有的FALSE改为TRUE即可 -- 然后再次打开虚拟机即可

什么是白盒测试

一、什么是白盒测试 白盒测试又称结构测试、逻辑驱动测试或基于代码的测试。 白盒测试是一种测试用例设计方法&#xff0c;盒子指的是被测试的软件&#xff0c;白盒指的是盒子是可视的&#xff0c;即清楚盒子内部的东西以及里面是如何运作的。 "白盒"法需要测试者…

图形 2.6 伽马校正

伽马校正 B站视频&#xff1a;图形 2.6 伽马校正 文章目录 伽马校正颜色空间传递函数 Gamma校正校正过程为什么需要校正&#xff1f;CRT与转换函数 为什么sRGB在Gamma 0.45空间&#xff1f; 人对亮度的敏感韦伯定律中灰值 线性工作流不在线性空间下进行渲染的问题统一到线性空…

Android setContentView执行流程(一)-生成DecorView

Android setContentView执行流程(一)-生成DecorView Android setContentView执行流程(二)-将布局添加到mContentParent setContentView的流程主要就是讲在Activity的onCreate方法中调用setContentView方法之后&#xff0c;我们自定义的xml文件加载的过程&#xff0c;学习它可以…

【计算机网络】【网络层】【习题】

计算机网络-网络层-习题 文章目录 13. 图 4-69 给出了距离-向量协议工作过程&#xff0c;表&#xff08;a&#xff09;是路由表 R1 初始的路由表&#xff0c;表&#xff08;b&#xff09;是相邻路由器 R2 传送来的路由表。请写出 R1 更新后的路由表&#xff08;c&#xff09;。…

图像处理实验四(Adaptive Filter)

一、Adaptive Filter简介 自适应滤波器&#xff08;Adaptive Filter&#xff09;是一种能够根据输入信号的统计特性自动调整自身参数以达到最佳滤波效果的滤波器。它广泛应用于信号处理领域&#xff0c;如信道均衡、系统识别、声学回波抵消、生物医学、雷达、波束形成等模块。 …

typedef 与 extern 的结合:一场误解的澄清

typedef 与 extern 的结合:一场误解的澄清 一、typedef 的基本用法二、extern 的基本用法三、typedef 与 extern 的结合:一场误解的澄清示例二:使用 extern 声明外部变量示例三:错误的用法:尝试在 typedef 中使用 extern四、总结在C语言编程的世界里,typedef和extern是两…

Qt_day5_常用类

常用类 目录 1. QString 字符串类&#xff08;掌握&#xff09; 2. 容器类&#xff08;掌握&#xff09; 2.1 顺序容器QList 2.2 关联容器QMap 3. 几种Qt数据类型&#xff08;熟悉&#xff09; 3.1 跨平台数据类型 3.2 QVariant 统一数据类型 3.3 QStringList 字符串列表 4. QD…

HashMap的put流程知道吗

HashMap 的 put 方法算是 HashMap 中比较核心的功能了&#xff0c;复杂程度高但是算法巧妙&#xff0c;同时在上一版本的基础之上优化了存储结构&#xff0c;从链表逐步进化成了红黑树&#xff0c;以满足存取性能上的需要。本文逐行分析了 put 方法的执行流程&#xff0c;重点放…

鸿蒙UI开发——实现环形文字

1、背 景 有朋友提问&#xff1a;您好关于鸿蒙UI想咨询一个问题 如果我想实现展示环形文字是需要通过在Text组件中设置transition来实现么&#xff0c;还是需要通过其他方式来实现。 针对这位粉丝朋友的提问&#xff0c;我们做一下解答。 2、实现环形文字效果 ❓ 什么是环形…

保存pytest的执行日志;在日志中显示当前是第几次执行

1、在本地保存执行日志&#xff1a; 在终端中执行时因为指定了-s参数&#xff0c;所以会打印相关信息&#xff0c;可以帮助我们后续定位问题&#xff1a; 但是显示在终端时后面无法查看&#xff0c;所以需要把执行日志保存在本地&#xff0c;使用tee 或 重定向符号>&#x…

2024年8个最佳在线websocket调试工具选择

精选了 8 款功能强大且易于使用的 WebSocket 测试工具&#xff1a; 工具名称支持的系统是否免费ApifoxWindows, Mac, Linux是WebSocket KingWindows, Mac, Linux是PostmanWindows, Mac, Linux是Socket.IO Test ClientWindows, Mac, Linux是InsomniaWindows, Mac, Linux是Wires…

H5流媒体播放器EasyPlayer.js播放器wasm编译打包之后报uncaught referenceErro的原因排查

EasyPlayer.js H5播放器&#xff0c;是一款能够同时支持HTTP、HTTP-FLV、HLS&#xff08;m3u8&#xff09;、WS、WEBRTC、FMP4视频直播与视频点播等多种协议&#xff0c;支持H.264、H.265、AAC、G711A、Mp3等多种音视频编码格式&#xff0c;支持MSE、WASM、WebCodec等多种解码方…

初识算法 · 位运算(2)

目录 前言&#xff1a; 判定字符是否唯一 丢失的数字 比特位计数 只出现一次的数字III 前言&#xff1a; ​本文的主题是位运算&#xff0c;通过四道题目讲解&#xff0c;一道是判断字符是否唯一&#xff0c;一道是只出现一次的数字III&#xff0c;一道是比特位计数&…

丹摩征文活动 | 丹摩智算平台:服务器虚拟化的璀璨明珠与实战秘籍

丹摩DAMODEL&#xff5c;让AI开发更简单&#xff01;算力租赁上丹摩&#xff01; 目录 一、引言 二、丹摩智算平台概述 &#xff08;一&#xff09;平台架构 &#xff08;二&#xff09;平台特点 三、服务器虚拟化基础 &#xff08;一&#xff09;虚拟化的概念 &#xf…

[Docker#6] 镜像 | 常用命令 | 迁移镜像 | 压缩与共享

目录 Docker 镜像是什么 生活案例 为什么需要镜像 镜像命令详解 实验 1.一些操作 1. 遍历查看镜像 2. 查看镜像仓库在本地的存储信息 进入镜像存储目录 查看 repositories.json 文件 3. 镜像过滤 4. 下载镜像时的分层 实战一&#xff1a;离线迁移镜像 实战二&…

信用租赁系统的灵活配置与智能化管理助力租赁市场发展

内容概要 在现代租赁市场中&#xff0c;信用租赁系统就像一把金钥匙&#xff0c;打开了灵活配置与智能化管理的大门。首先&#xff0c;让我们看看它是如何运作的。这个系统允许用户根据自身需求自定义设备类型和信用分比例&#xff0c;不同租赁形式的选择使得整个过程更加个性…

Java基于SpringBoot+Vue框架的宠物寄养系统(V2.0),附源码,文档

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

游戏引擎学习第四天

视频参考:https://www.bilibili.com/video/BV1aDmqYnEnc/ BitBlt 是 Windows GDI&#xff08;图形设备接口&#xff09;中的一个函数&#xff0c;用于在设备上下文&#xff08;device context, DC&#xff09;之间复制位图数据。BitBlt 的主要用途是将一个图像区域从一个地方复…