【问题标题】:How can I use different provider to send SMS from Acumatica ERP?如何使用不同的提供商从 Acumatica ERP 发送 SMS?
【发布时间】:2020-02-13 22:46:43
【问题描述】:

开箱即用的 Acumatica 有 TwilioAmazon SNS 提供商来发送 SMS。但是,我们与不同的提供商(例如Plivo)有业务关系,并希望将它们用于 SMS 服务。是否可以使用不同的提供商?

【问题讨论】:

    标签: c# acumatica acumatica-kb


    【解决方案1】:

    是的,可以使用不同的提供商发送短信。

    在 Acumatica 中,SMS 服务用于

    1. two-factor authentication期间发送访问码
    2. 发送business notifications

    Acumatica ERP 提供了一组接口来实现 SMS 提供程序以发送 SMS 消息。

    1. PX.SmsProvider.ISmsProvider

    实现此接口的类由 Acumatica ERP 自动发现,并可在 SMS 提供程序 (SM203535) 屏幕上的Provider Type 框中进行选择。类必须是库 (DLL) 的一部分。

    定义实现PX.SmsProvider.ISmsProvider接口的类,实现ISmsProvider接口的方法。

    public class MySmsProvider : ISmsProvider
    {        
        public IEnumerable<PXFieldState> ExportSettings
        {
            // Implement definition of each setting/parameter and add to settings list
            get
            {
                return new List<PXFieldState>();
            }
        }
    
        public void LoadSettings(IEnumerable<ISmsProviderSetting> settings)
        {
            // Retrieve value of each setting/parameter and assign to corresponding member variable
        }
    
        public async Task SendMessageAsync(SendMessageRequest request, CancellationToken cancellation)
        {
            // Implement logic to send SMS
        }
    }
    

    2。 PX.SmsProvider.ISmsProviderFactory

    类实现构造函数来初始化提供者。以及用于保存此提供程序的名称和描述的公共属性——您需要它在 SMS 提供程序 (SM203535) 屏幕上的提供程序类型框中显示的方式。

    定义实现PX.SmsProvider.ISmsProviderFactory接口的类,实现ISmsProviderFactory接口的方法和属性。

    public class MySmsProviderFactory : ISmsProviderFactory
    {
        //Create Provider and initialize with settings
        public ISmsProvider Create(IEnumerable<ISmsProviderSetting> settings)
        {
            var provider = new MySmsProvider();
            provider.LoadSettings(settings);
            return provider;
        }
    
        public ISmsProvider Create()
        {
            var provider = new MySmsProvider();
            return provider;
        }
    
        public string Description { get; } = "My Provider";
        public string Name { get; } = typeof(MySmsProvider).FullName;
    }
    

    以下示例说明了使用 Plivo Service 创建 SMS Provider。

    在 C# 类库项目中,从 Acumatica 站点的 bin 文件夹中添加 PX.Common.dllPX.Data.dllPX.SmsProvider.Core.dll 的引用。

    实现PX.SmsProvider.ISmsProvider接口的PlivoSmsProvider类的定义: 我们需要Auth IDAuth TokenFrom Number 参数才能与Plivo 一起工作。因此,我们将它们设置在ExportSettings 方法中,并将它们分配给LoadSettings 方法中的成员变量。我们将在SendMessageAsync 中实现发送短信的逻辑。

    using System.Collections.Generic;
    using System.Threading;
    using System.Threading.Tasks;
    using PX.Data;
    
    namespace PX.SmsProvider.Plivo
    {
        public class PlivoSmsProvider : ISmsProvider
        {
            #region DetailIDs const
            private const string AuthID_DetailID = "AUTH_ID";
            private const string AuthToken_DetailID = "AUTH_TOKEN";
            private const string FromPhoneNbr_DetailID = "FROM_PHONE_NBR";
            #endregion
    
            #region DetailID_Display const
            private const string AuthID_DetailID_Display = "Auth ID";
            private const string AuthToken_DetailID_Display = "Auth Token";
            private const string FromPhoneNbr_DetailID_Display = "From Number";
            #endregion
    
            private string m_AuthID;
            public string AuthID { get { return m_AuthID; } }
    
            private string m_AuthToken;
            public string AuthToken { get { return m_AuthToken; } }
    
            private string m_FromPhoneNbr;
            public string FromPhoneNbr { get { return m_FromPhoneNbr; } }
    
            public IEnumerable<PXFieldState> ExportSettings
            {
                get
                {
                    var settings = new List<PXFieldState>();
    
                    var authID = (PXStringState)PXStringState.CreateInstance(
                        m_AuthID,
                        null,
                        false,
                        AuthID_DetailID,
                        null,
                        1,
                        null,
                        null,
                        null,
                        null,
                        null
                    );
                    authID.DisplayName = AuthID_DetailID_Display;
                    settings.Add(authID);
                    var authToken = (PXStringState)PXStringState.CreateInstance(
                        m_AuthToken,
                        null,
                        false,
                        AuthToken_DetailID,
                        null,
                        1,
                        "*",
                        null,
                        null,
                        null,
                        null
                    );
                    authToken.DisplayName = AuthToken_DetailID_Display;
                    settings.Add(authToken);
    
                    var fromPhoneNbr = (PXStringState)PXStringState.CreateInstance(
                        m_FromPhoneNbr,
                        null,
                        false,
                        FromPhoneNbr_DetailID,
                        null,
                        1,
                        null,
                        null,
                        null,
                        null,
                        null
                    );
                    fromPhoneNbr.DisplayName = FromPhoneNbr_DetailID_Display;
                    settings.Add(fromPhoneNbr);
    
                    return settings;
                }
            }
    
            public void LoadSettings(IEnumerable<ISmsProviderSetting> settings)
            {
                foreach (ISmsProviderSetting detail in settings)
                {
                    switch (detail.Name.ToUpper())
                    {
                        case AuthID_DetailID: m_AuthID = detail.Value; break;
                        case AuthToken_DetailID: m_AuthToken = detail.Value; break;
                        case FromPhoneNbr_DetailID: m_FromPhoneNbr = detail.Value; break;
                    }
                }
            }
    
            public async Task SendMessageAsync(SendMessageRequest request, CancellationToken cancellation)
            {
                // implement logic to send SMS
            }
        }
    }
    

    实现PX.SmsProvider.ISmsProviderFactory接口的PlivoSmsProviderFactory类的定义。

    using System.Collections.Generic;
    
    namespace PX.SmsProvider.Plivo
    {
        public class PlivoSmsProviderFactory : ISmsProviderFactory
        {
            public ISmsProvider Create(IEnumerable<ISmsProviderSetting> settings)
            {
                var provider = new PlivoSmsProvider();
                provider.LoadSettings(settings);
                return provider;
            }
    
            public ISmsProvider Create()
            {
                var provider = new PlivoSmsProvider();
                return provider;
            }
    
            public string Description { get; } = "Plivo SMS Provider";
            public string Name { get; } = typeof(PlivoSmsProvider).FullName;
        }
    }
    

    通过自定义发布此库后,此新提供程序将在 SMS 提供程序 (SM203535) 屏幕中可用。

    Download Acumatica Source code and Customization deployment package

    【讨论】:

      猜你喜欢
      • 2011-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-03
      相关资源
      最近更新 更多