Nop -关于Nopcommerce中的短消息模块<八>

本文详细介绍了NopCommerce中短消息配置/短信管理插件的使用方法,包括插件的结构、暴露信息、发送消息流程以及自定义SMS组件的步骤。重点阐述了如何通过配置界面、插件过滤、GridView等实现短信发送功能。

关于短消息: 

先研究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;
        }

### 修复 Maven 项目中 SLF4J 报错 Failed to load class StaticLoggerBinder 当 Maven 项目中出现 `SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder"` 错误时,表明项目缺少 SLF4J 的底层日志实现绑定,导致其无法正常工作,只能默认使用无操作(NOP)日志实现 [^1]。 SLF4J 本身是一个日志门面,不提供具体的日志实现,因此需要绑定一个实际的日志框架(如 Logback、Log4j 等)来正常工作。如果未正确配置绑定,将会默认使用 NOP 日志实现,导致日志无法输出 [^2]。 #### 使用 Log4j 作为日志实现 如果希望使用 Log4j 作为底层日志框架,可以在 `pom.xml` 中添加以下依赖: ```xml <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.5</version> </dependency> ``` 该依赖会引入 SLF4J 对 Log4j 的绑定支持,并提供 `StaticLoggerBinder` 实现,从而解决无法加载类的问题 [^4]。 #### 使用 NOP 作为占位实现 如果暂时不需要日志输出,或者希望避免日志相关的错误信息,可以使用 `slf4j-nop` 作为占位实现。它会将所有日志调用静默处理,避免运行时错误: ```xml <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-nop</artifactId> <version>1.8.0-alpha2</version> </dependency> ``` 此依赖适用于测试或轻量级部署场景,但不适用于需要实际日志记录的生产环境 [^3]。 #### 检查依赖版本兼容性 在引入依赖时,需要注意版本兼容性问题。如果多个 SLF4J 绑定依赖同时存在,可能会导致冲突。建议使用 `mvn dependency:tree` 或 `gradle dependencies` 命令检查依赖树,确保只有一个 SLF4J 实现绑定存在 。 #### 手动移除冲突依赖 如果项目中存在多个 SLF4J 实现(例如同时引入了 `slf4j-log4j12` 和 `slf4j-simple`),会导致 `StaticLoggerBinder` 类冲突,从而出现错误。可以通过排除冲突依赖的方式解决: ```xml <dependency> <groupId>some.library</groupId> <artifactId>some-artifact</artifactId> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> </exclusion> </exclusions> </dependency> ``` 通过这种方式,可以确保 SLF4J 使用指定的实现类。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值