天天看點

一個比較完整的短信接口幫助類參考

最近在做一個學校短信項目,使用了第三方提供的短信接口,現将本次封裝好的短信接口幫助類分享一下:

下面是發送界面,還未美化完,支援學校各種形式的短信發送功能。

一個比較完整的短信接口幫助類參考

下面是封裝好的方法,支援餘額查詢,批量發送等多種功能。

/// <summary>
    /// 短信接口幫助類
    /// 
    /// 
    /// 修改紀錄
    /// 
    /// 2016-07-02 版本:1.0 SongBiao 建立檔案。
    /// 
    /// <author>
    ///     <name>SongBiao</name>
    ///     <date>2016-07-02</date>
    /// </author>
    /// </summary>

    public class MobilleMessageHelper
    {
        /// <summary>
        /// 短信服務位址
        /// </summary>
        const string Url = "http://XXXX.com/api/MsgSend.asmx";
        /// <summary>
        /// 短信賬号
        /// </summary>
        const string UserCode = "xxxxx";
        /// <summary>
        /// 短信密碼
        /// </summary>
        const string UserPass = "yyyyy";
        /// <summary>
        /// 簽名
        /// </summary>
        public const string Signature = "【宜賓鴻輝】";
        /// <summary>
        /// 通道号
        /// </summary>
        const string  Channel="178";
        /// <summary>
        /// 擴充号
        /// </summary>
        const string  ExeNo="擴充号";

        #region http 請求及加密
        /// <summary>
        /// http get請求
        /// </summary>
        /// <param name="url"></param>
        /// <param name="data"></param>
        /// <returns></returns>
        public static string HttpGet(string url, string data)
        {
            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url + "?" + data);
                request.Method = "GET";
                request.ContentType = "text/html;charset=UTF-8";
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                Stream myResponseStream = response.GetResponseStream();
                StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
                string retString = myStreamReader.ReadToEnd();
                myStreamReader.Close();
                myResponseStream.Close();
                return retString;
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }

        /// <summary>
        ///  http post請求
        /// </summary>
        /// <param name="url"></param>
        /// <param name="data"></param>
        /// <returns></returns>
        public static string HttpPost(string url, string data)
        {
            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                request.Method = "POST";
                request.ContentType = "application/x-www-form-urlencoded";
                byte[] info = Encoding.UTF8.GetBytes(data);
                using (Stream stream = request.GetRequestStream())
                {
                    stream.Write(info, 0, info.Length);
                }
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                Stream myResponseStream = response.GetResponseStream();
                StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
                string retString = myStreamReader.ReadToEnd();
                myStreamReader.Close();
                myResponseStream.Close();
                return retString;
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }

        /// <summary>
        /// DES加密
        /// </summary>
        /// <param name="str"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        public static string EncodeStr(string str, string key) 
        {
            try
            {
                DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
                provider.Key = Encoding.ASCII.GetBytes(key.Substring(0, 8));
                provider.IV = Encoding.ASCII.GetBytes(key.Substring(0, 8));
                byte[] bytes = Encoding.GetEncoding("GB2312").GetBytes(str);
                MemoryStream stream = new MemoryStream();
                CryptoStream stream2 = new CryptoStream(stream, provider.CreateEncryptor(), CryptoStreamMode.Write);
                stream2.Write(bytes, 0, bytes.Length);
                stream2.FlushFinalBlock();
                StringBuilder builder = new StringBuilder();
                foreach (byte num in stream.ToArray())
                {
                    builder.AppendFormat("{0:X2}", num);
                }
                stream.Close();
                return builder.ToString();
            }
            catch (Exception ex) 
            { 
                return ex.Message; 
            }
        }

        /// <summary>
        /// //SHA1加密
        /// </summary>
        /// <param name="strSha1In"></param>
        /// <returns></returns>
        public static string SHA1Hash(string strSha1In)
        {
            SHA1 sha1 = new SHA1CryptoServiceProvider();
            byte[] bytesSha1In = UTF8Encoding.Default.GetBytes(strSha1In);
            byte[] bytesSha1Out = sha1.ComputeHash(bytesSha1In);
            string strSha1Out = BitConverter.ToString(bytesSha1Out);
            strSha1Out = strSha1Out.Replace("-", "");
            return strSha1Out;
        }
 
        #endregion

        /*
        傳回值類型
        string
        成功傳回值
        傳回使用者金額的數字
        失敗傳回值
        傳回帶負号的失敗代碼
         */
        
        #region 餘額查詢
        /// <summary>
        /// POST方式請求 餘額查詢
        /// </summary>
        /// <returns></returns>
        public static string GetBalanceByPost()
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("userCode="+UserCode+"&");
            sb.Append("userPass="+UserPass);

            string result = HttpPost(Url + "/GetBalance", sb.ToString());
            return result;
        }

        /// <summary>
        /// Get方式請求 餘額查詢
        /// </summary>
        /// <returns></returns>
        public static string GetBalanceByGet()
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("userCode="+UserCode+"&");
            sb.Append("userPass="+UserPass);

            string result = HttpGet(Url + "/GetBalance", sb.ToString());
            return result;
        }

        //private void getbalance()
        //{
        //    TopenServiceReference.MsgSendSoapClient topen = new TopenServiceReference.MsgSendSoapClient();
        //    string userName = "使用者名";
        //    string passWord = "密碼";
        //    string sendResult = topen.GetBalance(userName, passWord);

        //    //然後,根據傳回的sendResult作相應處理
        //} 
        #endregion

        /*
        傳回值類型
        string
        成功傳回值
        傳回本次送出的批次号(如:2114355899380234221),(或叫序列号、流水号等,送出一次傳回一個)
        失敗傳回值
        傳回帶負号的失敗代碼
        */
        #region 短信發送
        /// <summary>
        /// POST方式請求 短信發送 手機号碼,多個号碼用英文半形逗號分隔例如:13900000000,13900000001每次送出不多于500個号碼 
        /// </summary>
        /// <param name="desNo"></param>
        /// <param name="msg"></param>
        /// <returns>傳回本次送出的批次号(如:2114355899380234221),(或叫序列号、流水号等,送出一次傳回一個) ;失敗傳回值 傳回帶負号的失敗代碼</returns>
        public static string SendMsgByPost(string desNo, string msg)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("userCode="+UserCode+"&");
            sb.Append("userPass="+UserPass+"&");
            sb.Append("DesNo="+desNo+"&");
            sb.Append("Msg="+msg+Signature+"&");
            sb.Append("Channel="+Channel);

            string result = HttpPost(Url + "/sendMes", sb.ToString());
            return result;
        }

        /// <summary>
        /// Get方式請求 短信發送 手機号碼,多個号碼用英文半形逗號分隔例如:13900000000,13900000001每次送出不多于500個号碼 
        /// </summary>
        /// <param name="desNo"></param>
        /// <param name="msg"></param>
        /// <returns>傳回本次送出的批次号(如:2114355899380234221),(或叫序列号、流水号等,送出一次傳回一個) ;失敗傳回值 傳回帶負号的失敗代碼</returns>
        public static string SendMsgByGet(string desNo, string msg)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("userCode="+UserCode+"&");
            sb.Append("userPass="+UserPass+"&");
            sb.Append("DesNo="+desNo+"&");
            sb.Append("Msg="+msg+Signature+"&");
            sb.Append("Channel="+Channel);

            string result = HttpGet(Url + "/sendMes", sb.ToString());
            return result;
        }

        /// <summary>
        /// /POST方式請求 加密短信發送 手機号碼,多個号碼用英文半形逗號分隔例如:13900000000,13900000001每次送出不多于500個号碼 
        /// </summary>
        /// <param name="desNo"></param>
        /// <param name="msg"></param>
        /// <returns>傳回本次送出的批次号(如:2114355899380234221),(或叫序列号、流水号等,送出一次傳回一個) ;失敗傳回值 傳回帶負号的失敗代碼</returns>
        public static string SendMsgEncryptByPost(string desNo, string msg)
        {
            string encryptCode =
                EncodeStr(
                    "userPass=" + UserPass + "&DesNo=" + desNo + "&Msg=" + msg + Signature + "&Channel=" + Channel,
                    SHA1Hash(UserPass));
            StringBuilder sb = new StringBuilder();
            sb.Append("userCode="+UserCode+"&");
            sb.Append("submitInfo="+encryptCode);
            string result = HttpPost(Url + "/sendMsgByEncrypt", sb.ToString());

            return result;
        }

        /// <summary>
        /// Get方式請求 加密短信發送 手機号碼,多個号碼用英文半形逗號分隔例如:13900000000,13900000001每次送出不多于500個号碼 
        /// </summary>
        /// <param name="desNo"></param>
        /// <param name="msg"></param>
        /// <returns>傳回本次送出的批次号(如:2114355899380234221),(或叫序列号、流水号等,送出一次傳回一個) ;失敗傳回值 傳回帶負号的失敗代碼</returns>
        public static string SendMsgEncryptByGet(string desNo, string msg) 
        {
            string encryptCode=EncodeStr("userPass="+UserPass+"&DesNo="+desNo+"&Msg="+msg+Signature+"&Channel="+Channel,SHA1Hash(UserPass));
            StringBuilder sb = new StringBuilder();
            sb.Append("userCode="+UserCode+"&");
            sb.Append("submitInfo="+encryptCode);
            string result = HttpGet(Url + "/sendMsgByEncrypt", sb.ToString());

            return result;
        }

        /// <summary>
        ///  POST方式請求 個性化短信發送
        /// 例如,需發送如下短信
        /// 13800000000 王某某,明天記得要開會【123】
        /// 13800000000 張某某,明天記得要開會【123】
        /// 13800000000 李某某,明天記得要開會【123】
        /// 最終拼接url如下:http://yes.itissm.com/api/IndividualSm.aspx?account=admin1&pwd=123&channel=37&msg=13800000000|!|王某某,明天記得要開會【123】|^|13900000000|!|張某某,明天記得要開會【123】|^|18600000000|!|李某某,明天記得要開會【123】
        /// </summary>
        /// <param name="msg">短信内容為utf-8編碼每條個性化短信以英文|^|分割,号碼與短信内容以英文|!|分割</param>
        /// <returns>傳回本次送出的批次号(如:2114355899380234221),(或叫序列号、流水号等,送出一次傳回一個) ;失敗傳回值 傳回帶負号的失敗代碼</returns>
        public static string IndividUalsmByPost(string msg)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("account="+UserCode+"&");
            sb.Append("pwd="+UserPass+"&");
            sb.Append("Channel="+Channel+"&");
            //sb.Append("Msg=手機号|!|短信内容【簽名】|^|手機号|!|短信内容【簽名】|^|");
            sb.Append("Msg="+msg);

            string result = HttpPost(Url,sb.ToString());
            return result;
        }

        //private void SendSms() //webservice請求方式
        //{
        //    TopenServiceReference.MsgSendSoapClient topen = new TopenServiceReference.MsgSendSoapClient();
        //    string userName = "使用者名";
        //    string passWord = "密碼";
        //    string mobiles = "13900000000,13800000000,13100000000,……";
        //    string msgContent = "短信内容(含簽名)";
        //    string channel = "由拓鵬給您的通道編号";
        //    string sendResult = topen.sendMes(userName, passWord, mobiles, msgContent, channel); //此處的sendMes可能因接口文檔不同而不同,請注意。傳回批次号,可儲存下來,作為擷取發送報告憑據

        //    //然後,根據傳回的sendResult作相應處理
        //} 
        #endregion

        #region 短信擴充發送
        /// <summary>
        ///  POST方式請求 短信擴充發送
        /// </summary>
        /// <returns></returns>
        public static string SendMsgExtByPost(string desNo,string msg)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("userCode="+UserCode+"&");
            sb.Append("userPass="+UserPass+"&");
            sb.Append("DesNo="+desNo+"&");
            sb.Append("Msg="+msg+Signature+"&");
            sb.Append("Channel="+Channel+"&");
            sb.Append("ExeNo="+ExeNo);
            string result = HttpPost(Url + "/sendMesExt", sb.ToString());
            return result;
        }

        /// <summary>
        ///  Get方式請求 短信擴充發送
        /// </summary>
        /// <returns></returns>
        public static string SendMsgExtByGet(string desNo,string msg)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("userCode="+UserCode+"&");
            sb.Append("userPass="+UserPass+"&");
            sb.Append("DesNo="+desNo+"&");
            sb.Append("Msg="+msg+Signature+"&");
            sb.Append("Channel="+Channel+"&");
            sb.Append("ExeNo="+ExeNo);
            string result = HttpGet(Url + "/sendMesExt", sb.ToString());
            return result;
        }
        #endregion
     
        #region 擷取狀态報告
        /// <summary>
        ///  POST方式請求 擷取狀态報告
        /// </summary>
        /// <returns></returns>
        public static string GetReport2ByPost()
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("userCode="+UserCode+"&");
            sb.Append("userPass="+UserPass);

            string result = HttpPost(Url + "/GetReport2", sb.ToString());
            return result;
        }

        /// <summary>
        ///  Get方式請求 擷取狀态報告
        /// </summary>
        /// <returns></returns>
        public static string GetReport2ByGet()
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("userCode="+UserCode+"&");
            sb.Append("userPass="+UserPass);

            string result = HttpGet(Url + "/GetReport2", sb.ToString());
            return result;
        } 

        /// <summary>
        /// POST方式請求加密 擷取狀态報告
        /// </summary>
        /// <returns></returns>
        public static string GetReport2EncryptByPost()
        {
            string encryptCode=EncodeStr("userPass="+UserPass,SHA1Hash(UserPass));
            StringBuilder sb = new StringBuilder();
            sb.Append("userCode="+UserCode+"&");
            sb.Append("submitInfo="+encryptCode);

            string result = HttpPost(Url + "/GetReport2ByEncrypt", sb.ToString());

            return result;
        }

        /// <summary>
        /// Get方式請求加密 擷取狀态報告
        /// </summary>
        /// <returns></returns>
        public static string GetReport2EncryptByGet() 
        {
            string encryptCode=EncodeStr("userPass="+UserPass,SHA1Hash(UserPass));
            StringBuilder sb = new StringBuilder();
            sb.Append("userCode="+UserCode+"&");
            sb.Append("submitInfo="+encryptCode);

            string result = HttpGet(Url + "/GetReport2ByEncrypt", sb.ToString());
            return result;
        }
        #endregion

        #region 擷取回複
        /// <summary>
        /// POST方式請求 擷取回複
        /// </summary>
        /// <returns></returns>
        public static string GetMo2ByPost()
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("userCode="+UserCode+"&");
            sb.Append("userPass="+UserPass);
            string result = HttpPost(Url + "/GetMo2", sb.ToString());
            return result;
        }

        /// <summary>
        ///  Get方式請求 擷取回複
        /// </summary>
        /// <returns></returns>
        public static string GetMo2ByGet()
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("userCode="+UserCode+"&");
            sb.Append("userPass="+UserPass+"&");
            string result = HttpGet(Url + "/GetMo2", sb.ToString());
            return result;
        }
        /// <summary>
        /// POST方式請求 擷取回複(加密)
        /// </summary>
        /// <returns></returns>
        public static string GetMo2EncryptByPost()
        {
            string encryptCode=EncodeStr("userPass="+UserPass,SHA1Hash(UserPass));
            StringBuilder sb = new StringBuilder();
            sb.Append("userCode="+UserCode+"&");
            sb.Append("submitInfo="+encryptCode);
            string result = HttpPost(Url + "/GetMo2ByEncrypt", sb.ToString());
            return result;
        }
        /// <summary>
        /// Get方式請求 擷取回複(加密)
        /// </summary>
        /// <returns></returns>
        public static string GetMo2EncryptByGet()
        {
            string encryptCode = EncodeStr("userPass=密碼", SHA1Hash(UserPass));
            StringBuilder sb = new StringBuilder();
            sb.Append("userCode="+UserCode+"&");
            sb.Append("submitInfo="+encryptCode);
            string result = HttpGet(Url + "/GetMo2ByEncrypt", sb.ToString());
            return result;
        }        
        #endregion

        #region 擷取關鍵字
        /// <summary>
        ///  POST方式請求 擷取關鍵字
        /// </summary>
        /// <returns></returns>
        public static string GetKeywordsByPost()
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("userCode="+UserCode+"&");
            sb.Append("userPass="+UserPass+"&");
            sb.Append("Channel="+Channel);
            string result = HttpPost(Url + "/GetKeyWords", sb.ToString());
            return result;
        }

        /// <summary>
        /// Get方式請求 擷取關鍵字
        /// </summary>
        /// <returns></returns>
        public static string GetKeywordsByGet() 
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("userCode="+UserCode+"&");
            sb.Append("userPass="+UserPass+"&");
            sb.Append("Channel="+Channel);
            string result = HttpGet(Url + "/GetKeyWords", sb.ToString());
            return result;
        } 
        #endregion

    }

    /// <summary>
    /// 手機短信 雲信狀态枚舉
    /// </summary>
    public enum YunXinMessageStatus
    {
        /// <summary>
        /// -1 應用程式異常
        /// </summary>
        [EnumDescription("應用程式異常")]
        ApplicationError = -1,

        /// <summary>
        ///  -3 使用者名密碼錯誤或者使用者無效
        /// </summary>
        [EnumDescription("使用者名密碼錯誤或者使用者無效")]
        AccountError = -3,

        /// <summary>
        ///  -5 簽名不正确(格式為:XXX【簽名内容】), 注意:短信内容最後一個字元必須是】
        /// </summary>
        [EnumDescription("簽名不正确")]
        SignatureError = -5,

        /// <summary>
        ///  -6:keyWords 含有關鍵字keyWords(keyWords為敏感内容,如:-6:促銷)
        /// </summary>
        [EnumDescription("含有關鍵字")]
        KeyWordsNotAllow = -6,

        /// <summary>
        ///  -7 餘額不足
        /// </summary>
        [EnumDescription("餘額不足")]
        BalanceNotEnough = -7,

        /// <summary>
        ///   -8 沒有可用的通道,或不在時間範圍内
        /// </summary>
        [EnumDescription("餘額不足")]
        ChannelNoAvailable = -8,

        /// <summary>
        ///  -9 發送号碼一次不能超過1000個
        /// </summary>
        [EnumDescription("發送号碼一次不能超過1000個")]
        SendTooManyNumbers = -9,

        /// <summary>
        ///  -10 号碼數量大于允許上限(不設定上限時,不可超過1000)
        /// </summary>
        [EnumDescription("号碼數量大于允許上限(不設定上限時,不可超過1000)")]
        SendOverLimit = -10,

        /// <summary>
        ///  -11 号碼數量小于允許下限
        /// </summary>
        [EnumDescription("号碼數量小于允許下限")]
        SendLessLimit = -11,

        /// <summary>
        ///  -12 模闆不比對
        /// </summary>
        [EnumDescription("模闆不比對")]
        TemplateMismatch = -12,

        /// <summary>
        ///  -13 Invalid Ip ip綁定使用者,未綁定該ip
        /// </summary>
        [EnumDescription("ip綁定使用者,未綁定該ip")]
        InvalidIp = -13,

        /// <summary>
        ///  -14 使用者黑名單
        /// </summary>
        [EnumDescription("使用者黑名單")]
        UserBlackList = -14,

        /// <summary>
        ///  -15 系統黑名單
        /// </summary>
        [EnumDescription("系統黑名單")]
        SystemBlackList = -15,

        /// <summary>
        ///  -16 号碼格式錯誤
        /// </summary>
        [EnumDescription("号碼格式錯誤")]
        NumberFormatError = -16,

        /// <summary>
        ///  -17 無效号碼(格式正常,可不是正确的電話号碼,如12345456765)
        /// </summary>
        [EnumDescription("無效号碼")]
        InvalidNumber = -17,

        /// <summary>
        /// -18 沒有設定使用者的固定下發擴充,不能自定義擴充
        /// </summary>
        [EnumDescription("沒有設定使用者的固定下發擴充,不能自定義擴充")]
        CannotCustomizeExtension = -18,

        /// <summary>
        /// -19 強制模闆通道,不能使用個性化接口
        /// </summary>
        [EnumDescription("強制模闆通道,不能使用個性化接口")]
        CanNotUsePersonalized = -19,

        /// <summary>
        /// -20 包含非法字元
        /// </summary>
        [EnumDescription("包含非法字元")]
        ContainsIllegalCharacters = -20,

        /// <summary>
        /// -21 沒有找到對應的submitID設定
        /// </summary>
        [EnumDescription("沒有找到對應的submitID設定")]
        NoSubmitID = -21,

        /// <summary>
        /// -22 解密失敗
        /// </summary>
        [EnumDescription("解密失敗")]
        DecryptionFailure = -22,

        /// <summary>
        /// -23 查詢餘額過頻繁(至少間隔10秒)
        /// </summary>
        [EnumDescription("查詢餘額過頻繁(至少間隔10秒)")]
        QueryBalanceTooFrequent = -23,

    }