最近在做一個學校短信項目,使用了第三方提供的短信接口,現将本次封裝好的短信接口幫助類分享一下:
下面是發送界面,還未美化完,支援學校各種形式的短信發送功能。
下面是封裝好的方法,支援餘額查詢,批量發送等多種功能。
/// <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,
}