1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
smsassistentby.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\Web\HttpClient;
8use Bitrix\Main\Web\Json;
9
10use Bitrix\MessageService\Sender;
11use Bitrix\MessageService\Sender\Result\MessageStatus;
12use Bitrix\MessageService\Sender\Result\SendMessage;
13
14use Bitrix\MessageService;
15
16Loc::loadMessages(__FILE__);
17
19{
20 use Sender\Traits\RussianProvider;
21
22 public const ID = 'smsastby';
23
24 const JSON_API_URL = 'https://userarea.sms-assistent.by/api/v1/json';
25 const PLAIN_API_URL = 'https://userarea.sms-assistent.by/api/v1/%s/plain';
26
27 public function getId()
28 {
29 return static::ID;
30 }
31
32 public function getName()
33 {
34 return Loc::getMessage('MESSAGESERVICE_SENDER_SMS_SMSASTBY_NAME');
35 }
36
37 public function getShortName()
38 {
39 return 'sms-assistent.by';
40 }
41
42 public function getFromList()
43 {
44 $from = $this->getOption('from_list');
45 return is_array($from) ? $from : [];
46 }
47
48 public function isRegistered()
49 {
50 return (
51 $this->getOption('user') !== null
52 &&
53 $this->getOption('password') !== null
54 );
55 }
56
57 public function register(array $fields)
58 {
59 $params = array(
60 'user' => $fields['account_user'],
61 'password' => $fields['account_password'],
62 );
63
64 $result = $this->callPlainApi('credits', $params);
65 if ($result->isSuccess())
66 {
67 $this->disableDemo();
68 $this->setOption('user', $params['user']);
69 $this->setOption('password', $params['password']);
70 }
71
72 return $result;
73 }
74
75 public function registerDemo(array $fields)
76 {
77 $params = [
78 'info' => [
79 'simple' => true,
80 'user_uuid' => 'wsTKC5KdazmEjBNU8i5fqacddtOeqQBtRc45lcvO6WA=',
81 "diler_uuid" => 'obUrbkWuyW0nYL9D2rR6s3EPMm1QHg9h/KWtO8jFIug=',
82 'email' => $fields['email'],
83 'tel' => '+'.\NormalizePhone($fields['tel']),
84 'unp' => $fields['unp']
85 ]
86 ];
87
88 $result = $this->callJsonApi('demo', $params);
89
90 if ($result->isSuccess())
91 {
92 $this->enableDemo();
93 $this->setOption('demo_email', $fields['email']);
94 $this->setOption('demo_tel', '+'.\NormalizePhone($fields['tel']));
95 $this->setOption('demo_unp', $fields['unp']);
96 }
97
98 return $result;
99 }
100
106 public function getOwnerInfo()
107 {
108 return array(
109 'user' => $this->getOption('user'),
110 );
111 }
112
116 public function getDemoInfo()
117 {
118 return array(
119 'email' => $this->getOption('demo_email'),
120 'tel' => $this->getOption('demo_tel'),
121 'unp' => $this->getOption('demo_unp'),
122 );
123 }
124
125 public function getExternalManageUrl()
126 {
127 return 'https://userarea.sms-assistent.by/';
128 }
129
131 {
132 if (!$this->canUse())
133 {
134 $result = new SendMessage();
135 $result->addError(new Error(Loc::getMessage('MESSAGESERVICE_SENDER_SMS_SMSASTBY_CAN_USE_ERROR')));
136 return $result;
137 }
138
139 $message = [
140 'recipient' => $messageFields['MESSAGE_TO'],
141 'message' => $this->prepareMessageBodyForSend($messageFields['MESSAGE_BODY']),
142 'validity_period' => 24,
143 'webhook_url' => $this->getCallbackUrl()
144 ];
145
146 if (ModuleManager::isModuleInstalled('bitrix24'))
147 {
148 $message['Vendor'] = 'Bitrix24';
149 }
150
151 if ($messageFields['MESSAGE_FROM'])
152 {
153 $message['sender'] = $messageFields['MESSAGE_FROM'];
154 }
155
156 $result = new SendMessage();
157 $apiResult = $this->callPlainApi('send_sms', $message);
158 $result->setServiceRequest($apiResult->getHttpRequest());
159 $result->setServiceResponse($apiResult->getHttpResponse());
160 $resultData = $apiResult->getData();
161
162 if (!$apiResult->isSuccess())
163 {
164 $result->addErrors($apiResult->getErrors());
165 }
166 else
167 {
168 $smsId = $resultData['response'];
169
170 if ($smsId <= 0)
171 {
172 $result->addError(new Error($this->getErrorMessage(-1000)));
173 }
174 else
175 {
176 $result->setExternalId($smsId);
177 $result->setAccepted();
178 }
179 }
180
181 return $result;
182 }
183
184 /* reserved method */
185 private function sendMessageBulk(array $messageFields)
186 {
187 if (!$this->canUse())
188 {
189 $result = new SendMessage();
190 $result->addError(new Error(Loc::getMessage('MESSAGESERVICE_SENDER_SMS_SMSASTBY_CAN_USE_ERROR')));
191 return $result;
192 }
193
194 $message = [
195 'recepient' => $messageFields['MESSAGE_TO'],
196 'sms_text' => $this->prepareMessageBodyForSend($messageFields['MESSAGE_BODY']),
197 ];
198
199 if ($messageFields['MESSAGE_FROM'])
200 {
201 $message['sender'] = $messageFields['MESSAGE_FROM'];
202 }
203
204 $result = new SendMessage();
205 $apiResult = $this->callJsonApi('sms_send', [
206 'message' => [
207 'default' => [
208 'validity_period' => 24
209 ],
210 'msg' => [
212 ]
213 ]
214 ]);
215 $resultData = $apiResult->getData();
216
217 if (!$apiResult->isSuccess())
218 {
219 $result->addErrors($apiResult->getErrors());
220 }
221 else
222 {
223 $smsData = current($resultData['message']['msg']);
224
225 if (!$smsData)
226 {
227 $result->addError(new Error($this->getErrorMessage(-1000)));
228 }
229 else
230 {
231 if (isset($smsData['sms_id']))
232 {
233 $result->setExternalId($smsData['sms_id']);
234 }
235
236 if ($smsData['error_code'] > 0)
237 {
238 $result->addError(new Error($this->getErrorMessage($smsData['error_code'])));
239 }
240 else
241 {
242 $result->setAccepted();
243 }
244 }
245 }
246
247 return $result;
248 }
249
251 {
252 $result = new MessageStatus();
253 $result->setId($messageFields['ID']);
254 $result->setExternalId($messageFields['EXTERNAL_ID']);
255
256 if (!$this->canUse())
257 {
258 $result->addError(new Error(Loc::getMessage('MESSAGESERVICE_SENDER_SMS_SMSASTBY_CAN_USE_ERROR')));
259 return $result;
260 }
261
262 $params = array(
263 'status' => [
264 'msg' => [
265 [
266 'sms_id' => $result->getExternalId()
267 ]
268 ]
269 ]
270 );
271
272 $apiResult = $this->callJsonApi('statuses', $params);
273 if (!$apiResult->isSuccess())
274 {
275 $result->addErrors($apiResult->getErrors());
276 }
277 else
278 {
279 $resultData = $apiResult->getData();
280 $smsData = current($resultData['status']['msg']);
281
282 if (!$smsData)
283 {
284 $result->addError(new Error($this->getErrorMessage(-1000)));
285 }
286
287 $result->setStatusText($smsData['sms_status']);
288 $result->setStatusCode(self::resolveStatus($smsData['sms_status']));
289 }
290
291 return $result;
292 }
293
294 public static function resolveStatus($serviceStatus)
295 {
296 $status = parent::resolveStatus($serviceStatus);
297
298 switch ($serviceStatus)
299 {
300 case 'Queued':
302 break;
303 case 'Sent':
305 break;
306 case 'Delivered':
308 break;
309 case 'Expired':
310 case 'Rejected':
311 case 'Unknown':
312 case 'Failed':
314 break;
315 }
316
317 return $status;
318 }
319
320 public function sync()
321 {
322 if ($this->isRegistered())
323 {
324 $this->loadFromList();
325 }
326 return $this;
327 }
328
329 private function callPlainApi($command, array $params = []): Sender\Result\HttpRequestResult
330 {
331 $url = sprintf(self::PLAIN_API_URL, $command);
332
333 $httpClient = new HttpClient(array(
334 "socketTimeout" => $this->socketTimeout,
335 "streamTimeout" => $this->streamTimeout,
336 "waitResponse" => true,
337 ));
338 $httpClient->setHeader('User-Agent', 'Bitrix24');
339 $httpClient->setCharset('UTF-8');
340
341 if (!isset($params['user']))
342 {
343 $params['user'] = $this->getOption('user');
344 }
345
346 if (!isset($params['password']))
347 {
348 $params['password'] = $this->getOption('password');
349 }
350
352 $result->setHttpRequest(new MessageService\DTO\Request([
353 'method' => HttpClient::HTTP_POST,
354 'uri' => $url,
355 'headers' => method_exists($httpClient, 'getRequestHeaders') ? $httpClient->getRequestHeaders()->toArray() : [],
356 'body' => $params,
357 ]));
358 $answer = 0;
359
360 if ($httpClient->query(HttpClient::HTTP_POST, $url, $params) && $httpClient->getStatus() == '200')
361 {
362 $answer = $httpClient->getResult();
363 }
364
365 if (is_numeric($answer) && $answer < 0)
366 {
367 $result->addError(new Error($this->getErrorMessage($answer)));
368 }
369 $result->setHttpResponse(new MessageService\DTO\Response([
370 'statusCode' => $httpClient->getStatus(),
371 'headers' => $httpClient->getHeaders()->toArray(),
372 'body' => $httpClient->getResult(),
373 'error' => Sender\Util::getHttpClientErrorString($httpClient)
374 ]));
375
376 $result->setData(['response' => $answer]);
377
378 return $result;
379 }
380
381 private function callJsonApi($command, array $params = []): Sender\Result\HttpRequestResult
382 {
383 $httpClient = new HttpClient(array(
384 "socketTimeout" => $this->socketTimeout,
385 "streamTimeout" => $this->streamTimeout,
386 "waitResponse" => true,
387 ));
388 $httpClient->setHeader('User-Agent', 'Bitrix24');
389 $httpClient->setCharset('UTF-8');
390 $httpClient->setHeader('Content-Type', 'application/json');
391
392 if (!isset($params['login']) && $this->isRegistered())
393 {
394 $params['login'] = $this->getOption('user');
395 }
396
397 if (!isset($params['password']) && $this->isRegistered())
398 {
399 $params['password'] = $this->getOption('password');
400 }
401
402 $params['command'] = $command;
403
404 $params = Json::encode($params);
405
406 $result = new Sender\Result\HttpRequestResult();
407 $result->setHttpRequest(new MessageService\DTO\Request([
408 'method' => HttpClient::HTTP_POST,
409 'uri' => self::JSON_API_URL,
410 'headers' => method_exists($httpClient, 'getRequestHeaders') ? $httpClient->getRequestHeaders()->toArray() : [],
411 'body' => $params,
412 ]));
413 $answer = [];
414
415 if ($httpClient->query(HttpClient::HTTP_POST, self::JSON_API_URL, $params) && $httpClient->getStatus() == '200')
416 {
417 try
418 {
419 $answer = Json::decode($httpClient->getResult());
420 }
421 catch (\Bitrix\Main\ArgumentException $e)
422 {
423 $answer = ['error' => -1000];
424 }
425 }
426
427 if (isset($answer['error']))
428 {
429 $result->addError(new Error($this->getErrorMessage($answer['error'], $answer)));
430 }
431
432 if (isset($answer['status']) && $answer['status'] === -1)
433 {
434 $msg = !empty($answer['message']) ? $answer['message'] : $this->getErrorMessage($answer['error'], 1000);
435 $result->addError(new Error($msg));
436 }
437
438 $result->setHttpResponse(new MessageService\DTO\Response([
439 'statusCode' => $httpClient->getStatus(),
440 'headers' => $httpClient->getHeaders()->toArray(),
441 'body' => $httpClient->getResult(),
442 'error' => Sender\Util::getHttpClientErrorString($httpClient)
443 ]));
444 $result->setData($answer);
445
446 return $result;
447 }
448
449 private function getErrorMessage($errorCode)
450 {
451 $errorCode = abs($errorCode);
452 $message = Loc::getMessage('MESSAGESERVICE_SENDER_SMS_SMSASTBY_ERROR_'.$errorCode);
453 return $message ?: Loc::getMessage('MESSAGESERVICE_SENDER_SMS_SMSASTBY_ERROR_OTHER');
454 }
455
456 private function loadFromList()
457 {
458 $result = $this->callJsonApi('get_senders');
459
460 if ($result->isSuccess())
461 {
462 $from = array();
463 $resultData = $result->getData();
464 foreach ($resultData['senders'] as $sender)
465 {
466 if (!empty($sender))
467 {
468 $from[] = array(
469 'id' => $sender,
470 'name' => $sender
471 );
472 }
473 }
474
475 $this->setOption('from_list', $from);
476 }
477 }
478}
$messageFields
Определения callback_ednaru.php:22
Определения error.php:15
static isModuleInstalled($moduleName)
Определения modulemanager.php:125
Определения request.php:10
setOption($optionName, $optionValue)
Определения baseconfigurable.php:224
getOption($optionName, $defaultValue=null)
Определения baseconfigurable.php:237
prepareMessageBodyForSend(string $text)
Определения base.php:177
Providers Sender $sender
Определения base.php:14
sendMessage(array $messageFields)
Определения smsassistentby.php:130
static resolveStatus($serviceStatus)
Определения smsassistentby.php:294
getMessageStatus(array $messageFields)
Определения smsassistentby.php:250
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
NormalizePhone($number, $minLength=10)
Определения tools.php:4959
trait Error
Определения error.php:11
$message
Определения payment.php:8
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']
Определения template.php:799
$url
Определения iframe.php:7
$fields
Определения yandex_run.php:501