我如何使用不同的提供商从 Acumatica ERP 发送短信?

How can I use different provider to send SMS from Acumatica ERP?

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

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

在 Acumatica 中,SMS 服务用于

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

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

1. PX.SmsProvider.ISmsProvider

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

定义 class 实现 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.ISmsProvider工厂

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

定义 class 实现 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 服务创建 SMS 提供程序。

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

定义 PlivoSmsProvider class 实现 PX.SmsProvider.ISmsProvider 接口: 我们将需要 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
        }
    }
}

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

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