quarta-feira, 8 de junho de 2016

0800WEB / click-to-call com asterisk

Resumindo... O 0800Web é uma ferramenta que qualquer site pode ter para que os usuários digitem seus números telefônicos e recebam ligação da equipe da empresa ou do site no mesmo momento ou quando desejarem.

Aqui utilizaremos uma conexão AMI com o servidor responsável por efetur a chamada.

Sem delongas, vamos logo ao que interessa:


Na área do site, teremos 2 arquivos, o primeiro contém apenas o html do site e irei chamar aqui de ligame.html e o segundo é o que faz a conexão do PHP com o asterisk.


ligame.html


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>0800WEB DRAsterisk</title>
</head>
<body>
<form action="ligar.php" method="post">
<h3>DRAsterisk Liga-me</h3>
<label>Telefone com DDD:</label>
<input type="number" name="fone" required="required"/>
<button type="submit">Liga-me</button>
</form>
</body>

</html>


O arquivo ligar.php, é o segundo arquivo da área do site e é reponsável pela conexão com o asterisk e o envio da chamada. Ele também faz uma pequena validação afim de encontrar algum erro no retorno da conexão e envio da ligação.

ligar.php


<?php
//RECEBENDO NUMERO
$num = $_POST['fone'];
    echo "Dialing $num\r\n";
    $timeout = 10;
    $asterisk_ip = "192.168.1.201";
$user_manager = "drasterisk";
$senha_manager = "teste";
$channel = "SIP/4000"; //Canal interno que irá receber a chamada
$context = 'contexto-ligame';

//FAZENDO CONEXAO COM ASTERISK
$socket = fsockopen($asterisk_ip,"5038", $errno, $errstr, 10);
    if (!$socket){
echo "$errstr ($errno)\n";
}else{
   fputs($socket, "Action: Login\r\n");
   fputs($socket, "UserName: ".$user_manager."\r\n");
   fputs($socket, "Secret: ".$senha_manager."\r\n\r\n");
            //ORIGINANDO A CHAMADA
            fputs($socket, "Action: Originate\r\n" );
   fputs($socket, "Channel: ".$channel."\r\n" );
   fputs($socket, "Exten: ".$num."\r\n" );
   fputs($socket, "Context: ".$context."\r\n" );
   fputs($socket, "Priority: 1\r\n" );
   fputs($socket, "Async: yes\r\n\r\n" );
            fputs($socket, "Action: Logoff\r\n\r\n");
            /****************DEBUGAR*****************/
            //while (!feof($socket)){
            //  $retorno[] = fgets($socket);
            //}
            fclose($socket);
       }
       //VERIFICANDO SE TEM ALGUM ERRO
$result = '';
for ($i=0; $i < count($retorno) ; $i++) {
$result = (preg_match("/Response: Error/",$retorno[$i]))?'erro':$result;
echo $retorno[$i]."<br/>"; //para debugar
}
if($result == "erro"){
echo "Não foi possíve efetuar a ligação";
}else{
echo "Aguarde o retorno da chamada";
}

sleep(5);
header("Location: ligame.html");

?>


Do lado do asterisk, iremos alterar dois arquivo também (manager.conf e extensions.conf).

O manager.conf é responsável por liberar a conexão realizada pelo PHP através de um usuário e senha de autenticação, procuro também limitar somente aos IPs permitos.

/etc/asterisk/manager.conf


[general]
enabled = yes
;webenabled = yes
deny = 0.0.0.0/0.0.0.0
permit = 127.0.0.1/255.255.255.255
permit = 192.168.1.0/255.255.255.0
port = 5038

[drasterisk]
secret = teste
read = system,call,log,verbose,command,agent,user
write = system,call,log,verbose,command,agent,user

No extensions.conf, criaremos um contexto para tratar as chamadas realizadas pela interface. Aqui criei apenas um básico, mais pode-se adequar para a sua necessidade.

/etc/asterisk/extensions.conf

[contexto-ligame]
exten => _ZZ[2-9].,1,NoOp(---> NOVA LIGACAO 0800WEB <--)
same => n,Set(CDR(accountcode)=0800WEB)
same => n,Dial(SIP/operadora/0${EXTEN},60,Tg) ;SAINDO PELO VOIP
;same => n,Dial(Khomp/b0l0/021${EXTEN},60,Tg) ; SAINDO PELO HARDWARE KHOMP
;same => n,Dial(Dahdi/g0/021${EXTEN},60,Tg) ; SAINDO PELO HARDWARE DIGIUM
same => n,Hangup


É isso ai, agora basta fazer algumas modificações para adaptar da forma que precisa.

Para quem usa Elastix, ao invés de alterar o arquivo extensions.conf, altere o arquivo extensions_custom.conf (se não me falha a memória).

Para consultoria em asterisk: daniloricalmeida@gmail.com e skype danilo.almeida33

Abraços!