经过前两篇博客之后,我们已经成功的对短信内容等信息进行了维护,可以动态的添加新的内容。短信平台信息的维护界面和短信内容类似,就不在重复了。
那么下一步就是应该对其他系统提供短信验证服务了。这里采用WCF完成服务的远程调用。
BLL层对服务的封装
public class SMSVerification
{
#region 对外提供的方法发送短信SendSMS()-牛迁迁-2015年8月12日 17:30:32
/// <summary>
/// 对外提供的方法发送短信 SendSMS()
/// </summary>
/// <param name="captcha">短信验证码</param>
/// <param name="phoNumber">手机号码</param>
/// <param name="programKey">项目标识</param>
/// <param name="platform">短信平台名称</param>
/// <returns></returns>
public bool SendSMS(string captcha, string phoNumber, string programKey, string platform)
{
XmlReader readersms = null;
XmlReader readeruser = null;
try
{
//获取路径 ..\TGB.Common.Message\TGB.Common.Message.UI\XML下的XML文件
string smsxmlPath = System.Web.HttpContext.Current.Server.MapPath("~/XML/SMSContent.xml");
string userxmlPath = System.Web.HttpContext.Current.Server.MapPath("~/XML/SMSPlatform.xml");
XmlDocument smsxmlDoc = new XmlDocument();
XmlDocument userxmlDoc = new XmlDocument();
//设置,读取时忽略xml注释
XmlReaderSettings settings = new XmlReaderSettings();
settings.IgnoreComments = true;//忽略文档里面的注释
//加载SMS XML文件
readersms = XmlReader.Create(smsxmlPath, settings);
smsxmlDoc.Load(readersms);
//加载User XML文件
readersms = XmlReader.Create(userxmlPath, settings);
userxmlDoc.Load(readeruser);
//根据项目标识,从xml文件中加载对应的短信详情信息
XmlNode smsxn = smsxmlDoc.SelectSingleNode(programKey);
XmlNodeList smsxnlist = smsxn.ChildNodes;
//拼接出全部短信内容,开始内容+ 验证码+结尾内容
string realMessage = smsxnlist.Item(0).InnerText + captcha + smsxnlist.Item(1).InnerText;
//根据项目标识,从xml文件中加载对应的用户详情信息
XmlNode userxn = userxmlDoc.SelectSingleNode(platform);
XmlNodeList userxnlist = userxn.ChildNodes;
string userid = userxnlist.Item(0).InnerText;
string password = userxnlist.Item(1).InnerText;
string account = userxnlist.Item(2).InnerText;
string url = userxnlist.Item(3).InnerText;
bool issend = SendMessage(realMessage, phoNumber, url, userid, password, account);
return issend;
}
catch (Exception ex)
{
throw ex;
}
finally
{
readersms.Close();
}
}
#endregion
#region 最底层短信发送方法SendMessage()-牛迁迁-2015年8月12日 17:27:56
/// <summary>
/// 最底层-短信发送方法
/// </summary>
/// <param name="content">短信内容</param>
/// <param name="phoNumber">手机号码</param>
/// <param name="url">请求地址</param>
/// <param name="userid">企业id</param>
/// <param name="password">密码</param>
/// <param name="account">用户帐号</param>
/// <returns>bool 是否发送成功</returns>
public bool SendMessage(string content, string phoNumber, string url, string userid, string password, string account)
{
try
{
Encoding myEncoding = Encoding.GetEncoding("UTF-8");
//按照平台给定格式,组装发送参数 包括用户id,密码,账户,短信内容,账户等等信息
string param = "action=send&userid=" + userid + "&account=" + HttpUtility.UrlEncode(account, myEncoding) + "&password=" + HttpUtility.UrlEncode(password, myEncoding) + "&mobile=" + phoNumber + "&content=" + HttpUtility.UrlEncode(content, myEncoding) + "&sendTime=";
//发送请求
byte[] postBytes = Encoding.ASCII.GetBytes(param);
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url);
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded;charset=UTF-8";
req.ContentLength = postBytes.Length;
using (Stream reqStream = req.GetRequestStream())
{
reqStream.Write(postBytes, 0, postBytes.Length);
}
System.Xml.XmlDocument xmlDoc = new System.Xml.XmlDocument();
//获取返回的结果
using (WebResponse wr = req.GetResponse())
{
StreamReader sr = new StreamReader(wr.GetResponseStream(), System.Text.Encoding.UTF8);
System.IO.StreamReader xmlStreamReader = sr;
//加载XML文档
xmlDoc.Load(xmlStreamReader);
}
//解析XML文档,进行相应判断
if (xmlDoc == null)
{
return false;
}
else
{
String message = xmlDoc.GetElementsByTagName("message").Item(0).InnerText.ToString();
if (message == "ok")
{
return true;
}
else
{
return false;
}
}
}
catch (Exception ex)
{
throw ex;
}
}
#endregion
}
一共两个方法:SendSMS()和SendMessage()。SendSMS()方法是对外提供服务的具体实现,它有四个参数分别是:
captcha(短信验证码)项目中随机生成的几位数字作为验证码,
phoNumber(手机号码)用户注册时输入的手机号,
programKey(项目标识)配置短信内容时输入的项目标识,根据传过来的项目标识,去xml文件中查询出对应的短信详情配置,拼成完整的短信内容
platform(短信平台名称)根据传过来的短信平台名称,去xml文件中获取对应的平台信息,用户名密码等参数。
参数都准备好后,调用SendMessage()方法(短信服务的核心方法),完成短信的实际发送动作。
然后通过WCF对服务进行发布,其他系统配置上终结点信息即可调用该服务。
WCF的具体创建过程不再叙述,详见:项目源码