Your IP : 3.14.249.188
<?php
namespace Bitrix\MessageService\Sender\Sms;
use Bitrix\Main\Error;
use Bitrix\Main\Localization\Loc;
use Bitrix\Main\ModuleManager;
use Bitrix\Main\Result;
use Bitrix\Main\Web\HttpClient;
use Bitrix\Main\Web\Json;
use Bitrix\MessageService\Sender;
use Bitrix\MessageService\Sender\Result\MessageStatus;
use Bitrix\MessageService\Sender\Result\SendMessage;
use Bitrix\MessageService;
Loc::loadMessages(__FILE__);
class SmsLineBy extends Sender\BaseConfigurable
{
const JSON_API_URL = 'https://api.smsline.by/v3/';
public static function isSupported()
{
return ModuleManager::isModuleInstalled('b24network');
}
public function getId()
{
return 'smslineby';
}
public function getName()
{
return 'SMS-line';
}
public function getShortName()
{
return 'smsline.by';
}
public function getFromList()
{
$from = $this->getOption('from_list');
return is_array($from) ? $from : [];
}
public function isRegistered()
{
return (
$this->getOption('login') !== null
&&
$this->getOption('api_key') !== null
);
}
public function register(array $fields)
{
$login = (string) $fields['login'];
$key = (string) $fields['api_key'];
$result = $this->sendGetRequest('balance/packets', $this->makeSignature('balancepackets', $key), $login);
if ($result->isSuccess())
{
$this->setOption('login', $login);
$this->setOption('api_key', $key);
}
return $result;
}
/**
* @return array [
* 'login' => ''
* ]
*/
public function getOwnerInfo()
{
return array(
'login' => $this->getOption('login'),
);
}
public function getExternalManageUrl()
{
return 'https://mobilemarketing.by/login/';
}
public function sendMessage(array $messageFields)
{
if (!$this->canUse())
{
$result = new SendMessage();
$result->addError(new Error('Service is unavailable'));
return $result;
}
$message = [
'target' => $messageFields['MESSAGE_FROM'],
'msisdn' => str_replace('+', '', $messageFields['MESSAGE_TO']),
'text' => $messageFields['MESSAGE_BODY'],
'callback_url' => $this->getCallbackUrl()
];
$result = new SendMessage();
$apiResult = $this->sendPostRequest('messages/single/sms', $message);
if (!$apiResult->isSuccess())
{
$result->addErrors($apiResult->getErrors());
}
else
{
$resultData = $apiResult->getData();
$smsData = $resultData['message'];
$smsId = $smsData['id_message'];
if (!$smsId)
{
$result->addError(new Error($this->getErrorMessage(-1000)));
}
else
{
$result->setExternalId($smsId);
$result->setAccepted();
}
}
return $result;
}
public function getMessageStatus(array $messageFields)
{
$result = new MessageStatus();
$result->setId($messageFields['ID']);
$result->setExternalId($messageFields['EXTERNAL_ID']);
if (!$this->canUse())
{
$result->addError(new Error('Service is unavailable'));
return $result;
}
$apiResult = $this->sendGetRequest('messages/'.$result->getExternalId());
if (!$apiResult->isSuccess())
{
$result->addErrors($apiResult->getErrors());
}
else
{
$resultData = $apiResult->getData();
$smsData = $resultData['message'];
if (!$smsData)
{
$result->addError(new Error($this->getErrorMessage(-1000)));
}
$result->setStatusText($smsData['state']['name']);
$result->setStatusCode(self::resolveStatus($smsData['state']['state']));
}
return $result;
}
public static function resolveStatus($serviceStatus)
{
$status = parent::resolveStatus($serviceStatus);
switch ($serviceStatus)
{
case 'seen':
return MessageService\MessageStatus::READ;
break;
case 'delivered':
return MessageService\MessageStatus::DELIVERED;
break;
case 'accepted':
return MessageService\MessageStatus::ACCEPTED;
break;
case 'enrouted':
return MessageService\MessageStatus::SENT;
break;
case 'undeliverable':
case 'expired':
case 'deleted':
return MessageService\MessageStatus::UNDELIVERED;
break;
case 'reject':
case 'notsent':
case 'textblacklist':
case 'noviber':
case 'blocked':
case 'unknown':
case 'nostatus':
return MessageService\MessageStatus::FAILED;
break;
}
return $status;
}
public function sync()
{
if ($this->isRegistered())
{
$this->loadFromList();
}
return $this;
}
private function loadFromList()
{
$result = $this->sendGetRequest('balance/packets');
if ($result->isSuccess())
{
$from = [];
$resultData = $result->getData();
foreach ($resultData['packets'] as $packet)
{
if (isset($packet['targets']) && is_array($packet['targets']))
{
foreach ($packet['targets'] as $target)
{
$from[] = array(
'id' => $target,
'name' => $target
);
}
}
}
$this->setOption('from_list', $from);
}
}
private function makeSignature($text, $key = null)
{
if (!$key)
{
$key = $this->getOption('api_key');
}
return hash_hmac("sha256", $text, $key);
}
private function sendGetRequest($path, $signature = null, $login = null)
{
if (!$signature)
{
$signature = $this->makeSignature(str_replace('/', '', $path));
}
if (!$login)
{
$login = $this->getOption('login');
}
return $this->sendHttpRequest(HttpClient::HTTP_GET, $login, $signature, $path);
}
private function sendPostRequest($path, array $params)
{
$login = $this->getOption('login');
$requestBody = Json::encode($params);
$signature = $this->makeSignature(str_replace('/', '', $path).$requestBody);
return $this->sendHttpRequest(HttpClient::HTTP_POST, $login, $signature, $path, $requestBody);
}
private function sendHttpRequest($method, $login, $signature, $path, $body = null)
{
$httpClient = new HttpClient(array(
"socketTimeout" => 10,
"streamTimeout" => 30,
"waitResponse" => true,
));
$httpClient->setCharset('UTF-8');
$httpClient->setHeader('User-Agent', 'Bitrix24');
$httpClient->setHeader('Content-Type', 'application/json');
$httpClient->setHeader('Authorization-User', $login);
$httpClient->setHeader('Authorization', "Bearer $signature");
$result = new Result();
$answer = ['error' => -1000];
$url = self::JSON_API_URL.$path;
if ($httpClient->query($method, $url, $body))
{
try
{
$answer = Json::decode($httpClient->getResult());
}
catch (\Bitrix\Main\ArgumentException $e)
{
}
}
if (isset($answer['error']))
{
$result->addError(new Error($this->getErrorMessage($answer['error']['code'], $answer['error']['message'])));
}
$result->setData($answer);
return $result;
}
private function getErrorMessage($errorCode, $text = null)
{
$message = Loc::getMessage('MESSAGESERVICE_SENDER_SMS_SMSLINE_ERROR_'.$errorCode, null, 'ru');
return $message ?: ($text ?: Loc::getMessage('MESSAGESERVICE_SENDER_SMS_SMSLINE_ERROR_OTHER',null, 'ru'));
}
}