25 public const ID =
'twilio';
37 return Loc::getMessage(
'MESSAGESERVICE_SENDER_SMS_TWILIO_NAME');
47 return ($this->
getOption(
'account_sid') !==
null);
63 return is_array($from) ? $from :
array();
68 $sid = (string)
$fields[
'account_sid'];
69 $token = (string)
$fields[
'account_token'];
71 $result = $this->callExternalMethod(
73 'Accounts/'.$sid,
array(), $sid, $token
79 if (
$data[
'status'] !==
'active')
81 $result->addError(
new Error(Loc::getMessage(
'MESSAGESERVICE_SENDER_SMS_TWILIO_ERROR_ACCOUNT_INACTIVE')));
86 $this->
setOption(
'account_token', $token);
98 'friendly_name' => $this->
getOption(
'account_friendly_name')
104 return 'https://www.twilio.com/console';
114 $result->addError(
new Error(Loc::getMessage(
'MESSAGESERVICE_SENDER_SMS_TWILIO_CAN_USE_ERROR')));
119 foreach ($eventResults as $eventResult)
121 $eventParams = $eventResult->getParameters();
123 if ($eventResult->getType() === \
Bitrix\
Main\EventResult::ERROR)
126 if ($eventParams && is_string($eventParams))
132 $result->addError(
new Error(Loc::getMessage(
"MESSAGESERVICE_SENDER_SMS_TWILIO_MESSAGE_HAS_NOT_BEEN_SENT")));
137 if (is_array($eventParams))
145 $apiResult = $this->sendMessageByAlphanumericNumber($sid,
$messageFields);
147 !$apiResult->isSuccess()
148 && $this->checkSupportErrorAlphanumericNumber($apiResult->getErrorCollection())
160 $result->setServiceRequest($apiResult->getHttpRequest());
161 $result->setServiceResponse($apiResult->getHttpResponse());
163 if (!$apiResult->isSuccess())
165 $result->addErrors($apiResult->getErrors());
169 $resultData = $apiResult->getData();
170 if (isset($resultData[
'sid']))
172 $result->setExternalId($resultData[
'sid']);
189 $result->addError(
new Error(Loc::getMessage(
'MESSAGESERVICE_SENDER_SMS_TWILIO_CAN_USE_ERROR')));
193 $apiResult = $this->callExternalMethod(
194 HttpClient::HTTP_GET,
195 'Accounts/'.$sid.
'/Messages/'.
$result->getExternalId()
197 if (!$apiResult->isSuccess())
199 $result->addErrors($apiResult->getErrors());
203 $resultData = $apiResult->getData();
204 $result->setStatusCode($resultData[
'status']);
205 $result->setStatusText($resultData[
'status']);
206 if (in_array($resultData[
'status'],
207 array(
'accepted',
'queued',
'sending',
'sent',
'delivered',
'undelivered',
'failed')))
210 Loc::getMessage(
'MESSAGESERVICE_SENDER_SMS_TWILIO_MESSAGE_STATUS_'.mb_strtoupper($resultData[
'status']))
220 $status = parent::resolveStatus($serviceStatus);
222 switch ((
string)$serviceStatus)
254 $this->loadFromList();
261 $url = $this->getRequestUrl($apiMethod);
264 "socketTimeout" => $this->socketTimeout,
265 "streamTimeout" => $this->streamTimeout,
266 "waitResponse" =>
true,
268 $httpClient->setHeader(
'User-Agent',
'Bitrix24');
269 $httpClient->setCharset(
'UTF-8');
271 if (!$sid || !$token)
273 $sid = $this->getOption(
'account_sid');
274 $token = $this->getOption(
'account_token');
277 $httpClient->setAuthorization($sid, $token);
283 'method' => HttpClient::HTTP_POST,
285 'headers' => method_exists($httpClient,
'getRequestHeaders') ? $httpClient->getRequestHeaders()->toArray() : [],
288 if ($httpClient->query($httpMethod,
$url,
$params))
292 $answer = Json::decode($httpClient->getResult());
299 $httpStatus = $httpClient->getStatus();
300 if ($httpStatus >= 400)
302 $errorInformant =
new ErrorInformant($answer[
'message'], $answer[
'code'], $answer[
'more_info'], $httpStatus);
303 $result->addError($errorInformant->getError());
314 $result->setHttpResponse(
new MessageService\DTO\Response([
315 'statusCode' => $httpClient->getStatus(),
316 'headers' => $httpClient->getHeaders()->toArray(),
317 'body' => $httpClient->getResult(),
318 'error' => Sender\Util::getHttpClientErrorString($httpClient)
329 private function loadFromList()
332 $result = $this->callExternalMethod(
333 HttpClient::HTTP_GET,
334 'Accounts/'.$sid.
'/IncomingPhoneNumbers'
340 $resultData =
$result->getData();
341 if (isset($resultData[
'incoming_phone_numbers']) && is_array($resultData[
'incoming_phone_numbers']))
343 foreach ($resultData[
'incoming_phone_numbers'] as $phoneNumber)
345 if ($phoneNumber[
'capabilities'][
'sms'] ===
true)
348 'id' => $phoneNumber[
'phone_number'],
349 'name' => $phoneNumber[
'friendly_name']
359 private function checkSupportErrorAlphanumericNumber(ErrorCollection $collection): bool
361 if ($collection->getErrorByCode(self::NOT_SUPPORT_ALPHANUMERIC_NUMBER_STATUS_CODE))
374 private function sendMessageByAlphanumericNumber(
string $sid,
array $messageFields): Sender\Result\HttpRequestResult
383 return $this->callExternalMethod(
384 HttpClient::HTTP_POST,
385 'Accounts/'.$sid.
'/Messages/',
395 private function sendMessageByNumber(
string $sid,
array $messageFields): Sender\Result\HttpRequestResult
408 if (is_string(
$params[
'From']) && mb_strlen(
$params[
'From']) === 34)
414 return $this->callExternalMethod(
415 HttpClient::HTTP_POST,
416 'Accounts/'.$sid.
'/Messages/',
430 return $event->getResults();
433 private function getRequestUrl(
string $apiMethod): string
437 'twilio_api_uri_tpl',
438 'https://api.twilio.com/2010-04-01/%apiMethod%.json'
441 return str_replace(
'%apiMethod%', $apiMethod,
$url);