C#调用短信接口(通过简单的工厂模式整合多个短信平台)

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Web;

namespace DUANXIN
{
    public class SendSmsFactory
    {
        public static SendSmsBase CreateFactory(string className)
        {
            SendSmsBase sendsms = null;
            switch(className)
            {
                case "WJSendSms":
                      sendsms = new WJSendSms();
                      break;
                case "DXTSMSsend":
                      sendsms = new DXTSMSsend();
                      break;
                default:
                      sendsms = null;
                      break;

            }
            return sendsms;
        }
    }
    public class SendSmsBase
    {
        public string Name{get;set;} //用户名
        public string Key {get;set;} //接口秘钥
        public virtual string SendSmsInfo(string smsMob, string smsText)
        {
            return string.Empty;
        }

    }
    public class WJSendSms : SendSmsBase
    {
        //平台地址 http://www.smschinese.cn/

        public WJSendSms()
        {
            Name = "m386161511"; //用户名
            Key = "ce10b1813233ad17a162"; //接口秘钥
        }
        public override string SendSmsInfo(string smsMob, string smsText)
        {
            string url = "http://utf8.sms.webchinese.cn/?Uid=" + Name + "&key=" + Key + "&smsMob=" + smsMob + "&smsText=" + smsText;
            string strRet = null;
            if (url == null || url.Trim().ToString() == "")
            {
                return strRet;
            }
            string targeturl = url.Trim().ToString();
            try
            {
                HttpWebRequest hr = (HttpWebRequest)WebRequest.Create(targeturl);
                hr.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
                hr.Method = "GET";
                hr.Timeout = 30 * 60 * 1000;
                WebResponse hs = hr.GetResponse();
                Stream sr = hs.GetResponseStream();
                StreamReader ser = new StreamReader(sr, Encoding.Default);
                strRet = ser.ReadToEnd();
            }
            catch (Exception ex)
            {
                strRet = null;
            }
            return GetResult(strRet);
        }
        /// <summary>确认返回信息 </summary>
        public string GetResult(string strRet)
        {
            int result = 0;
            try
            {
                result = int.Parse(strRet);
                switch (result)
                {
                    case -1:
                        strRet = "没有该用户账户";
                        break;
                    case -2:
                        strRet = "接口密钥不正确,不是账户登陆密码";
                        break;
                    case -21:
                        strRet = "MD5接口密钥加密不正确";
                        break;
                    case -3:
                        strRet = "账户余额不足";
                        break;
                    case -11:
                        strRet = "该用户被禁用";
                        break;
                    case -14:
                        strRet = "短信内容出现非法字符";
                        break;
                    case -4:
                        strRet = "手机号格式不正确";
                        break;
                    case -41:
                        strRet = "手机号码为空";
                        break;
                    case -42:
                        strRet = "短信内容为空";
                        break;
                    case -51:
                        strRet = "短信签名格式不正确,接口签名格式为:【签名内容】";
                        break;
                    case -6:
                        strRet = "IP限制";
                        break;
                    default:
                        strRet = "发送短信数量:" + result;
                        break;
                }
            }
            catch (Exception ex)
            {
                strRet = ex.Message;
            }
            return strRet;
        }
    }
    public  class DXTSMSsend : SendSmsBase
    {
        //平台地址 http://www.106jiekou.com/

        public DXTSMSsend()
        {
            Name = "m386161511";
            Key = "m386161511";
        }
        public override string SendSmsInfo(string mobile, string content)
        {
            string PostUrl = "http://sms.106jiekou.com/utf8/sms.aspx";
            string returncode = string.Empty;
            string postStrTpl = "account={0}&password={1}&mobile={2}&content={3}";
            UTF8Encoding encoding = new UTF8Encoding();
            byte[] postData = encoding.GetBytes(string.Format(postStrTpl, Name, Key, mobile, content));
            HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(PostUrl);
            myRequest.Method = "POST";
            myRequest.ContentType = "application/x-www-form-urlencoded;charset=UTF-8";
            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);
                returncode = reader.ReadToEnd();

            }
            else
            {
                returncode = "000";
            }
            return GetResult(returncode);
        }
        public string GetResult(string returncode)
        {
            string returntext = string.Empty;
            switch (Convert.ToInt32(returncode))
            {
                case 100:
                    returntext = "发送成功";
                    break;
                case 101:
                    returntext = "验证失败";
                    break;
                case 102:
                    returntext = "手机号码格式不正确";
                    break;
                case 103:
                    returntext = "会员级别不够";
                    break;
                case 104:
                    returntext = "内容未审核";
                    break;
                case 105:
                    returntext = "内容过多";
                    break;
                case 106:
                    returntext = "账户余额不足";
                    break;
                case 107:
                    returntext = "Ip受限";
                    break;
                case 108:
                    returntext = "手机号码发送太频繁,请换号或隔天再发";
                    break;
                case 109:
                    returntext = "帐号被锁定";
                    break;
                case 110:
                    returntext = "手机号发送频率持续过高,黑名单屏蔽数日";
                    break;
                case 120:
                    returntext = "系统升级";
                    break;
                default:
                    returntext = "访问失败";
                    break;
            }
            return returntext;

        }
    }
}

简单使用演示(记得引入using DUANXIN)

                    SendSmsBase SmsClass = new SendSmsBase();
                    SmsClass = SendSmsFactory.CreateFactory("DXTSMSsend");
                    string content = "您的手机号:" + model.Phone + ",注册验证码:" + code + ",一天内提交有效,如不是本人操作请忽略!";
                    returncode=SmsClass.SendSmsInfo(model.Phone, content);
                    if (returncode == "账户余额不足")
                    {

                       SmsClass = SendSmsFactory.CreateFactory("WJSendSms");
                        SmsClass.SendSmsInfo(model.Phone, content);
                    }

注意有些短信平台有模板限制,

也可自己继续添加短信接口以实现暂时的免费发送。

时间: 2024-12-26 20:28:35

C#调用短信接口(通过简单的工厂模式整合多个短信平台)的相关文章

简单的工厂模式

从今天开始 每天进步一点点.开始了解并学习设计模式,就从简单的工厂模式开始吧.... 简单工厂模式(Simple Factory):不利于产生系列产品 简单工厂模式又称静态工厂方法模式.重命名上就可以看出这个模式一定很简单.它存在的目的很简单:定义一个用于创建对象的接口. 在简单工厂模式中,一个工厂类处于对产品类实例化调用的中心位置上,它决定那一个产品类应当被实例化, 如同一个交通警察站在来往的车辆流中,决定放行那一个方向的车辆向那一个方向流动一样. 先来看看它的组成: 1) 工厂类角色:这是本

大话设计模式之简单的工厂模式

第一章:代码无错就是优-简单的工厂模式 先建立一个计算类Operation Operation.h文件 @interface Operation : NSObject @property(nonatomic,assign)double numberA; @property(nonatomic,assign)double numberB; @end Operation.m文件 @implementation Operation @end 然后分别创建他们的子类Add,Sub,Mul,Div Add

从接口、抽象类到工厂模式再到JVM来总结一些问题

俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习! 涉及到的知识点总结如下: 为什么使用接口? 接口和抽象类的区别 简单工厂模式总结 Java中new和newInstance的区别 Java的Class.forName(xxx); Java里创建对象的几个方式总结 Java类加载机制总结 Java WEB的三层架构和MVC的关系 工厂方法模式总结 抽象工厂模式总结 一道面试题的分析 一个服务提供者框架的学习 接口的另一常用法:策略模式 参考资料 先看这样一个场景:某个果园里现在有

java简单的工厂模式

定义:专门定义一个类来创建其他类的实例,被创建的实例通常都具有共同的父类和接口.意图:提供一个类由它负责根据一定的条件创建某一及具体类的实例 //简单工厂,存在不符合开闭原则的地方,可以在参考抽象工厂/工厂方法 //输入苹果,就可以通过工厂直接调用采摘苹果,而不用new一个Apple public class factoryDemo { public static void main(String[] args) { // TODO Auto-generated method stu Facto

java深入浅出设计模式----简单的工厂模式(一)----业务逻辑分离

现在可扩展性和可维护性特别强,即便是想要计算多个数,那也很容易了,改动的地方很少.而且还能防止恶意的程序员篡改代码. 如果需要进行两个以上的数字的运算,在该接口中添加方法就行了. package separatetwo.operate; public interface Operate { public abstract int getResult(int numberOne, int numberTwo); } 加法 package separatetwo.operate; public cl

【简单的工厂模式】一个简单的计算器

对于一个对设计模式一无所知的程序员来说,维护成本,无疑是一个致命的问题,所以从今开始,我要开始努力学习,设计模式,在这里,记录自己的学习成果 生产类 abstract class Oper 抽象类 class Add 加 class Sub 减 class Mul 乘 class Div 除 class Operate 计算 abstract class Oper { public $num1 = 0; public $num2 = 0; abstract public function get

c++ 设计模式之简单的工厂模式

调试环境:vs2010 // test0.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using namespace std; class COperation { public: int first; int second; virtual double getResult() { return 0; } }; class addOperation : public COperation

Factory(简单的工厂模式)

一句话总结:用一个方法来代替new关键字解决什么问题:对象产生过多,或者经常有子类替换生成.项目里面怎么用:对于经常生成的对象,或者父子类替换的对象.模式结构:写一个对外声明的方法,方法里面使用new关键字代替.框架里面使用:spring的核心就是工厂模式. 工厂方法模式:有四个角色,抽象工厂模式,具体工厂模式,抽象产品模式,具体产品模式.不再是由一个工厂类去实例化具体的产品,而是由抽象工厂的子类去实例化产品 // 抽象产品角色 public interface Moveable { void

如何防范短信接口被恶意调用(被刷)(转)

本文转自:https://zhuanlan.zhihu.com/p/20879468 一.什么是短信轰炸(短信接口被刷) 短信轰炸一般基于 WEB 方式(基于客户端方式的原理与之类似),由两个模块组成,包括:一个前端 Web 网页,提供输入被攻击者手机号码的表单:一个后台攻击页面(如 PHP),利用从各个网站上找到的动态短信 URL 和 前端输入的被攻击者手机号码,发送 HTTP 请求,每次请求给用户发送一个动态短信. - 被攻击者大量接收非自身请求的短信,造成无法正常使用移动运营商业务.- 短