1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
smslineby.php
См. документацию.
1<?php
2namespace Bitrix\MessageService\Sender\Sms;
3
4use Bitrix\Main\Error;
5use Bitrix\Main\Localization\Loc;
6use Bitrix\Main\ModuleManager;
7use Bitrix\Main\Result;
8use Bitrix\Main\Web\HttpClient;
9use Bitrix\Main\Web\Json;
10use Bitrix\Main\Config\Option;
11
12use Bitrix\MessageService\Sender;
13use Bitrix\MessageService\Sender\Result\MessageStatus;
14use Bitrix\MessageService\Sender\Result\SendMessage;
15
16use Bitrix\MessageService;
17
18Loc::loadMessages(__FILE__);
19
21{
22 public const ID = 'smslineby';
23
24 const JSON_API_URL = 'https://api.smsline.by/v3/';
25
26 public static function isSupported()
27 {
28 return (
30 || Option::get('messageservice', 'smslineby_enabled', 'N') === 'Y'
31 );
32 }
33
34 public function getId()
35 {
36 return static::ID;
37 }
38
39 public function getName()
40 {
41 return 'SMS-line';
42 }
43
44 public function getShortName()
45 {
46 return 'smsline.by';
47 }
48
49 public function getFromList()
50 {
51 $from = $this->getOption('from_list');
52 return is_array($from) ? $from : [];
53 }
54
55 public function isRegistered()
56 {
57 return (
58 $this->getOption('login') !== null
59 &&
60 $this->getOption('api_key') !== null
61 );
62 }
63
64 public function register(array $fields)
65 {
66 $login = (string) $fields['login'];
67 $key = (string) $fields['api_key'];
68
69 $result = $this->sendGetRequest('balance/packets', $this->makeSignature('balancepackets', $key), $login);
70 if ($result->isSuccess())
71 {
72 $this->setOption('login', $login);
73 $this->setOption('api_key', $key);
74 }
75
76 return $result;
77 }
78
84 public function getOwnerInfo()
85 {
86 return array(
87 'login' => $this->getOption('login'),
88 );
89 }
90
91 public function getExternalManageUrl()
92 {
93 return 'https://mobilemarketing.by/login/';
94 }
95
97 {
98 if (!$this->canUse())
99 {
100 $result = new SendMessage();
101 $result->addError(new Error('Service is unavailable'));
102 return $result;
103 }
104
105 $message = [
106 'target' => $messageFields['MESSAGE_FROM'],
107 'msisdn' => str_replace('+', '', $messageFields['MESSAGE_TO']),
108 'text' => $this->prepareMessageBodyForSend($messageFields['MESSAGE_BODY']),
109 'callback_url' => $this->getCallbackUrl()
110 ];
111
112 $result = new SendMessage();
113 $apiResult = $this->sendPostRequest('messages/single/sms', $message);
114 $result->setServiceRequest($apiResult->getHttpRequest());
115 $result->setServiceResponse($apiResult->getHttpResponse());
116
117 if (!$apiResult->isSuccess())
118 {
119 $result->addErrors($apiResult->getErrors());
120 }
121 else
122 {
123 $resultData = $apiResult->getData();
124 $smsData = $resultData['message'];
125 $smsId = $smsData['id_message'];
126
127 if (!$smsId)
128 {
129 $result->addError(new Error($this->getErrorMessage(-1000)));
130 }
131 else
132 {
133 $result->setExternalId($smsId);
134 $result->setAccepted();
135 }
136 }
137
138 return $result;
139 }
140
142 {
143 $result = new MessageStatus();
144 $result->setId($messageFields['ID']);
145 $result->setExternalId($messageFields['EXTERNAL_ID']);
146
147 if (!$this->canUse())
148 {
149 $result->addError(new Error('Service is unavailable'));
150 return $result;
151 }
152
153 $apiResult = $this->sendGetRequest('messages/'.$result->getExternalId());
154 if (!$apiResult->isSuccess())
155 {
156 $result->addErrors($apiResult->getErrors());
157 }
158 else
159 {
160 $resultData = $apiResult->getData();
161 $smsData = $resultData['message'];
162
163 if (!$smsData)
164 {
165 $result->addError(new Error($this->getErrorMessage(-1000)));
166 }
167
168 $result->setStatusText($smsData['state']['name']);
169 $result->setStatusCode(self::resolveStatus($smsData['state']['state']));
170 }
171
172 return $result;
173 }
174
175 public static function resolveStatus($serviceStatus)
176 {
177 $status = parent::resolveStatus($serviceStatus);
178
179 switch ($serviceStatus)
180 {
181 case 'seen':
183 break;
184 case 'delivered':
186 break;
187 case 'accepted':
189 break;
190 case 'enrouted':
192 break;
193 case 'undeliverable':
194 case 'expired':
195 case 'deleted':
197 break;
198 case 'reject':
199 case 'notsent':
200 case 'textblacklist':
201 case 'noviber':
202 case 'blocked':
203 case 'unknown':
204 case 'nostatus':
206 break;
207 }
208
209 return $status;
210 }
211
212 public function sync()
213 {
214 if ($this->isRegistered())
215 {
216 $this->loadFromList();
217 }
218 return $this;
219 }
220
221 private function loadFromList()
222 {
223 $result = $this->sendGetRequest('balance/packets');
224
225 if ($result->isSuccess())
226 {
227 $from = [];
228 $resultData = $result->getData();
229 foreach ($resultData['packets'] as $packet)
230 {
231 if (isset($packet['targets']) && is_array($packet['targets']))
232 {
233 foreach ($packet['targets'] as $target)
234 {
235 $from[] = array(
236 'id' => $target,
237 'name' => $target
238 );
239 }
240 }
241 }
242
243 $this->setOption('from_list', $from);
244 }
245 }
246
247 private function makeSignature($text, $key = null)
248 {
249 if (!$key)
250 {
251 $key = $this->getOption('api_key');
252 }
253
254 return hash_hmac("sha256", $text, $key);
255 }
256
257 private function sendGetRequest($path, $signature = null, $login = null)
258 {
259 if (!$signature)
260 {
261 $signature = $this->makeSignature(str_replace('/', '', $path));
262 }
263
264 if (!$login)
265 {
266 $login = $this->getOption('login');
267 }
268
269 return $this->sendHttpRequest(HttpClient::HTTP_GET, $login, $signature, $path);
270 }
271
272 private function sendPostRequest($path, array $params)
273 {
274 $login = $this->getOption('login');
275 $requestBody = Json::encode($params);
276 $signature = $this->makeSignature(str_replace('/', '', $path).$requestBody);
277
278 return $this->sendHttpRequest(HttpClient::HTTP_POST, $login, $signature, $path, $requestBody);
279 }
280
281
282 private function sendHttpRequest($method, $login, $signature, $path, $body = null): Sender\Result\HttpRequestResult
283 {
284 $httpClient = new HttpClient(array(
285 "socketTimeout" => $this->socketTimeout,
286 "streamTimeout" => $this->streamTimeout,
287 "waitResponse" => true,
288 ));
289 $httpClient->setCharset('UTF-8');
290 $httpClient->setHeader('User-Agent', 'Bitrix24');
291 $httpClient->setHeader('Content-Type', 'application/json');
292 $httpClient->setHeader('Authorization-User', $login);
293 $httpClient->setHeader('Authorization', "Bearer $signature");
294
295 $result = new Sender\Result\HttpRequestResult();
296 $answer = ['error' => -1000];
297
298 $url = self::JSON_API_URL.$path;
299
300 $result->setHttpRequest(new MessageService\DTO\Request([
301 'method' => $method,
302 'uri' => $url,
303 'headers' => method_exists($httpClient, 'getRequestHeaders') ? $httpClient->getRequestHeaders()->toArray() : [],
304 'body' => $body,
305 ]));
306 if ($httpClient->query($method, $url, $body))
307 {
308 try
309 {
310 $answer = Json::decode($httpClient->getResult());
311 }
312 catch (\Bitrix\Main\ArgumentException $e)
313 {
314 }
315 }
316
317 if (isset($answer['error']))
318 {
319 $result->addError(new Error($this->getErrorMessage($answer['error']['code'], $answer['error']['message'])));
320 }
321
322 $result->setHttpResponse(new MessageService\DTO\Response([
323 'statusCode' => $httpClient->getStatus(),
324 'headers' => $httpClient->getHeaders()->toArray(),
325 'body' => $httpClient->getResult(),
326 'error' => Sender\Util::getHttpClientErrorString($httpClient)
327 ]));
328
329 $result->setData($answer);
330
331 return $result;
332 }
333
334 private function getErrorMessage($errorCode, $text = null)
335 {
336 $message = Loc::getMessage('MESSAGESERVICE_SENDER_SMS_SMSLINE_ERROR_'.$errorCode, null, 'ru');
337 return $message ?: ($text ?: Loc::getMessage('MESSAGESERVICE_SENDER_SMS_SMSLINE_ERROR_OTHER',null, 'ru'));
338 }
339}
$path
Определения access_edit.php:21
$messageFields
Определения callback_ednaru.php:22
$login
Определения change_password.php:8
Определения error.php:15
static isModuleInstalled($moduleName)
Определения modulemanager.php:125
setOption($optionName, $optionValue)
Определения baseconfigurable.php:224
getOption($optionName, $defaultValue=null)
Определения baseconfigurable.php:237
prepareMessageBodyForSend(string $text)
Определения base.php:177
sendMessage(array $messageFields)
Определения smslineby.php:96
static resolveStatus($serviceStatus)
Определения smslineby.php:175
getMessageStatus(array $messageFields)
Определения smslineby.php:141
static getHttpClientErrorString(HttpClient $httpClient)
Определения util.php:24
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$result
Определения get_property_values.php:14
$status
Определения session.php:10
trait Error
Определения error.php:11
$message
Определения payment.php:8
if(empty($signedUserToken)) $key
Определения quickway.php:257
$text
Определения template_pdf.php:79
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']
Определения template.php:799
$method
Определения index.php:27
$url
Определения iframe.php:7
$fields
Определения yandex_run.php:501