Webhooks

Si el canal de mensajería que desea utilizar no se admite de forma predeterminada en Oracle Digital Assistant, puede utilizar un webhook para integrar manualmente ese canal.

Para crear un canal de webhook, necesita lo siguiente:
  • Un servidor de mensajería HTTP de acceso público que transmita los mensajes entre el dispositivo del usuario y el asistente digital (o la aptitud) mediante un webhook.

    Este webhook se implanta con:

    • Una llamada POST que permite al servidor recibir mensajes del asistente digital.

    • Una llamada POST que permite al servidor enviar mensajes al asistente digital.

  • El URI de la llamada de webhook que recibe los mensajes del asistente digital (de manera que el asistente digital sepa adónde enviar los mensajes).

  • El URL del webhook generado para el asistente digital después de completar el cuadro de diálogo Crear canal (de modo que el servidor de mensajes pueda acceder al asistente digital).

Para montar estas piezas en un webhook:
  1. Configure el servidor.

  2. Para recibir mensajes del asistente digital, publique la llamada POST en el servidor.

  3. En el cuadro de diálogo Crear canal, introduzca un nombre y, a continuación:
    • Seleccione Webhook como tipo de canal.

    • Defina la versión de la plataforma en 1.1 (Conversation Model).

    • Registre el servidor como destinatario de los mensajes del asistente digital introduciendo el URI de esta llamada POST en el campo URI de webhook saliente.

    • Si es necesario, introduzca la caducidad de la sesión y active Canal activado.


    A continuación se muestra la descripción de create-webhook-channel.png
    Descripción de la ilustración create-webhook-channel.png
  4. Haga clic en Crear.

    Digital Assistant genera el URL del webhook para el asistente digital y la clave secreta para cifrar mensajes. Mantenga el URL del webhook a mano, ya que es el indicador que necesita el servidor de mensajería para enviar mensajes al asistente digital.
    A continuación se muestra la descripción de webhook-channel-config.png
    Descripción de la ilustración webhook-channel-config.png

  5. En el servidor, publique la segunda API de POST, una que envía mensajes al asistente digital utilizando el URL del webhook.

  6. Active la opción Canal activado.

Puede utilizar el SDK de Node.js de Digital Assistant para configurar el envío de mensajes desde y hacia el asistente digital.

Mensajes entrantes

La biblioteca WebhookClient del SDK de Node.js de Oracle Digital Assistant simplifica la configuración del envío y la recepción de mensajes en canales de webhook. Si no utiliza el SDK, esto es lo que necesita saber sobre la creación de mensajes entrantes.

La llamada para enviar mensajes al asistente digital (o aptitud) debe incluir estos elementos:

  1. Una cabecera X-Hub-Signature que contenga el valor SHA256 de la carga útil. La llamada incluye funciones que crean este valor hash utilizando la clave secreta como clave.
    const body = Buffer.from(JSON.stringify(messageToBot), 'utf8');
        const headers = {};
        headers['Content-Type'] = 'application/json; charset=utf-8';
        headers['X-Hub-Signature'] = buildSignatureHeader(body, channelSecretKey);
    
    ...
    
    function buildSignatureHeader(buf, channelSecretKey) {
        return 'sha256=' + buildSignature(buf, channelSecretKey);
    }
    
    function buildSignature(buf, channelSecretKey) {
        const hmac = crypto.createHmac('sha256', Buffer.from(channelSecretKey, 'utf8'));
        hmac.update(buf);
        return hmac.digest('hex');
    }

    BOT_WEBHOOK_URL y BOT_WEBHOOK_SECRET son variables de entorno que se establecen en el servidor de nodo. El uso de estas variables de entorno le permite evitar la codificación de la información confidencial directamente en el webhook.

  2. Un objeto JSON con las propiedades userId, profile y messagePayload:
    {
     "userId": "33c0bcBc8e-378c-4496-bc2a-b2b9647de2317",
     "profile": {
        "firstName": "Bob",
        "lastName": "Franklin",
        "age": 45
       },
     "messagePayload": {....}
    }
    Propiedad Descripción Tipo ¿Obligatoria?
    userId Identificador único para el usuario. Este ID es específico del emisor de llamada. Cadena
    profile Propiedades que representan al usuario, como firstName y LastName. Objeto JSON No
    messagePayload El valor de messagePayload puede ser text, postback, attachment y location. Objeto JSON
    Nota

    Si la aptitud o el asistente digital necesita detectar el idioma del usuario, asegúrese de que profile.locale y profile.languageTag están definidos como nulos en los mensajes de webhook.

Cargas útiles de ejemplo: mensajes entrantes

Tipo de mensaje Carga útil de ejemplo
text
{
    "type": "text",
    "text": "hello, world!"
}
postback
{
  "type": "postback",
  "postback": {
    "state": "orderPizza",
    "action": "deliverPizza",
    "variables": {
      "pizzaSize": "Large",
      "pizzaCrust": "Thin",
      "pizzaType": "Hawaiian"
    }
  }
}
attachment
{
  "type": "attachment",
  "attachment": {
    "type": "image",
    "url": "https://image.freepik.com/free-icon/attachment-tool-ios-7-interface-symbol_318-35539.jpg"
  }
}
location
{
  "type": "location",
  "location": {
    "longitude": -122.265987,
    "latitude": 37.529818
  }
}

Mensajes salientes

La biblioteca WebhookClient del SDK de Node.js de Oracle Digital Assistant simplifica la configuración del envío y la recepción de mensajes en canales de webhook. Si no utiliza el SDK, esto es lo que debe saber sobre la creación de mensajes salientes.

Debe publicar las llamadas en el formato JSON que espera Digital Assistant, junto con la cabecera de autorización.

La llamada a los mensajes salientes del asistente digital incluye:
  1. Una cabecera X-Hub-Signature que contiene el valor SHA256 de la carga útil, calculado utilizando la clave secreta como clave.
    Nota

    Digital Assistant utiliza la cabecera X-Hub-Signature para permitir al destinatario autenticar el asistente digital como el remitente y validar la integridad de la carga útil.
  2. Una carga útil de JSON que contiene userID, un identificador único especificado por el mensaje entrante, type, que puede ser text, attachment y card. Como se muestra en los ejemplos siguientes, los tipos de respuesta text y card pueden contener acciones asociadas. Cualquiera de los tipos de respuesta puede incluir también acciones globales.
    Tipo de respuesta Carga útil de ejemplo
    text
    {
     "userId":"22343248763458761287
     "messagePayload": {
        "type": "text",
        "text": "Hello, how are you?"
         }
    }
    El siguiente fragmento muestra una respuesta text con acciones:
    {
     "userId":"22343248763458761287
     "messagePayload": {
        "type": "text",
        "text": "What do you want to do?",
        "actions": [
          {
            "type": "postback",
            "label": "Order Pizza",
            "postback": {
              "state": "askAction",
              "action": "orderPizza"
            }
          },
          {
            "type": "postback",
            "label": "Cancel A Previous Order",
            "postback": {
              "state": "askAction",
              "action": "cancelOrder"
          }
        ]
      }
    }
    card
    
    ...
    {
     "type": "card",
      "layout": "horiztonal",
      "cards": [
        {
          "title": "Hawaiian Pizza",
          "description": "Ham and pineapple on thin crust",
          "actions": [
            {
              "type": "postback",
              "label": "Order Small",
              "postback": {
                "state": "GetOrder",
                "variables": {
                  "pizzaType": "hawaiian",
                  "pizzaCrust": "thin",
                  "pizzaSize": "small"
                }
              }
            },
            {
              "type": "postback",
              "label": "Order Large",
              "postback": {
                "state": "GetOrder",
                "variables": {
                  "pizzaType": "hawaiian",
                  "pizzaCrust": "thin",
                  "pizzaSize": "large"
                }
              }
            }
          ]
        },
        {
          "title": "Cheese Pizza",
          "description": "Cheese pizza (i.e. pizza with NO toppings) on thick crust",
          "actions": [
            {
              "type": "postback",
              "label": "Order Small",
              "postback": {
                "state": "GetOrder",
                "variables": {
                  "pizzaType": "cheese",
                  "pizzaCrust": "thick",
                  "pizzaSize": "small"
                }
              }
            },
            {
              "type": "postback",
              "label": "Order Large",
              "postback": {
                "state": "GetOrder",
                "variables": {
                  "pizzaType": "cheese",
                  "pizzaCrust": "thick",
                  "pizzaSize": "large"
                }
              }
            }
          ]
        }
      ],
      "globalActions": [
        {
          "type": "call",
          "label": "Call for Help",
          "phoneNumber": "123456789"
        }
      ]
    }
    attachment El tipo de respuesta de anexo puede ser una imagen, un archivo de audio o un vídeo:
    
    ...
    {
      "type": "attachment",
      "attachment": {
        "type": "video",
        "url": "https://www.youtube.com/watch?v=CMNry4PE93Y"
      }
    }