JavaScript

Actualice la aplicación Express para realizar llamadas API a Salesforce

En esta sección, actualizarás tu aplicación de Express para crear una nueva tarea en Salesforce cuando se active tu webhook a raíz de una llamada.

Para actualizar una aplicación ExpressJS:

  1. En su aplicación, añada el campo Biblioteca JSForce así como dotenv usando:

    npm install jsforce dotenv--save
  2. Crea un nuevo archivo llamado .envque tendrá lo siguiente:

    SF_USERNAME=''
    SF_PASSWORD=''
    SF_TOKEN=''
    

    El SF_USERNAME y SF_PASSWORD serán el nombre de usuario y la contraseña utilizados para iniciar sesión en Salesforce. La dirección SF_TOKEN es el código que debería haber recibido por correo electrónico cuando Salesforce generó su código de seguridad.

  3. Cree un nuevo archivo Javascript, llamado Salesforce.js y añade lo siguiente:

    var jsforce = require('jsforce');
    var conn = new jsforce.Connection();
    
    function login() {
        return new Promise((resolve, reject) => {
            conn.login(process.env.SF_USERNAME, process.env.SF_PASSWORD + process.env.SF_TOKEN, function(err, res) {
                if (err) {reject(err); return}
                resolve(res)
            })
        })
    }
    
    function getContact(phone_number) {
        return new Promise((resolve, reject) => {
            var q = `SELECT Id FROM Contact WHERE Phone='${phone_number}'`
            console.log(q)
            conn.query(q, function(err, res) {
                if (err) {reject(err); console.log(err);}
                resolve(res)
            })
        })
    }
    
    function createContact(first_name, last_name, phone_number) {
        return new Promise((resolve, reject) => {
            //Create new contact, get the record ID
            console.log(`Create contact ${first_name} ${last_name} ${phone_number}`)
            var data = { FirstName : first_name, LastName : last_name, Phone:phone_number}
            if (first_name != null) {
                data['FirstName'] = first_name
            }
            if (last_name != null) {
                data['LastName'] = last_name
            }
            conn.sobject("Contact").create(data, function(err, ret) {
                if (err || !ret.success) { reject(err);  console.error(err, ret); return }
                console.log("Created new contact id : " + ret.id);
                resolve(ret)
            });
        })
    }
    
    function addTask(subject, call_dur, recordId) {
        return new Promise((resolve, reject) => {
            conn.sobject("Task").create({ TaskSubtype : 'Call', CallDurationInSeconds : call_dur, Subject:subject, WhoId:recordId}, function(err, ret) {
                if (err || !ret.success) { reject(err);  console.error(err, ret); return }
                console.log("Created new task id : " + ret.id);
                resolve(ret)
            });
        })
    }
    
    module.exports.login = login
    module.exports.getContact = getContact
    module.exports.createContact = createContact
    module.exports.addTask = addTask
    
  4. Actualice el código en app.js Para importar este nuevo archivo:

    var salesforce = require('./Salesforce.js')
    

    Cuando se cargue la aplicación, escribe el código para iniciar sesión con tus credenciales de Salesforce.

    salesforce.login()
        .then(function(res) {
        console.log(res)
    }).catch((function(err) {
        console.log(err)
    }))
    
  5. Actualiza el código en el app.post('/webhook) de su aplicación para utilizar el nuevo Salesforce.js archivo.

    require('dotenv').config()
    const express = require('express')
    const app = express()
    const port = 3000
    app.post('/webhook', (req, res) => {
        var event = req.body.event
        var callerId = event.callerId;
        var first_name = null
        var last_name = null
        var phone_number = event.phoneNumber.replace(/\D/g,'')
        if (typeof(callerId) != "undefined") {
            [last_name, first_name] = callerId.split(" ")
        } else {
            last_name = phone_number
        }
        var direction = event.direction
        var duration = event.duration
        var state = event.state
        if (state == "ANSWERED")  {
            var name = `${first_name} ${last_name}`
            if (typeof(callerId) == "undefined") {
                name = phone_number
            }
            var subject = `${direction.toLowerCase()} call with ${name}`
            salesforce.getContact(phone_number)
            .then(function(contact) {
                console.log(contact)
                if (contact["totalSize"] == 0) {
                    //Create new contact
                    return salesforce.createContact(first_name, last_name, phone_number)
                    .then(function(contact) {
                    var contactId = contact["Id"]
                    return salesforce.addTask(subject, duration, contactId)
                    })
                } else {
                    //Grab the first contact
                    var contactId = contact["records"][0]["Id"]
                    return salesforce.addTask(subject, duration, contactId)
                }
            }).catch(function(err) {
            console.log(err)
            })
        }
        res.sendStatus(200);
        });
     app.listen(port, () => console.log(`Example app listening at http://localhost:${port}`))
    

    Este código se activará cuando se realice o se reciba una llamada desde tu número de VBC. Cuando finalice la llamada (if (state == "ANSWERED")), la aplicación buscará primero un contacto con el número de teléfono indicado (event.phoneNumber).

    Esto llamará al salesforce.getContact() función para buscar el contacto. Si el contacto existe, creamos una nueva tarea mediante la función salesforce.addTask(). Esto creará una nueva Tarea en Salesforce que incluirá el título, el Contacto asociado(utilizando la función contactId) y la duración de la llamada.

    Si no hay contactos que coincidan con el número de teléfono indicado, utilice la función contact["totalSize"] == 0 la aplicación creará un nuevo contacto utilizando el campo event.callerId del webhook, y divide la cadena en nombre y apellidos. Tenga en cuenta que las llamadas salientes PUEDEN no tener esta propiedad. En este caso, utilizaremos el número de teléfono como apellido del contacto.

  6. Para iniciar la aplicación, ejecuta el siguiente comando:

    node app.js

A partir de ahora, tu aplicación creará una nueva tarea en Salesforce cada vez que se realice o se reciba una llamada completada.

Nota: Asegúrate de que el puerto que has especificado (300) es el mismo puerto que utilizas al crear tu URL ngrok.