【问题标题】:Implementing bulk-messaging from Salesforce to/from Twilio, hitting Salesforce API limits实施从 Salesforce 到/从 Twilio 的批量消息传递,达到 Salesforce API 限制
【发布时间】:2017-10-27 16:02:33
【问题描述】:

我正在 Salesforce 和 Twilio 之间构建一个集成,它使用 TwilioForce REST API 发送/接收 SMS。主要问题是绕过 Salesforce 的 10 次调用 API 限制,以及禁止来自触发器的 HTTP 调用。

我的设计基于 Dan Appleman 的异步请求流程,但是在批处理模式或 RequestAsync()、ASync()、Sync() 中,重复...我仍然达到了极限。

我想知道其他开发人员是如何成功地做到这一点的;集成已经有一段时间了,但例子很少。

【问题讨论】:

    标签: sms salesforce twilio apex callouts


    【解决方案1】:

    您是否为每条已更新的记录发送唯一消息?如果没有,那为什么不向多个收件人发送一条消息以节省您的 API 限制?

    不幸的是,如果您确实需要发送 10 条以上的唯一消息,则无法使用 Twilio API 批量发送消息,您可以编写一个在 Heroku 或其他您可以使用的应用程序平台上运行的简单应用程序调用它将为您处理 SMS 功能。

    【讨论】:

    • 即使只有一条消息,我也没有办法发送给多个;每个标注的 To、From 和 Message 是我遇到的唯一方法。
    • 不幸的是,再次查看问题,你是对的,我对 twilio API 的体验有点过时,我回忆起发送群组消息的能力,但我错了。在这一点上,我唯一可行的解​​决方案是将数据推送到可以为您发送消息的外部服务,而不受 SFDC 施加的限制。
    • @DuncanStewart - 我遇到了超过 10 条消息的同一问题,我正在尝试了解如何异步调用该过程。你是说即使使用异步也是一个问题?
    • @DuncanStewart - 您是否使用 TwiML 回复文本?如果是,那么它有 10 条消息限制。所以在这种情况下使用他们的 rest API。
    • @Ditty - 回复完全是另一回事;我有一个在 Sandbox/Dev 组织中运行良好的流程,但在生产中遇到了涉及服务器证书的问题。但是不,我没有使用 TwiML - 我正在从 Salesforce 调用 Twilio Rest API,这是 Salesforce 在单个事务期间对标注的限制是问题所在。但现在它正在工作:D
    【解决方案2】:

    我现在使用以下结构使其工作(我为格式道歉 - 它主要是伪代码):

    ASyncRequest 对象: AsyncType(选择列表:'SMS to Twilio' 是现在), 参数(长文本区域:逗号分隔的 ID 列表)

    消息对象: To (phone), From (phone), Message (text), Sent (boolean), smsId (string), Error (text)

    消息触发器:将触发器详细信息传递给 CreateAsyncRequests() 方法。

    CreateAsyncRequests:评估每个新的/更新的消息__c;如果任何消息的 Sent == false,我们创建一个 AsyncRequest,type=SMS to Twilio,Params += ',' + message.Id。

    // 创建一个待处理完所有消息后插入的列表 列表请求 = new List();

    在单个 AsyncRequest.Params 列表中达到 5 个 message.Id 后,将其添加到请求中。 如果所有消息都已处理,并且 Params 中有

    If requests.size() > 0 {
      insert requests;
      AsyncProcessor.StartBatch();
    }
    

    AsyncProcessor 实现 .Batchable 和 .AllowsCallouts,并在 ASyncRequest__c 中查询任何需要处理的请求,在本例中将是我们的 Messages 列表。

    execute() 方法获取 ASyncRequests 列表,将每个 Params 值拆分为其组件消息 Id,然后在消息对象中查询这些特定消息。

    StartBatch() 一次调用 1 条记录的 execute(),因此每个 execute() 进程仍将包含少于最多 10 个标注。

    每条消息都在调用 SendMessage() 的 try/catch 块中处理,设置 Message.smsId = Twilio.smsId 并设置 Message.Sent = true。

    如果没有返回 smsId,则表示未发送消息,我设置了一个布尔值 bSidIsNull = true 表示(至少)一条消息未发送。

    ** 如果任何消息失败,即使是成功的消息也不会返回 smsIds **

    每批消息处理完后,我检查bSidIsNull;如果为真,那么我会返回消息列表并将任何没有 smsId 的消息放入由我尝试发送它们的 Twilio 编号索引的地图中。

    由于我将每个 ASyncRequest 限制为 5 条消息,我仍然可以使用标注来检索从该 Twilio.From 号码在当前日期发送的所有消息,使用

    client.getAccount().getMessages('From' => fromNumber, 'DateSent' => currentDate)
    

    然后我可以为所有成功的消息更新 Message.smsIds,并为任何失败的消息添加错误消息到 Message.Error_on_Send__c。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-22
      • 1970-01-01
      • 1970-01-01
      • 2016-05-07
      • 1970-01-01
      • 2019-07-19
      相关资源
      最近更新 更多