C#.NET短信通用接口设计-调用短信API案例|C/S框架网
C#.NET短信通用接口设计-调用短信API案例|C/S框架网
我们在研发不同平台的C#.NET软件项目时,如:C/S Winform项目、B/S Web项目、移动端APP等项目,通常会在某个业务流程给终端用户发送短信,或者系统自动发送短信,或者触发某个事件发送短信,类似这种需求我们有多个成功案例,调用不同短信供应商的API接口,请参考下面源码: 短信通用接口: C# Code: /// <summary> /// 短信服务供应商统一接口 /// </summary> public interface ISMSSupplier { /// <summary> /// 短信签名 /// </summary> string Singatrure { get; set; } /// <summary> /// 短信服务商名称 /// </summary> string SupplierName { get; } /// <summary> /// 每条短信最大长度 /// </summary> int MessageMaxLength { get; } /// <summary> /// 短信接口初始化 /// </summary> void Init(); /// <summary> /// 注销 /// </summary> void Logout(); /// <summary> /// 发送短信 /// </summary> /// <param name="phoneNos">手机号码</param> /// <param name="message">短信内容</param> /// <returns></returns> bool Send(string[] phoneNos, string message); /// <summary> /// 查询单价 /// </summary> /// <returns></returns> double GetPrice(); /// <summary> /// 查询余额 /// </summary> /// <returns></returns> double GetBalance(); /// <summary> /// 充值 /// </summary> /// <param name="cardNo">卡号</param> /// <param name="cardPassword">密码</param> /// <returns></returns> bool Charge(string cardNo, string cardPassword); /// <summary> /// 根据短信模板生成短信 /// </summary> /// <param name="param"></param> /// <returns></returns> string BuildSMS(int templateID, string[] param); } //来源:C/S框架网(www.csframework.com) QQ:23404761 阿里云短信接口实例: C# Code: /// <summary> /// 阿里云短信接口 /// </summary> public class SMS_Aliyun : ISMSSupplier { public string Singatrure { get; set; } public string SupplierName { get { return "阿里云短信"; } } public int MessageMaxLength { get { return 0; } } public SMS_Aliyun() { this.Singatrure = "C/S框架网"; } public void Init() { } public void Logout() { } public string BuildSMS(int templateID, string[] param) { if (templateID == 1 && param.Length == 1) { return "{\"code\":\"" + param[0] + "\"}"; } return ""; } public bool Send(string[] phoneNos, string message) { String product = "Dysmsapi";//短信API产品名称 String domain = "dysmsapi.aliyuncs.com";//短信API产品域名 String accessKeyId = "XLAINMW7DcywFd58";//你的accessKeyId String accessKeySecret = "5kN9GQGSTLk3zUdGtm33Z5Qq2YZMZ9x";//你的accessKeySecret IClientProfile profile = DefaultProfile.GetProfile("cn-hangzhou", accessKeyId, accessKeySecret); DefaultProfile.AddEndpoint("cn-hangzhou", "cn-hangzhou", product, domain); IAcsClient acsClient = new DefaultAcsClient(profile); SendSmsRequest request = new SendSmsRequest(); try { //必填:待发送手机号。支持以逗号分隔的形式进行批量调用,批量上限为20个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式 request.PhoneNumbers = GetPhoneString(phoneNos); //必填:短信签名-可在短信控制台中找到 request.SignName = "C/S框架网"; //必填:短信模板-可在短信控制台中找到 request.TemplateCode = "SMS_138920016"; //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为 request.TemplateParam = message; //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者 request.OutId = Guid.NewGuid().ToString().ToLower(); //请求失败这里会抛ClientException异常 SendSmsResponse sendSmsResponse = acsClient.GetAcsResponse(request); System.Console.WriteLine(sendSmsResponse.Message); return sendSmsResponse.Code == "OK"; } catch (ServerException e) { return false; } catch (ClientException e) { return false; } } private string GetPhoneString(string[] phones) { StringBuilder sb = new StringBuilder(); foreach (String S in phones) sb.Append(S + ","); return sb.ToString(); } public double GetPrice() { return 0; } public double GetBalance() { return 0; } public bool Charge(string cardNo, string cardPassword) { return true; } } //来源:C/S框架网(www.csframework.com) QQ:23404761 上海互亿无线短信接口实例: /// <summary> /// 上海互亿无线 /// </summary> public class SMS_IHUYI : ISMSSupplier { public string Singatrure { get; set; } public string SupplierName { get { return "上海互亿无线"; } } public int MessageMaxLength { get { return 0; } } public void Init() { } public void Logout() { } public string BuildSMS(int templateID, string[] param) { if (templateID == 1 && param.Length == 1) { string tmp = "您的验证码是:[" + param[0] + "]。"; return tmp; } return ""; } public bool Send(string[] phoneNos, string message) { //http://106.ihuyi.cn/webservice/sms.php?method=Submit //http://106.ihuyi.cn/webservice/sms.php?smsService try { string account = "cf_yq66sc"; string password = "fb4f7ee87686920be1717a23552fd22"; string mobile = phoneNos[0]; string postStrTpl = "account={0}&password={1}&mobile={2}&content={3}"; string PostUrl = "http://106.ihuyi.cn/webservice/sms.php?method=Submit"; UTF8Encoding encoding = new UTF8Encoding(); byte[] postData = encoding.GetBytes(string.Format(postStrTpl, account, password, mobile, message)); HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(PostUrl); myRequest.Method = "POST"; myRequest.ContentType = "application/x-www-form-urlencoded"; myRequest.ContentLength = postData.Length; Stream newStream = myRequest.GetRequestStream(); newStream.Write(postData, 0, postData.Length); newStream.Flush(); newStream.Close(); HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse(); if (myResponse.StatusCode == HttpStatusCode.OK) { StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8); string res = reader.ReadToEnd(); int len1 = res.IndexOf("</code>"); int len2 = res.IndexOf("<code>"); string code = res.Substring((len2 + 6), (len1 - len2 - 6)); //Response.Write(code); //405 //你提交过来的短信内容必须与报备过的模板格式相匹配 int len3 = res.IndexOf("</msg>"); int len4 = res.IndexOf("<msg>"); string msg = res.Substring((len4 + 5), (len3 - len4 - 5)); return code == "2"; } else { return false; } } catch { return false; } } public double GetPrice() { return 0; } public double GetBalance() { return 0; } public bool Charge(string cardNo, string cardPassword) { return true; } } 短信API对象工厂: C# Code: /// <summary> /// 短信中心 /// </summary> public class SMSFactory { //当前短信供应商 private static ISMSSupplier _Supplier = null; static SMSFactory() { string supplier = System.Configuration.ConfigurationManager.AppSettings["SMSSupplier"]; if (supplier == "Aliyun") _Supplier = new SMS_Aliyun(); if (supplier == "IHUYI") _Supplier = new SMS_IHUYI(); } /// <summary> /// 当前短信供应商 /// </summary> public static ISMSSupplier Supplier { get { return _Supplier; } set { _Supplier = value; } } } //来源:C/S框架网(www.csframework.com) QQ:23404761 如何使用? C# Code: //短信验证码 string code="212343"; //构建短信模板 string msg = SMSFactory.Supplier.BuildSMS(1, new string[] { code }); bool send = SMSFactory.Supplier.Send(new string[] { phone }, msg);
参考文档:
C# C/S框架高级搜索功能-接口设计 C#.Net CS开发框架实现多语言(C/S框架网) C#.NET WEBAPI 接口设计与调用 C#.NET WEBAPI 接口设计-调用多个参数的接口 C/S框架网提供基于C#.NET前端Winform开发框架及后端WebApi开发框架 C#开源框架 | .NET开源快速开发平台 | C/S框架网 关于C/S框架网C#.NET快速开发框架现场培训 基于C/S三层架构的WCF开发框架接口调用流程|C/S框架网 .Net项目源码(C#+VS)成功案例展示中心 | C/S框架网 Winform通用框架(C#.NET)之权限管理系统详细设计|C/S框架网 基于C#.NET标准三层架构订单管理系统 (OMS)|C/S框架网 C#.NET二次开发框架,二次开发平台产品介绍-C/S框架网 微信支付后台服务器返回的接口通知notify_url(回调接口设计)-C/S框架网 VS.NET后端框架,C#.NET开发的服务器端开发框架 - C/S框架网 C#.NET IP端口绑定SSL证书支持HTTPS协议(用于Win服务自承载WebApi服务器) - C/S框架网原创
其它资料:
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 | |