在RingCentral中,webhook是否有一种区分不同事件过滤器的方法?

时间:2017-02-07 16:46:01

标签: php webhooks ringcentral

例如

如果我想听两个

'eventFilters' => array(
                "/restapi/v1.0/account/~/extension/~/presence?detailedTelephonyState=true&aggregate=true",
                "/restapi/v1.0/account/~/extension/~/message-store/instant?type=SMS"

如果我想过滤和分析这两个事件,我是否应该对RingCentral的每个帖子请求进行切换?

说..

switch($eventid){
    case '/restapi/v1.0/account/<accountid>/extension/<extension>/presence?detailedTelephonyState=true&aggregate=true'
    //process data
    break;
}

但是webhook帖子有不同的扩展名。是否有触发了哪个事件的标识符?

2 个答案:

答案 0 :(得分:2)

我可以通过几种方式来解决您提出的问题......

  1. 如果您在多个扩展上有多个eventFilter的单个订阅,正如您所说,过滤传入的webhook.event URI并匹配字符串类型可能是最快的,然后路由到特定的通知事件输入处理程序。
  2. 您最多可以在帐户中创建20个推送通知(订阅),每个推送通知(订阅)最多可容纳1000个eventFilters。您可以为要监视的六(6)个唯一通知事件类型中的任何一个创建单独的webhook。这样做还可以让您Update Subscriptions即时进行扩展。
  3. 如果您只注册了包含多个通知事件类型的单个订阅,则可以使用[NotificationType.body架构(https://developers.ringcentral.com/api-docs/latest/index.html#!#EventTypes.html)的鸭子类型,方法是检查webhook.body是否具有所需的属性。
  4. PHP中的3号(未经测试的代码)

    $instantMessageEventTypeKeys = array('id', 'to', 'from', 'type', 'creationTime', 'lastModifiedTime', 'readStatus', 'priority', 'attachments', 'direction', 'availability', 'subject', 'messageStatus', 'conversationid');
    
    function genericNotificationHandler($eventJson) {
      $eventObj = json_decode($eventJson, true);
      foreach($instantMessageEventTypeKeys) {
        // If the event.body keys match, route to 
        if(arrayKeys(eventObj=>['body']) === $instantMessageEventType)) {
          //Call some instantMessageSpecificEventHandler($eventObj);
        }
      }
    }
    

    JavaScript中的第3位(未经测试的代码)

    // Instant Message Notification Event Type properties
    const instantMessageEventTypeKeys = ['id', 'to', 'from', 'type', 'creationTime', 'lastModifiedTime', 'readStatus', 'priority', 'attachments', 'direction', 'availability', 'subject', 'messageStatus', 'conversationid']
    
    const proxyHandlers = {
      get (target, key) {
        if ('notificationEventType' === key[0]) {
          let targetKeys = target.body.ownKeys.sort().join(',');
          if(targetKeys === instantMessageEventTypeKeys.sort().join(',')) return 'Instant Message' 
        }
      }
    }
    
    const genericNotificationHandler = (notificationData) => {
      // You could create traps in handlers below to simplify further
      let pEvent = new Proxy(notificationData, proxyHandlers);
      if('Instant Message' === pEvent.notificationEventType) {
        // instantMessageSpecificEventHandler(notificationData)
      }
    }
    

答案 1 :(得分:0)

以Ben的第一种方法为基础:

  

如果您在多个扩展上有多个eventFilter的单个订阅,正如您所说,过滤传入的webhook.event URI并匹配字符串类型可能是最快的,然后路由到特定的通知事件输入处理程序。

webhook有效负载将如下所示。 event属性将指示正在触发的事件类型,您的应用可以使用该属性启动差异化处理。我在下方使用了空body,但在实际帖子中,它将填充特定于该事件类型的主体。

{
    "uuid":"12345678901234567890",
    "event":"/restapi/v1.0/glip/posts",
    "timestamp":"2018-05-01T16:39:41.693Z",
    "subscriptionId":"11112222-3333-4444-5555-666677778888",
    "ownerId":"11111111",
    "body":{}
}

Go community SDK go-ringcentral中,我开始构建一个返回事件类型的函数,给定事件字符串:

ParseEventTypeForFilter(eventFilter string) (EventType, error) {

这是一个事件类型列表:

const(
    AccountPresenceEvent EventType = iota
    ContactDirectoryEvent
    DetailedExtensionPresenceEvent
    DetailedExtensionPresenceWithSIPEvent
    ExtensionFavoritesEvent
    ExtensionFavoritesPresenceEvent
    ExtensionGrantListEvent
    ExtensionListEvent
    ExtensionInfoEvent
    ExtensionPresenceEvent
    ExtensionPresenceLineEvent
    GlipGroupsEvent
    GlipPostEvent
    GlipUnreadMessageCountEvent
    InboundMessageEvent
    IncomingCallEvent
    InstantMessageEvent
    MessageEvent
    MissedCallEvent
    RCVideoNotificationsEvent
    SubscriptionRenewalEvent
)

代码:https://github.com/grokify/go-ringcentral/blob/master/clientutil/event_filter.go