Server IP : 80.87.202.40 / Your IP : 216.73.216.169 Web Server : Apache System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64 User : bitrix ( 600) PHP Version : 8.2.27 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/messageservice/lib/sender/sms/ |
Upload File : |
<?php namespace Bitrix\MessageService\Sender\Sms; use Bitrix\Main\Error; use Bitrix\Main\ModuleManager; use Bitrix\Main\Result; use Bitrix\Main\Web\HttpClient; use Bitrix\Main\Web\Json; use Bitrix\Main\Config\Option; use Bitrix\MessageService\DTO; use Bitrix\MessageService\Sender; use Bitrix\MessageService\Sender\Result\MessageStatus; use Bitrix\MessageService\Sender\Result\SendMessage; use Bitrix\MessageService; class ISmsCenter extends Sender\BaseConfigurable { public const ID = 'ismscenter'; private const JSON_API_URL = 'http://isms.center/api/sms/'; public static function isSupported() { return ( ModuleManager::isModuleInstalled('b24network') || Option::get('messageservice', 'ismscenter_enabled', 'N') === 'Y' ); } public function getId() { return static::ID; } public function getName() { return 'isms.center'; } public function getShortName() { return 'isms.center'; } public function getFromList() { $from = $this->getOption('from_list'); return is_array($from) ? $from : []; } public function isRegistered() { return ( $this->getOption('login') !== null && $this->getOption('psw') !== null ); } public function register(array $fields) { $login = (string)$fields['login']; $psw = (string)$fields['psw']; $from = (string) $fields['from_list']; $result = new Result(); if ($login && $psw && $from) { $this->setOption('login', $login); $this->setOption('psw', $psw); $from = array_map( function($v) { $v = trim($v); return ['id' => $v, 'name' => $v]; }, explode(';', $from) ); $this->setOption('from_list', $from); } else { $result->addError(new Error('Empty required fields.')); } return $result; } /** * @return array [ * 'login' => '' * 'fromList' => [] * ] */ public function getOwnerInfo() { return [ 'login' => $this->getOption('login'), 'fromList' => $this->getFromList(), ]; } public function getExternalManageUrl() { return 'https://isms.center/ru'; } public function sendMessage(array $messageFields) { if (!$this->canUse()) { $result = new SendMessage(); $result->addError(new Error('Service is unavailable')); return $result; } $message = [ 'from' => $messageFields['MESSAGE_FROM'], 'to' => str_replace('+', '', $messageFields['MESSAGE_TO']), 'text' => $this->prepareMessageBodyForSend($messageFields['MESSAGE_BODY']), 'notify_url' => $this->getCallbackUrl() ]; $result = new SendMessage(); $apiResult = $this->sendApiRequest('send', $message); if (!$apiResult->isSuccess()) { $result->addErrors($apiResult->getErrors()); } else { $smsData = $apiResult->getData(); $smsId = $smsData['message_id']; if (!$smsId) { $result->addError(new Error('Service error.')); } 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->sendApiRequest('report', [ 'message_id' => $result->getExternalId(), ]); if (!$apiResult->isSuccess()) { $result->addErrors($apiResult->getErrors()); } else { $smsData = $apiResult->getData(); if (!$smsData) { $result->addError(new Error('Service error.')); } $result->setStatusText($smsData['status']); $result->setStatusCode(self::resolveStatus($smsData['status'])); } return $result; } public static function resolveStatus($serviceStatus) { switch ((string)$serviceStatus) { case 'send': return MessageService\MessageStatus::QUEUED; break; case 'sending': return MessageService\MessageStatus::SENDING; break; case 'sent': return MessageService\MessageStatus::SENT; break; case 'delivered': return MessageService\MessageStatus::DELIVERED; break; case 'undelivered': return MessageService\MessageStatus::UNDELIVERED; break; } return parent::resolveStatus($serviceStatus); } private function sendApiRequest($path, array $params) { $login = $this->getOption('login'); $psw = $this->getOption('psw'); return $this->sendHttpRequest($path, $login, $psw, $params); } private function sendHttpRequest($path, $login, $psw, array $params): Sender\Result\HttpRequestResult { $httpClient = new HttpClient([ "socketTimeout" => $this->socketTimeout, "streamTimeout" => $this->streamTimeout, 'waitResponse' => true, ]); $httpClient->setCharset('UTF-8'); $httpClient->setHeader('User-Agent', 'Bitrix24'); $httpClient->setHeader('Content-Type', 'application/json'); $httpClient->setAuthorization($login, $psw); $result = new Sender\Result\HttpRequestResult(); $answer = [ 'error_code' => 500, 'error_message' => 'Service error' ]; $method = HttpClient::HTTP_POST; $url = self::JSON_API_URL . $path; $body = Json::encode($params); if ($path === 'report') { $method = HttpClient::HTTP_GET; $url .= '?' . http_build_query($params); $body = null; } $result->setHttpRequest(new DTO\Request([ 'method' => $method, 'uri' => $url, 'headers' => method_exists($httpClient, 'getRequestHeaders') ? $httpClient->getRequestHeaders()->toArray() : [], 'body' => $params ])); if ($httpClient->query($method, $url, $body)) { try { $answer = Json::decode($httpClient->getResult()); } catch (\Bitrix\Main\ArgumentException $e) { } } if (isset($answer['error_code'])) { $result->addError(new Error($answer['error_message'], $answer['error_code'])); } $result->setHttpResponse(new DTO\Response([ 'statusCode' => $httpClient->getStatus(), 'headers' => $httpClient->getHeaders()->toArray(), 'body' => $httpClient->getResult(), 'error' => Sender\Util::getHttpClientErrorString($httpClient) ])); $result->setData($answer); return $result; } }