%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/modules/messageservice/lib/sender/sms/ |
| Current File : //home/bitrix/www/bitrix/modules/messageservice/lib/sender/sms/rest.php |
<?php
namespace Bitrix\MessageService\Sender\Sms;
use Bitrix\Main\Error;
use Bitrix\Main\Loader;
use Bitrix\Main\Localization\Loc;
use Bitrix\Main\ModuleManager;
use Bitrix\MessageService;
use Bitrix\MessageService\Internal\Entity\RestAppLangTable;
use Bitrix\MessageService\Internal\Entity\RestAppTable;
use Bitrix\MessageService\Sender;
use Bitrix\MessageService\Sender\Result;
use Bitrix\Rest\Sqs;
Loc::loadMessages(__FILE__);
class Rest extends Sender\Base
{
static $langFields;
public static function isSupported()
{
return ModuleManager::isModuleInstalled('rest');
}
public function getId()
{
return 'rest';
}
public function getName()
{
return Loc::getMessage('MESSAGESERVICE_SENDER_SMS_REST_NAME');
}
public function getShortName()
{
return 'REST';
}
public function canUse()
{
if (Loader::includeModule('rest') && \Bitrix\Rest\OAuthService::getEngine()->isRegistered())
{
return RestAppTable::getCount() > 0;
}
return false;
}
public function getFromList()
{
$list = array();
if (!$this->canUse())
{
return $list;
}
$result = RestAppTable::getList();
while ($row = $result->fetch())
{
$list[] = array(
'id' => $row['APP_ID'].'|'.$row['CODE'],
'name' => sprintf('[%s] %s',
$this->getLangField($row['ID'], 'APP_NAME'),
$this->getLangField($row['ID'], 'NAME')
),
'description' => $this->getLangField($row['ID'], 'DESCRIPTION')
);
}
return $list;
}
public function isCorrectFrom($from)
{
list($appId, $code) = explode('|', $from);
$restSender = RestAppTable::getList(
array(
'filter' => array(
'=APP_ID' => $appId,
'=CODE' => $code
),
'select' => array('ID')
)
)->fetch();
return $restSender !== false;
}
public function sendMessage(array $messageFields)
{
$sendResult = new Result\SendMessage();
if (!$this->canUse())
{
$sendResult->addError(new Error(Loc::getMessage('MESSAGESERVICE_SENDER_SMS_REST_ERROR_APP_NOT_FOUND')));
return $sendResult;
}
list($appId, $code) = explode('|', $messageFields['MESSAGE_FROM']);
$restSender = null;
if ($appId && $code)
{
$restSender = RestAppTable::getList(
array('filter' => array('=APP_ID' => $appId, '=CODE' => $code))
)->fetch();
}
if (!$restSender)
{
$sendResult->addError(new Error(Loc::getMessage('MESSAGESERVICE_SENDER_SMS_REST_ERROR_APP_NOT_FOUND')));
return $sendResult;
}
/*
$session = \Bitrix\Rest\Event\Session::get();
if(!$session)
{
$sendResult->addError(new Error(Loc::getMessage('MESSAGESERVICE_SENDER_SMS_REST_ERROR_SESSION')));
return $sendResult;
}
*/
$dbRes = \Bitrix\Rest\AppTable::getList(array(
'filter' => array(
'=CLIENT_ID' => $restSender['APP_ID'],
)
));
$application = $dbRes->fetch();
if (!$application)
{
$sendResult->addError(new Error(Loc::getMessage('MESSAGESERVICE_SENDER_SMS_REST_ERROR_APP_NOT_FOUND')));
return $sendResult;
}
$appStatus = \Bitrix\Rest\AppTable::getAppStatusInfo($application, '');
if($appStatus['PAYMENT_ALLOW'] === 'N')
{
$sendResult->addError(new Error(Loc::getMessage('MESSAGESERVICE_SENDER_SMS_REST_ERROR_PAYMENT_ALLOW')));
return $sendResult;
}
$auth = $messageFields['AUTHOR_ID'] > 0 ? array(
'CODE' => $restSender['CODE'],
\Bitrix\Rest\Event\Session::PARAM_SESSION => $session,
\Bitrix\Rest\OAuth\Auth::PARAM_LOCAL_USER => $messageFields['AUTHOR_ID'],
"application_token" => \CRestUtil::getApplicationToken($application),
) : array();
$messageId = md5((isset($messageFields['ID']) ? $messageFields['ID'] : 0).'|'.uniqid());
$restData = is_array($messageFields['MESSAGE_HEADERS']) ? $messageFields['MESSAGE_HEADERS'] : array();
//compatible parameters
$restData['properties'] = array(
'phone_number' => $messageFields['MESSAGE_TO'],
'message_text' => $messageFields['MESSAGE_BODY'],
);
$restData['type'] = $restSender['TYPE'];
$restData['code'] = $restSender['CODE'];
$restData['message_id'] = $messageId;
$restData['message_to'] = $messageFields['MESSAGE_TO'];
$restData['message_body'] = $messageFields['MESSAGE_BODY'];
$restData['ts'] = time();
$queryItems = array(
Sqs::queryItem(
$restSender['APP_ID'],
$restSender['HANDLER'],
$restData,
$auth,
array(
"sendAuth" => $auth? true : false,
"sendRefreshToken" => false,
"category" => Sqs::CATEGORY_DEFAULT,
)
),
);
\Bitrix\Rest\OAuthService::getEngine()->getClient()->sendEvent($queryItems);
$sendResult->setExternalId($messageId);
$sendResult->setStatus(MessageService\MessageStatus::SENT);
return $sendResult;
}
public static function resolveStatus($serviceStatus)
{
$status = parent::resolveStatus($serviceStatus);
switch ((string)$serviceStatus)
{
case 'queued':
return MessageService\MessageStatus::QUEUED;
break;
case 'sent':
return MessageService\MessageStatus::SENT;
break;
case 'delivered':
return MessageService\MessageStatus::DELIVERED;
break;
case 'undelivered':
return MessageService\MessageStatus::UNDELIVERED;
break;
case 'failed':
return MessageService\MessageStatus::FAILED;
break;
}
return $status;
}
private function getLangField($appId, $fieldName)
{
$fields = $this->getAppLangFields($appId);
if (!$fields)
{
return '';
}
$fieldLangs = $fields[$fieldName];
if (isset($fieldLangs[LANGUAGE_ID]))
{
return $fieldLangs[LANGUAGE_ID];
}
else
{
$defaultLang = Loc::getDefaultLang(LANGUAGE_ID);
if (isset($fieldLangs[$defaultLang]))
{
return $fieldLangs[$defaultLang];
}
}
return $fieldLangs['**'];
}
private function getAppLangFields($appId)
{
if (static::$langFields === null)
{
$orm = RestAppLangTable::getList();
while ($row = $orm->fetch())
{
static::$langFields[$row['APP_ID']]['NAME'][$row['LANGUAGE_ID']] = $row['NAME'];
static::$langFields[$row['APP_ID']]['APP_NAME'][$row['LANGUAGE_ID']] = $row['APP_NAME'];
static::$langFields[$row['APP_ID']]['DESCRIPTION'][$row['LANGUAGE_ID']] = $row['DESCRIPTION'];
}
}
return isset(static::$langFields[$appId]) ? static::$langFields[$appId] : null;
}
}