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:
-
En su aplicación, añada el campo Biblioteca JSForce así como dotenv usando:
npm install jsforce dotenv--save -
Crea un nuevo archivo llamado
.envque tendrá lo siguiente:CopiaSF_USERNAME='' SF_PASSWORD='' SF_TOKEN=''El
SF_USERNAMEySF_PASSWORDserán el nombre de usuario y la contraseña utilizados para iniciar sesión en Salesforce. La direcciónSF_TOKENes el código que debería haber recibido por correo electrónico cuando Salesforce generó su código de seguridad. -
Cree un nuevo archivo Javascript, llamado
Salesforce.jsy añade lo siguiente:Copiavar 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 -
Actualice el código en
app.jsPara importar este nuevo archivo:Copiavar salesforce = require('./Salesforce.js')Cuando se cargue la aplicación, escribe el código para iniciar sesión con tus credenciales de Salesforce.
Copiasalesforce.login() .then(function(res) { console.log(res) }).catch((function(err) { console.log(err) })) -
Actualiza el código en el
app.post('/webhook) de su aplicación para utilizar el nuevoSalesforce.jsarchivo.Copiarequire('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ónsalesforce.addTask(). Esto creará una nueva Tarea en Salesforce que incluirá el título, el Contacto asociado(utilizando la funcióncontactId) 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"] == 0la aplicación creará un nuevo contacto utilizando el campoevent.callerIddel 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. -
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.
Registrar las llamadas entrantes en Salesforce
Registro de llamadas entrantes en Salesforce