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

embedded/2024/11/14 17:54:13/

目录

功能实现

范例运行环境

实现范例

类设计

类代码实现

调用范例

总结


功能实现

融合云通信服务平台,为企业提供全方位通信服务,发送手机短信是其一项核心功能,本文将讲述如何使用融合云服务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.ppmy.cn/embedded/137560.html

相关文章

Linux基础—ssh和nfs

ssh远程管理 s secure s shell&#xff1a;加密的安全通信协议 1、实现字符串界面的远程登陆 2、远程复制 3、sftp&#xff1a;加密的文件传输协议 4、免密登陆&#xff08;密钥对实现远程登陆&#xff09; 实验 字符串界面的远程登陆 22端口 roottest1-2:/opt/sun1# s…

Day43 | 动态规划 :状态机DP 买卖股票的最佳时机买卖股票的最佳时机II

Day43 | 动态规划 &#xff1a;状态机DP 买卖股票的最佳时机&&买卖股票的最佳时机II 动态规划应该如何学习&#xff1f;-CSDN博客 本次题解参考自灵神的做法&#xff0c;大家也多多支持灵神的题解 买卖股票的最佳时机【基础算法精讲 21】_哔哩哔哩_bilibili 动态规…

YUM 的使用

YUM 是一个用于 Fedora 和 Red Hat 以及 CentOS 操作系统的前端软件包管理器&#xff0c;它可以自动处理依赖关系并一次性安装所有必需的软件包。 镜像站点选择 1. 备份原有的镜像源配置文件 系统默认的 yum 镜像源配置文件存储在 /etc/yum.repos.d/ 目录下&#xff0c;可以…

算法——螺旋矩阵II(leetcode59)

给你一个正整数 n &#xff0c;生成一个包含 1 到 n^2所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 对于螺旋矩阵来讲难点主要在于行或列放置元素时的边界条件&#xff0c;我们遵循一个循环不变量原则在放置行或列元素时遵循左闭右开来放置元…

Tcp/Ip协议,tcp相关文章,网络编程,通信协议文章汇总

学习时候&#xff0c;有些书籍过一段时间就忘记了。常读常新&#xff0c;特此留下地址方便再次阅读&#xff01; 都是网络协议相关的&#xff0c;tcp/ip, arp, dhcp, icmp, http 1. tcp/ip 协议卷 《TCP/IP详解 卷1&#xff1a;协议》在线阅读版&#xff08;全网唯一&#xf…

redis和数据库的数据一致性

在我们使用redis作为缓存的时候&#xff0c;数据库和缓存数据保持一致性就显得尤为重要&#xff0c;因为如果不做处理的话很有可能读取到的数据会出现差错&#xff0c;那这里怎么进行解决呢&#xff1f; 首先我们先来看一下操作数据到底是直接删除数据还是说通过修改的方式来修…

单元测试、集成测试、系统测试、验收测试、压力测试、性能测试、安全性测试、兼容性测试、回归测试(超详细的分类介绍及教学)

目录 1.单元测试 实现单元测试的方法&#xff1a; 注意事项&#xff1a; 2.集成测试 需注意事项&#xff1a; 实现集成测试的方法&#xff1a; 如何实现高效且可靠的集成测试&#xff1a; 3.系统测试 实现系统测试的方法: 须知注意事项&#xff1a; 4.验收测试 实现验…

网络通信NetClient实现

网络通信NetClient实现 前言 上一集我们就完成了数据中心类的内容&#xff0c;那么我们开始需要进行网络的通信&#xff0c;我们这一集就要封装一个类来帮我们实现网络上的通信。 需求分析 我们这个NetClient类需要完成的事情其实也就那几件&#xff0c;我们之前规定了我们…