JavaScript

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

En esta sección, actualizará su aplicación Express para crear una nueva tarea en Salesforce cuando su webhook se active desde 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. Cree un nuevo archivo llamado .envque tendrá lo siguiente:

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

    En 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, escriba el código para iniciar sesión con sus credenciales de Salesforce.

    salesforce.login()
        .then(function(res) {
        console.log(res)
    }).catch((function(err) {
        console.log(err)
    }))
    
  5. Actualice 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 reciba una llamada desde su número VBC, Cuando se complete 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() para buscar el contacto. Si el Contacto existe, creamos una nueva Tarea utilizando 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 su aplicación, ejecute el siguiente comando:

    node app.js

Su aplicación creará ahora una nueva tarea en Salesforce cuando se realice o reciba una llamada.

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