JavaScript

Expressアプリを更新してSalesforceへのAPIコールを行う

このセクションでは、Webhook がコールからトリガーされたときに Salesforce に新しいタスクを作成するように Express アプリケーションを更新します。

ExpressJSアプリケーションを更新する:

  1. アプリケーションに JSForceライブラリ のみならず ドットエンブ を使っている:

    npm install jsforce dotenv--save
  2. という新しいファイルを作成する。 .envこれは次のようなものである:

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

    について SF_USERNAME そして SF_PASSWORD は、Salesforce へのログインに使用するユーザ名とパスワードになります。 ユーザ名とパスワードは SF_TOKEN は、Salesforce でセキュリティトークンが生成されたときにメールで受信したはずのトークンです。

  3. という新しいJavascriptファイルを作成する。 Salesforce.js を追加する:

    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. のコードを更新する。 app.js をクリックして、この新しいファイルをインポートする:

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

    アプリが読み込まれたら、Salesforce の認証情報を使用してログインするコードを記述します。

    salesforce.login()
        .then(function(res) {
        console.log(res)
    }).catch((function(err) {
        console.log(err)
    }))
    
  5. のコードを更新する。 app.post('/webhook)セクションで新しい Salesforce.js ファイル。

    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}`))
    

    このコードは、VBC番号から発信または着信があったとき、通話が完了したときにトリガーされます。if (state == "ANSWERED"))、アプリケーションはまず、指定された電話番号を持つコンタクトを探します(event.phoneNumber).

    これは salesforce.getContact() 関数を使用してコンタクトを検索します。連絡先が存在する場合、関数 salesforce.addTask().これにより、Salesforce に新しいタスクが作成され、タイトル、関連する連絡先( contactId)と通話時間。

    指定された電話番号に一致するコンタクトがない場合は contact["totalSize"] == 0 をチェックすると、アプリケーションは次のように新しいコンタクトを作成します。 event.callerId プロパティを取得し、文字列を姓と名に分割する。発信コールにはこのプロパティがない場合があります。この場合、電話番号をコンタクトの姓として使用します。

  6. アプリケーションを起動するには、以下のコマンドを実行する:

    node app.js

これで、通話発信または着信が完了すると、Salesforce に新しいタスクが作成されます。

注意: 指定したポート (300) は、ngrok URLを作成するときに使用したのと同じポートです。