关于短消息:
关于短消息:
先研究Nopcommerce自带的短消息配置/短信管理,首先,这个是插件模式的使用:
项目结构很典型,MVC,带有View,就是有配置界面的,然后RouteProvider.cs:
routes.MapRoute("Plugin.SMS.Clickatell.Configure", "Plugins/SMSClickatell/Configure", new { controller = "SmsClickatell", action = "Configure" }, new[] { "Nop.Plugin.SMS.Clickatell.Controllers" }
再有就是插件暴露什么信息:
Group: SMS providers FriendlyName: Clickatell SMS Provider SystemName: Mobile.SMS.Clickatell Version: 1.00 SupportedVersions: 2.30 Author: nopCommerce team DisplayOrder: 1 FileName: Nop.Plugin.SMS.Clickatell.dll
SMScontroller 通过Plugin过滤SMS plugin然后通过Grid View
http://localhost:3861/Admin/SMS/Providers
public ActionResult Providers() { if (!_permissionService.Authorize(StandardPermissionProvider.ManageSmsProviders)) return AccessDeniedView(); var smsProvidersModel = new List<SmsProviderModel>(); var smsProviders = _smsService.LoadAllSmsProviders(); foreach (var smsProvider in smsProviders) { var tmp1 = smsProvider.ToModel(); tmp1.IsActive = smsProvider.IsSmsProviderActive(_smsSettings); smsProvidersModel.Add(tmp1); } var gridModel = new GridModel<SmsProviderModel> { Data = smsProvidersModel, Total = smsProvidersModel.Count() }; return View(gridModel); }
// .ClientTemplate("<a href=\"ConfigureProvider?systemName=<#= SystemName #>\">" + T("Admin.Configuration.SMSProviders.Configure").Text + "</a>")
通过超链接,选择编辑,在URL看到的还是ConfigureProvider?systemName=Mobile.SMS.Clickatell
public ActionResult ConfigureProvider(string systemName) { if (!_permissionService.Authorize(StandardPermissionProvider.ManageSmsProviders)) return AccessDeniedView(); var smsProvider = _smsService.LoadSmsProviderBySystemName(systemName); if (smsProvider == null) throw new ArgumentException("No SMS provider found with the specified system name", "systemName"); var model = smsProvider.ToModel(); string actionName, controllerName; RouteValueDictionary routeValues; smsProvider.GetConfigurationRoute(out actionName, out controllerName, out routeValues); model.ConfigurationActionName = actionName; model.ConfigurationControllerName = controllerName; model.ConfigurationRouteValues = routeValues; return View(model); }
通过ConfigureProvider的View中加载了Plugin的View(可以参考文件Presentation\Nop.Web\Administration\Views\Sms\ConfigureProvider.cshtml):
@if (!String.IsNullOrEmpty(Model.ConfigurationActionName)) { @Html.Action(Model.ConfigurationActionName, Model.ConfigurationControllerName, Model.ConfigurationRouteValues); }
如果需要增加自己的SMS 组件,可参考同样的流程:
====
发送消息的流程在这插件中控制:
1.添加某个Web Service引用,因为网站通过该Service来发送消息,最后结算也是通过消息数目结算的
2.在XXXProvider中完成SMSsend
public bool SendSms(string text) { try { using (var svc = new PushServerWSPortTypeClient(new BasicHttpBinding(), new EndpointAddress("http://api.clickatell.com/soap/webservice_vs.php"))) { string authRsp = svc.auth(Int32.Parse(_clickatellSettings.ApiId), _clickatellSettings.Username, _clickatellSettings.Password); if (!authRsp.ToUpperInvariant().StartsWith("OK")) { throw new NopException(authRsp); } //认证通过 string ssid = authRsp.Substring(4);//ssid作为参数一部分 string[] sndRsp = svc.sendmsg(ssid, Int32.Parse(_clickatellSettings.ApiId), _clickatellSettings.Username, _clickatellSettings.Password, new string[1] { _clickatellSettings.PhoneNumber }, //发送接收的电话号码,如果要群发要改写一个方法 String.Empty, text, 0, 0, 0, 0, 0, 0, 0, 0, 0, String.Empty, 0, String.Empty, String.Empty, String.Empty, 0); if (!sndRsp[0].ToUpperInvariant().StartsWith("ID")) { throw new NopException(sndRsp[0]); } return true; } } public bool SendSmses(string text, string[] PhoneNumbers) { foreach (string PhNo in PhoneNumbers) { SendSms(PhNo); } return true; }