c# - 如何使用不同的提供商从 Acumatica ERP 发送 SMS?
问题描述
开箱即用的 Acumatica 已经Twilio
和Amazon SNS
供应商发送短信。但是,我们与不同的提供商(Plivo
例如)有业务关系,并希望将它们用于 SMS 服务。是否可以使用不同的提供者?
解决方案
是的,可以使用不同的提供商发送短信。
在 Acumatica 中,SMS 服务用于
Acumatica ERP 提供了一组接口来实现用于发送 SMS 消息的 SMS 提供程序。
1. PX.SmsProvider.ISmsProvider
实现此接口的类由 Acumatica ERP 自动发现,并可在Provider Type
SMS Provider ( SM203535
) 屏幕上的框中进行选择。类必须是库 (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 服务创建 SMS 提供程序。
在 C# 类库项目中,添加Acumatica 站点的 bin 文件夹中的 和 的PX.Common.dll
引用PX.Data.dll
。PX.SmsProvider.Core.dll
PlivoSmsProvider
类实现接口的定义PX.SmsProvider.ISmsProvider
:我们需要Auth ID
,Auth Token
和From 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
类实现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) 屏幕中可用。
推荐阅读
- c# - 有没有办法在不使用数据表的情况下从 csv 读取数据并将数据写入 c# 中的 csv?
- android - E/AndroidRuntime: 致命异常: DefaultDispatcher-worker-4
- python - 遍历列并避免 IndexError
- kubernetes - storageClassName "standard" 的 GKE PersistentVolumeClaim 永远处于挂起状态
- javascript - 如何查找在 Date 对象中传递的日期的字符串格式类型?
- php - putenv() 不能为父命令行设置环境变量
- javascript - 如果使用 jQuery/javascript 值为负数,如何更改颜色
- reactjs - 为什么反应抛出错误无法读取未定义的属性?
- c++ - VANET 简单 CBR 应用程序,无输出(空 pcap 文件)?
- flutter - Flutter:当字段在 ListView 中不可见时未调用 TextFormField 验证器