Webhooks voorbeelden

Uit Help
Ga naar:navigatie, zoeken

Caller ID name lookup met SugarCRM

Dit voorbeeld zoekt een nummer op in de SugarCRM database en geeft deze daarna weer in het telefoonscherm. De URL die hiervoor aangeroepen moet worden is bijvoorbeeld:

http://IP/DIR/cid_name_lookup.php?phonenumber={callerid}&callername={callername}

Het enige wat je terugkrijgt is als je deze pagina aanroept is het volgende:

status=ACK&callername={callername} VoIPGRID

Deze callername kan vervolgens weer in het belplan gezet worden.


HTTProutingCallername.png


<?php 

/* utility function */
function is_allowed($ip) {
    /* IP white list */
    /* uses basic ip-string matching */
    /* ranges only supported like '192.168.' */

    $list = array();

    /* servers in Amsterdam */
    $list[] = '195.35.114.';
    $list[] = '217.21.203.';

    /* servers in Groningen */
    $list[] = '195.35.115.';
    $list[] = '217.21.192.';

    $allowed = false;
    foreach($list as $range) {
        $allowed = strpos($ip, $range) === 0;
        if($allowed === true) {
            break;
        }
    }
    return $allowed;
}

/* check white list */
if(!is_allowed($_SERVER['REMOTE_ADDR'])) {
    return;
}

/* load crm database credentials */
require_once('Connections/crm.php');

/* read request */
$callername = trim($_GET['callername']);
$phonenumber = trim($_GET['phonenumber']);

/*
 * match the last 9 digits of $phonenumber,
 * 612345678 now matches both +31612345678 and 0612345678.
 */
$phonenumber = substr($phonenumber, -9);

/* doing a LIKE with wildcards on both ends */
$phonenumber_parameter = sprintf('%%%s%%', $phonenumber);

/* only perform a search if query is not empty */
if(strlen($phonenumber) == 0) {
    return;
}

$response = null;

try {
    /* find a result in $db for query $sql with parameter $phonenumber */
    function query_for_name($db, $sql, $phonenumber) {
        /* prepare statement */
        $result_sth = $db->prepare($sql);

        /* provide parameters for query */
        $result_sth->execute(array($phonenumber));

        /* test for errors */
        if($result_sth === false || $result_sth === null) {
            return null;
        }

        return $result_sth;
    }

    /* database connect */
    $db = new PDO(sprintf('mysql:dbname=%s;host=%s', $database_crm, $hostname_crm), $username_crm, $password_crm);
    /* silent mode */
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
    /* fetch results as objects */
    $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);

    /* query for contacts with $phonenumber for phone_work */
    $sql = 'SELECT CONCAT(first_name, SPACE(1), last_name) AS name FROM contacts WHERE phone_work LIKE ? ORDER BY id desc';
    $result_sth = query_for_name($db, $sql, $phonenumber_parameter);

    /* test for errors */
    if($result_sth === null) {
        return;
    }

    /* test for empty results */
    if($result_sth->rowCount() == 0) {
        /* query for contacts with $phonenumber for phone_mobile */
        $sql = 'SELECT CONCAT(first_name, SPACE(1), last_name) AS name FROM contacts WHERE phone_mobile LIKE ? ORDER BY id desc';
        $result_sth = query_for_name($db, $sql, $phonenumber_parameter);

        /* test for errors */
        if($result_sth === null) {
            return;
        }
    }

    /* test for results */
    if($result_sth->rowCount() <> 1) {
        /* query for accounts with $phonenumber for phone_office */
        $sql = 'SELECT name FROM accounts WHERE phone_office LIKE ? ORDER BY id desc';
        $result_sth = query_for_name($db, $sql, $phonenumber_parameter);

        /* test for errors */
        if($result_sth === null) {
            return;
        }

        /* test for empty results */
        if($result_sth->rowCount() == 0) {
            $response = 'status=ACK&callername=[NieuweKlant?!]';
        }
    }

    if(!isset($response)) {
        $result = $result_sth->fetch();
        $response = sprintf('status=ACK&callername=%s %s', $callername, $result->name);
    }

    print $response;

} catch(PDOException $e) {
    return;
}

Doorschakelen op basis van caller id

Het is mogelijk om door te schakelen naar een telefoonnummer op basis van het nummer van de beller. De URL die hiervoor aangeroepen moet worden is bijvoorbeeld:

http://IP/DIR/checkdestination.php?phonenumber={callerid}

Wat je terugkrijgt als het nummer niet bekend is is het volgende:

status=NAK

Bij bekende nummers krijg je een destination terug:

status=ACK&destination=%2B31507009920

Het is ook mogelijk om een intern nummer te gebruiken. Bijvoorbeeld 201,202.

Zo ziet het bijbehorende belplan eruit:


HTTProutingToDestination.png


<?php
$phonenumber = $_GET['phonenumber'];

if ($phonenumber==+31612345678) {
        //bekend telefoonnummer
        echo "status=ACK&destination=%2B31507009920";
}
else{
        //onbekend telefoonnummer
        echo "status=NAK";
}

?>

"Extended" Webhook

Onderstaande is op verzoek mogelijk.


Met de "extended" Webhook is het mogelijk om een:

  • URL aan te roepen bij inkomend gesprek
  • URL aan te roepen als er is opgenomen
  • URL aan te roepen als er is opgehangen


De volgende variabelen kun je gebruiken in deze URL's:

  • {did}: Gebelde nummer
  • {callerid}: Nummer van de beller
  • {callername}: Naam van de beller (wanneer bekend)
  • {uniqueid}: Een uniek ID van het gesprek, deze kun je gebruiken om events aan elkaar te koppelen.


Je kunt bij opgenomen en opgehangen nog de volgende variabele gebruiken:

  • {bside}: Het nummer van degene die op heeft genomen (bijv. 201 of +31507009999)


Een voorbeeld URL ziet er als volgt uit: http://website.nl/database/voip/answerCall.php?did={did}&callerid={callerid}&bside={bside}&uniqueid={uniqueid}


Stukje PHP waarmee getest kan worden:

<?php
 $message = '
    Did: '.$_GET['did'].'
    CallId: '.$_GET['callerid'].'
    Bside: '.$_GET['bside'].'
    Unique: '.$_GET['uniqueid'].'
    Status:    '.$_GET['status'].'
 ';
    
    mail('..@..nl', 'Oproep', $message);
    echo 'thanks';

?>
;