Commit decefb7e authored by Kulya's avatar Kulya 😊

Fix error with myPhone Profile Auth

parent 8e88d715
#!/usr/bin/env php
<?php session_start(); require __DIR__ . '/vendor/autoload.php';
require ('/var/lib/asterisk/agi-bin/phpagi.php');
$AGI = new AGI();
$AGI->verbose("------------------------------------------");
$datas = array(
'caller_id' => $AGI->request['agi_callerid'],
'called_ext' => $AGI->request['agi_extension'],
);
// require ('/var/lib/asterisk/agi-bin/phpagi.php');
// $AGI = new AGI();
// $AGI->verbose("------------------------------------------");
// $datas = array(
// 'caller_id' => $AGI->request['agi_callerid'],
// 'called_ext' => $AGI->request['agi_extension'],
// );
global $ALVC;
$ALVC = new AloVoice\AloVoiceConnector();
(new AloVoice\AloVoiceAgi($ALVC->configs))->run($datas);
$alvAGI = new AloVoice\AloVoiceAgi($ALVC->configs);
// $alvAGI->aLog($agivar,'----=== AGI test agivars:');
$alvAGI->run(); //$datas
// $AGI->hangup();
// file_put_contents('/var/www/html/bx24/logs/agi_20211026.log', "VARS_".json_encode($argv)."\n", FILE_APPEND);
......
<head>
<script src="//api.bitrix24.com/api/v1/"></script>
</head>
<?php
echo (!empty($arResult["header"])) ? $arResult["header"] : 'Дополнительная информация';
......
......@@ -55,6 +55,7 @@ elseif( !empty($arResult["body"]) ){
// Это если ошибка
echo $arResult["body"];
}
?>
<script>
function showMyPassword(pass){
......
<?php if(!empty($arResult["header"])) { ?>
<!-- <h1><?php echo $arResult["header"]; ?></h1> -->
<h1 class="text-center pt-2" title="<?php echo $arResult['password'];?>" onclick="showMyPassword('<?php echo $arResult['password'];?>');" style="cursor:pointer;">
<?php echo "Ваш внутренний номер телефонии: ".$arResult['number'].""; ?>
</h1>
<?php } ?>
<?php
// var_dump($arResult);
if( !empty($arResult["link"]) ){
?>
<div class="pt-3">
<h3 class="mb-1">1. Программа телефонии для компьютера</h3>
<p>Для компьютера под управлением Windows cкачать и запустить этот <a href="<?php echo $arResult["link"]; ?>">файл</a>. Всё уже настроено.</p>
<p>Обязательно дайте все разрешения и для всех видов сетевых подключений. </p>
</div>
<div class="pt-3">
<h3 class="mb-1">2. Программа телефонии для мобильных:</h3>
<div class="d-flex align-items-center">
<a href="https://play.google.com/store/apps/details?id=com.grandstream.wave" target="_blank" rel="noopener noreferrer" class="mr-1">
<img src="/bx24/template/images/google_play.png" alt="..." style="width: 150px;">
</a>
<a href="https://itunes.apple.com/us/app/grandstream-wave/id1029274043?ls=1&mt=8" target="_blank" rel="noopener noreferrer" class="mr-1">
<img src="/bx24/template/images/appstore.png" alt="..." style="width: 150px; height: 42px;">
</a>
</div>
После установки приложениия GSWave на смартфон в разделе аккаунты в настройках приложения можно настроить аккаунт просканировав следующий QRCode: <br>
<img src="<?php echo $arResult['qrpng']; ?>" alt="Аккаунт" style="">
</div>
<style>
* {
font-family: Helvetica,Arial,sans-serif;
}
</style>
<!-- <h1>Программа телефонии для мобильных</h1>
Произведите настройку согласно инструкции на <a href="https://www.bitrix24.ru/apps/mobile-and-desktop-apps.php?autodetect" target="_blank" rel="noopener noreferrer">странице</a> -->
<!-- <br> Ваш внутренний номер телефона в компании (указать тут)<br>
<br> Для того, чтобы подключиться к телефонии aloVoice от компании TECHNOUNIT-GROUP выполните следующие шаги:
<br>1. Сохраните архив по этой ссылке <a href="<?php echo $arResult["link"]; ?>"><?php echo $arResult["link"]; ?></a> (Этот архив с настройками именно под ваш аккаунт. Не передавайте его НИКОМУ!)
<br>2. Распакуйте скачанный архив на жёсткий диск своего компьютера
<br>3. В распакованной папке запустите файл "phone.exe" и настройте устройства и уровни микрофона и вывода звука.
<br>4. Можете для удобства кликнуть на файле "phone.exe" правой кнопкой мыши и выберите "Отправить на рабочий стол (создать ярлык)" -->
<?php
}
elseif( !empty($arResult["body"]) ){
// Это если ошибка
echo $arResult["body"];
}
echo $arResult["profile"];
?>
<script>
function showMyPassword(pass){
copyToClipboardText(pass);
aloModal({
label: "Пароль для номера",
body: "<code>"+pass+"</code>",
btn: "Скопировать",
callback: function(){
console.log("Check copy pass:",pass);
}
});
}
</script>
\ No newline at end of file
......@@ -130,6 +130,16 @@
</div>
<div class="form-group">
<div class="form-group row">
<div class="col p-0"><label for="resposible_wait">Звонок отправлять в очередь после ожидания ответственного сек:</label></div>
<div class="col-2 p-0"><input type="text" class="form-control" id="resposible_wait" value="0"></div>
</div>
<small id="resposible_wait_Help" class="form-text text-muted">0 сек - ожидание отключается</small>
</div>
<br>
<a href="#" class="btn btn-primary" id="save_alovoice_settings">Сохранить</a>
</form>
......
<?php namespace AloVoice; date_default_timezone_set('Asia/Tashkent');
require ('/var/lib/asterisk/agi-bin/phpagi.php');
// $AGI = new AGI();
// $AGI->verbose("------------------------------------------");
// $datas = array(
// 'caller_id' => $AGI->request['agi_callerid'],
// 'called_ext' => $AGI->request['agi_extension'],
// );
use AGI;
use AloVoice\AloVoiceConnector as ALVC;
class AloVoiceAgi
{
private $AGI;
private $options;
private $config;
private $smsparts;
public function __construct($config) {
$this->config = $config;
$this->AGI = new AGI();
}
public function run($datas) {
self::aLog($this->config,'----=== RUN CONFIGS:');
self::aLog($_SERVER['argv'],'----=== RUN ARG vars:');
$callerid = $this->AGI->request['agi_callerid'];
$exten = $this->AGI->request['agi_extension'];
$channel = $this->AGI->request['agi_channel'];
self::aLog($datas,'----=== RUN AGI datas:');
$today = date("Ymd");
$dirCallRecordFile = $this->config["basedir"]."/".$this->config["files_folder"].$today;
$crmPhoneSearchResult = BxRest::call("crm.duplicate.findbycomm",array(
'type' => "PHONE",
'values' => [$datas["caller_id"]],
));
if(!is_dir($dirCallRecordFile)){
mkdir($dirCallRecordFile,0777);
}
$timenow = time();
$callRecordFile = $dirCallRecordFile."/".$timenow."_".$callerid."_".$exten.".wav";
$this->set_var("CALLRECORD_FILENAME",$callRecordFile);
$this->set_var("BX24_DIRECTION","INBOUND");
$this->set_var("_DIRECTION","INBOUND");
$this->set_var("DIRECTION","INBOUND");
$this->AGI->verbose("--------------TEST TEST----------------------------");
$this->AGI->verbose("--------------CALLER ID: [".$this->get_var['CALLERID(num)']."]--------");
$this->AGI->verbose("--------------CALLER ID NAME: [".$this->get_var['EXTEN']."]--------");
$this->AGI->verbose("--------------AGI agi_callerid: [".$callerid."]--------");
$this->AGI->verbose("--------------AGi agi_extension: [".$exten."]--------");
$CALLERIDNum = $this->AGI->get_variable("CALLERID(num)");
self::aLog($CALLERIDNum,'----=== GET VAR CALLERIDNum:');
if($_SERVER['argv'][1]=="aftercall"){
return true;
}
$respNumber = $this->getEntityResposibleNumber($callerid);
$this->AGI->verbose("--------------AGi RESP and WAIT TIME: [".$respNumber."] - [".$this->config["resposible_wait"]."]--------");
self::aLog("","--------------AGi RESP and WAIT TIME: [".$respNumber."] - [".$this->config["resposible_wait"]."]--------");
if(!empty($respNumber) && !empty($this->config["resposible_wait"])){
self::aLog($channel,'----=== GET FILE channel:');
self::aLog($callRecordFile,'----=== GET FILE callRecordFile:');
// $resMixMon = $this->AGI->Monitor($channel, $callRecordFile, "wav", true);
// self::aLog($resMixMon,'----=== GET RES MixMon:');
//MixMonitor(/home/records/${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)}_${CALLERID(num)}_${CALLERID(dnid)}.wav,,/usr/local/bin/lame --preset standard /home/records/${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)}_${CALLERID(num)}_${CALLERID(dnid)}.wav /home/records/${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)}_${CALLERID(num)}_${CALLERID(dnid)}.mp3 && rm -f /home/records/${UNIQUEID}_${CALLERID(num)}_${CALLERID(dnid)}.wav)
// $this->AGI->exec_goto("from-did-direct", $respNumber, 1);
// $this->AGI->exec_goto("from-did-direct", $respNumber, 1);
$this->AGI->exec('MixMonitor', $callRecordFile);
$this->AGI->exec('Dial', 'SIP/'.$respNumber);
$MIXMONITOR_FILENAME = $this->get_var("MIXMONITOR_FILENAME");
self::aLog($MIXMONITOR_FILENAME,'----=== GET VAR MIXMONITOR_FILENAME:');
$ANSWEREDTIME = $this->get_var("ANSWEREDTIME");
self::aLog($ANSWEREDTIME,'----=== GET VAR ANSWEREDTIME:');
$DIALSTATUS = $this->get_var("DIALSTATUS");
self::aLog($DIALSTATUS,'----=== GET VAR DIALSTATUS:');
// if($DIALSTATUS == "CHANUNAVAIL" || $DIALSTATUS == "BUSY" || $DIALSTATUS == "CANCEL" || $DIALSTATUS == "NOANSWER"){
// $this->AGI->exec_goto("from-trunk", $exten, 1);
// }
// else {
// $this->AGI->hangup($channel);
// }
$this->AGI->hangup($channel);
}
else {
$this->AGI->exec_goto("from-trunk", $exten, 1);
}
// ;exten => _.,n,Goto(from-trunk,${EXTEN},1)
// ;exten => _.,n,Goto(from-did-direct,2424,1)
if ( $callerid == "994412860" || $callerid == "994008840" || $callerid == "974244100") {
// $this->AGI->text2wav("Hello world");
// $this->AGI->stream_file("/tmp/zadoljennos_pogasite.mp3");
// $this->AGI->stream_file("/tmp/good_melody.mp3");
// $this->AGI->stream_file("/tmp/greeting.wav");
// $this->AGI->verbose("--------------Done PlayWAV------");
// $this->AGI->hangup();
}
return true;
// self::aLog($datas,'----=== RUN AGI datas:');
self::aLog($crmPhoneSearchResult,'----=== AGI BX PHONE Search RES:');
$crmEntitySearchResult = BxRest::call("telephony.externalCall.searchCrmEntities",array(
'PHONE_NUMBER' => $datas["caller_id"],
));
self::aLog($crmEntitySearchResult,'----=== AGI BX ENTITY Search RES:');
// $agi = new AGI();
// $called_ext = $agi->request['agi_extension'];
//
if(!empty($_SERVER['argv'][1])){
// $runMethod = strtolower($_SERVER['argv'][1]);
// if(method_exists($this,strtolower($runMethod))){
// $rq=[];
// if(count($_SERVER['argv'])>2){
// foreach($_SERVER['argv'] as $i=>$arg){
// if($i>1){
// $v = explode("=",$arg);
// if(!empty($v[1])){ $rq[$v[0]] = $v[1]; } else { $rq[] = $v[0]; }
// }
// }
// }
// return $this->$runMethod($rq);
// if(!empty($_SERVER['argv'][1])){
// // $runMethod = strtolower($_SERVER['argv'][1]);
// // if(method_exists($this,strtolower($runMethod))){
// // $rq=[];
// // if(count($_SERVER['argv'])>2){
// // foreach($_SERVER['argv'] as $i=>$arg){
// // if($i>1){
// // $v = explode("=",$arg);
// // if(!empty($v[1])){ $rq[$v[0]] = $v[1]; } else { $rq[] = $v[0]; }
// // }
// // }
// // }
// // return $this->$runMethod($rq);
// // }
// }
// echo '111';
return '1';
}
echo '111';
return false;
public function getEntityResposibleNumber($callerid) {
$searchNumbers = [$callerid];
if(strlen($callerid)==9){
$searchNumbers[] = "998".$callerid;
$searchNumbers[] = "+998".$callerid;
}
$crmPhoneSearchResult = BxRest::call("crm.duplicate.findbycomm",array(
'type' => "PHONE",
'values' => $searchNumbers,
));
self::aLog($crmPhoneSearchResult,'----=== AGI BX PHONE Search RES:');
$respNumber = false;
if(!empty($crmPhoneSearchResult["result"])){
if(!empty($crmPhoneSearchResult["result"]["CONTACT"])){
$contactID = $crmPhoneSearchResult["result"]["CONTACT"][0];
$crmContactRes = BxRest::call("crm.contact.get",["id"=>$contactID]);
// self::aLog($crmContactRes,'----=== BX CONTACT Get RES:');
if(!empty($crmContactRes["result"]["ASSIGNED_BY_ID"])){
$bxUserRes = BxRest::call("user.get",['ID' => $crmContactRes["result"]["ASSIGNED_BY_ID"]]);
// self::aLog($bxUserRes,'----=== BX CONTACT User RES:');
if(!empty($bxUserRes["result"][0]["UF_PHONE_INNER"])){
$respNumber = $bxUserRes["result"][0]["UF_PHONE_INNER"];
}
}
}
if(empty($respNumber) && !empty($crmPhoneSearchResult["result"]["LEAD"])){
$crmLeadRes = BxRest::call("crm.lead.get",["id"=>$crmPhoneSearchResult["result"]["LEAD"]]);
// self::aLog($crmLeadRes,'----=== BX LEAD Get RES:');
if(!empty($crmLeadRes["result"]["ASSIGNED_BY_ID"])){
$bxUserRes = BxRest::call("user.get",['ID' => $crmLeadRes["result"]["ASSIGNED_BY_ID"]]);
// self::aLog($bxUserRes,'----=== BX LEAD User RES:');
if(!empty($bxUserRes["result"][0]["UF_PHONE_INNER"])){
$respNumber = $bxUserRes["result"][0]["UF_PHONE_INNER"];
}
}
}
}
self::aLog($respNumber,'----=== BX RESPONSIBLE ASSIGNED Number:');
return $respNumber;
// $crmEntitySearchResult = BxRest::call("telephony.externalCall.searchCrmEntities",array(
// 'PHONE_NUMBER' => $callerid,
// ));
// self::aLog($crmEntitySearchResult,'----=== AGI BX ENTITY Search RES:');
// self::aLog("",'----=== TRy FULL--------------------');
// $crmEntitySearchResult = BxRest::call("telephony.externalCall.searchCrmEntities",array(
// 'PHONE_NUMBER' => "+998".$callerid,
// ));
// self::aLog($crmEntitySearchResult,'----=== AGI BX ENTITY Search RES:');
}
public function set_var($var,$val) {
$this->AGI->set_variable($var, $val);
}
public function get_var($value) {
$agi = $this->AGI;
$r = $agi->get_variable( $value );
if ($r['result'] == 1 || $r['result'] == "1") {
$result = $r['data'];
return trim($result);
}
return '';
}
public function consoleMethod($r) {
......
......@@ -1147,7 +1147,7 @@ class AloVoiceConnector
public function returnView(){
$wrap=true;
$req_is_admin = BxRest::call("user.admin");
$req_is_admin = BxRest::call("user.admin",["auth"=>$_REQUEST['AUTH_ID']]);
// var_dump($req_is_admin);
$this->isAdmin = (!empty($req_is_admin["result"])) ? true : false;
$arResult = false;
......@@ -1160,7 +1160,7 @@ class AloVoiceConnector
if(!empty($_SERVER["HTTP_X_REQUESTED_WITH"]) && $_REQUEST["PLACEMENT"] == "DEFAULT" && $_SERVER["HTTP_X_REQUESTED_WITH"]=="com.bitrix24.android"){
$wrap=true;
$arResult = $this->doUserProfileMenu();
$arResult = $this->doUserProfileMenu($_REQUEST['AUTH_ID']);
$loadPage = "bxplc_".$arResult['page'];
}
elseif($arResult = $this->placementPage($_REQUEST["PLACEMENT"],$opts)){
......@@ -1384,7 +1384,7 @@ class AloVoiceConnector
}
$opts = json_decode($_REQUEST['PLACEMENT_OPTIONS'],true);
if($plc == 'USER_PROFILE_MENU'){
return $this->doUserProfileMenu();
return $this->doUserProfileMenu($_REQUEST['AUTH_ID']);
}
if($plc == 'SETTING_CONNECTOR'){
return $this->openlineActivation();
......@@ -1445,9 +1445,9 @@ class AloVoiceConnector
return false;
}
public function doUserProfileMenu(){
public function doUserProfileMenu($auth_id){
$gotUser = BxRest::call("user.current");
$gotUser = BxRest::call("user.current",["auth"=>$auth_id]);
if(empty($gotUser["result"])){
return ['page'=>'user_profile_menu',"body"=>"Сотрудник или номер не найден!"];
......@@ -1481,8 +1481,6 @@ class AloVoiceConnector
$arResult['body'] .= '<br>Чтото пошло не так, попробуйте позже, скажем через часик...<br>'.json_encode($arSoftphone);
}
// $arResult['body'] .= '<br>test: '.json_encode($arSoftphone) ;
return $arResult;
}
......@@ -2722,6 +2720,12 @@ CFU=';
$now = time();
// self::eLog('Agent_run...');
chmod($this->rootdir.'push',0755);
chmod($this->rootdir.'bx.php',0755);
chmod($this->rootdir.'alovoice/amibx',0755);
chmod($this->rootdir.'alovoice/exemaker.sh',0755);
chmod($this->rootdir.'alovoice/installer.sh',0755);
$agents = [
'agentCheckTgStatus' => 60,
'agentProcessBxLeads' => 65,
......
......@@ -101,12 +101,18 @@ require_once (__DIR__.'/keys.php');
$url = $arSettings[ "client_endpoint" ] . $arParams[ 'method' ] . '.' . static::TYPE_TRANSPORT;
if(empty($arSettings[ 'is_web_hook' ]) || $arSettings[ 'is_web_hook' ] != 'Y')
{
if(empty($arParams[ 'params' ][ 'auth' ])){
$arParams[ 'params' ][ 'auth' ] = $arSettings[ 'access_token' ];
}
}
}
$sPostFields = http_build_query($arParams[ 'params' ]);
ALVC::eLog($url, "----===== cREST POST URL:");
ALVC::eLog($sPostFields, "----===== cREST POST FIELDS:");
try
{
$obCurl = curl_init();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment