Last active
March 9, 2020 06:19
-
-
Save hackimov/c35b6dab43e69399aac17721b04d9db6 to your computer and use it in GitHub Desktop.
OperSMS sms sender class / ОперСМС класс отправки смс сообщения
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace App\Services; | |
class OperSmsSenderService | |
{ | |
/** | |
* Данный класс отвечает непосредственно за отправку и проверку доставки SMS сообщений | |
* Автор класса Хакимов Александр | |
* [email protected] | |
*/ | |
/** | |
* Функция отправки SMS сообщений | |
* @param $NUMBER mixed | |
* @param $TEXT mixed | |
* @param $LOGIN string | |
* @param $PASSWORD string | |
* @return mixed (result = array, exceptions = string) | |
*/ | |
public static function SendSms($NUMBER, $TEXT, $LOGIN, $PASSWORD) | |
{ | |
###################################################################################### | |
############################# В А Л И Д А Ц И Я ################################## | |
###################################################################################### | |
if(is_int($NUMBER)){ | |
$NUMBER = "$NUMBER"; | |
} | |
# проверяем номер телефона, чтобы он был обязательно массивом или строкой | |
if (!is_array($NUMBER) && !is_string($NUMBER) && !is_int($NUMBER)) { | |
return "Exception: First argument Number must be string or array!"; | |
} | |
# проверяем текст SMS сообщения, он тоже должен быть строкой или массивом | |
if (!is_array($TEXT) && !is_string($TEXT) && !is_int($TEXT)) { | |
return "Exception: Second argument Text must be string or array!"; | |
} | |
# проверяем строкой ли нам прислали логин | |
if (!is_string($LOGIN)) { | |
return "Exception: Third argument Login must be string!"; | |
} | |
# проверяем строкой ли нам прислали пароль | |
if (!is_string($PASSWORD)) { | |
return "Exception: Fourth argument Password must be string!"; | |
} | |
# текст sms сообщений нам прислали массивом, а номер строкой. Возвращаем ошибку | |
if (is_array($TEXT) && !is_array($NUMBER)) { | |
return "Exception: Argument Text received as array but argument Number received as string. If you send arrays then both arguments must be arrays"; | |
} | |
# номера для отправки смс отправили массивом, а текст строкой, Возвращаем ошибку | |
if (is_array($NUMBER) && !is_array($TEXT)) { | |
return "Exception: Argument Number received as array but argument Text received as string. If you send arrays then both arguments must be arrays"; | |
} | |
# колличество номеров телефонов и СМС сообщений не совпадает. Каждому сообщению должен быть свой адресат. Как и каждому адресату своё сообщение. | |
if (is_array($TEXT) && is_array($NUMBER)) { | |
if (count($NUMBER) != count($TEXT)) { | |
return "Exception: Count of array values Text and Number can not be different"; | |
} | |
} | |
# если sms нам прислали строкой то преобразовываем её в норомальный вид | |
if (is_string($NUMBER)) { | |
# делаем валидацию номера | |
$NUMBER = str_replace("+", "", $NUMBER); | |
$NUMBER = str_replace(")", "", $NUMBER); | |
$NUMBER = str_replace("(", "", $NUMBER); | |
$NUMBER = str_replace("-", "", $NUMBER); | |
$NUMBER = str_replace(" ", "", $NUMBER); | |
} | |
# если sms нам прислали массивом, тогда | |
if (is_array($NUMBER)) { | |
# создаём временный массив | |
$TempNumbArray = []; | |
# перебираем каждый из номеров | |
foreach ($NUMBER as $ValidateNumb) { | |
# проверяем на всякий случай, на то , являются ли подмассивы строками | |
if (is_string($ValidateNumb)) { | |
# преобразовываем и валидируем | |
$ValidateNumb = str_replace("+", "", $ValidateNumb); | |
$ValidateNumb = str_replace(")", "", $ValidateNumb); | |
$ValidateNumb = str_replace("(", "", $ValidateNumb); | |
$ValidateNumb = str_replace("-", "", $ValidateNumb); | |
$ValidateNumb = str_replace(" ", "", $ValidateNumb); | |
# запихиваем всё в тестовый массив | |
$TempNumbArray[] = $ValidateNumb; | |
} | |
} | |
# выдаём ошибку, нам прислали не списки а массивы с подмассивами | |
if (count($NUMBER) !== count($TempNumbArray)) { | |
return "Exception: An array of phone numbers includes subarrays. The function expects a list of phone numbers"; | |
} | |
# удаляем переменную в которой нам присылали неотвалидированные номера | |
unset($NUMBER); | |
# запихиваем в переменную номеров отвалидированные | |
$NUMBER = $TempNumbArray; | |
} | |
# создаём временный массив | |
$TempTextArray = []; | |
# проверяем действительно ли текст прислали списком без подмассивов | |
if (is_array($TEXT)) { | |
# перебираем каждый элемент | |
foreach ($TEXT as $ValidateText) { | |
# проверяем на то , является ли он строкой | |
if (is_string($ValidateText)) { | |
$TempTextArray[] = $ValidateText; | |
} | |
} | |
# считаем кол-во строк входного и выходного массива если не совпадает, выдаём обшибку | |
if (count($TEXT) !== count($TempTextArray)) { | |
return "Exception: An array of sms texts includes subarrays. The function expects a list of sms texts"; | |
} | |
} | |
# если нам телефон прислали строкой | |
if (is_string($NUMBER)) { | |
# проверяем если номер телефона прислали больше чем 12 символов, сообщаем об ошибке | |
if (strlen($NUMBER) > 12) { | |
return "Exception: Phone number must be no more than 12 characters"; | |
} | |
# проверяем если номер телефона прислали меньше чем 12 символов, сообщаем об ошибке | |
if (strlen($NUMBER) < 12) { | |
return "Exception: Phone number must be at least 12 characters"; | |
} | |
} | |
# если нам прислали телефон как массив то проверяем каждый элемент | |
if (is_array($NUMBER)) { | |
foreach ($NUMBER as $NumbExcept) { | |
# если один из номеров прислали больше 12 символов говорим об этом | |
if (strlen($NumbExcept) > 12) { | |
return "Exception: One of phone numbers is more than 12 characters"; | |
} | |
# если один из номеров прислали меньше 12 символов говорим об этом | |
if (strlen($NumbExcept) < 12) { | |
return "Exception: One of the phone numbers is less than 12 characters"; | |
} | |
} | |
} | |
# проверяем строка ли номер | |
if (is_string($NUMBER)) { | |
# применяем регулярное выражение которое проверит состоит ли у нас строка из символов и действительно ли их 12 | |
preg_match("/[0-9]{12}/", $NUMBER, $matches); | |
# если результат у регулярного выражения отсутствует, выводим ошибку | |
if (empty($matches[0])) { | |
return "Exception: Phone number does not consist of numbers or its length is not equal to 12 characters"; | |
} | |
} | |
# проверяем массив ли номер | |
if (is_array($NUMBER)) { | |
foreach ($NUMBER as $NumbExceptReg) { | |
# применяем регулярное выражение которое проверит каждый из элементов состоят ли они из символов и действительно ли их 12 | |
preg_match("/[0-9]{12}/", $NumbExceptReg, $matches); | |
# если в процессе проверки появится хотя бы один номер который не сответсвует длине или кол-ву символов, выводим ошибку | |
if (empty($matches[0])) { | |
return "Exception: One of the phone numbers does not consist of numbers or its length is not equal to 12 characters"; | |
} | |
} | |
} | |
###################################################################################### | |
###################################################################################### | |
###################################################################################### | |
###################################################################################### | |
########## Ф О Р М И Р О В А Н И Е Д А Н Н Ы Х Д Л Я О Т П Р А В К И ########### | |
###################################################################################### | |
# объявляем переменную которая будет содержать данные массивом | |
$SendData = []; | |
# если номер и текст пришли к нам как строки заполняем массив следующим образом | |
if (is_string($NUMBER) && is_string($TEXT)) { | |
$SendData[] = | |
[ | |
'phone' => "$NUMBER", | |
'text' => $TEXT, | |
]; | |
} | |
# проверяем является номера и тексты смсок массивами | |
if (is_array($NUMBER) && is_array($TEXT)) { | |
# создаём счетчик итерации | |
$IterationCount = 0; | |
# первым аргументом передаём склеенный массив где ключи это номера а тексты сообщений значения и делаем итерации | |
foreach (array_combine($NUMBER, $TEXT) as $DataPutNumb => $DataPutText) { | |
# заполняем данными массив где первым ключем массива является счетчик итерации, вторым номер телефона | |
$SendData[$IterationCount]["phone"] = "$DataPutNumb"; | |
# заполняем данными массив где первым ключем массива является счетчик итерации, вторым текст сообщения | |
$SendData[$IterationCount]["text"] = $DataPutText; | |
# увеличиваем счетчик на единицу после каждой итерации | |
$IterationCount++; | |
} | |
# после окончания итерации удаляем переменную со счетчиком | |
unset($IterationCount); | |
} | |
/** | |
* В виду ограничений на максимальное количество получателей в одном пакете, | |
* делим массив данных на небольшие пакеты по 50 элементов и формируем POST | |
* HTTP запрос с помощью модуля cURL: | |
*/ | |
$SendArray = array_chunk($SendData, 50, true); | |
###################################################################################### | |
###################################################################################### | |
###################################################################################### | |
###################################################################################### | |
################################## О Т П Р А В К А ################################## | |
###################################################################################### | |
# объявим переменную куда будут записываться результирующие данные | |
$ResultArray = []; | |
# вызываем цикл куда заталкиваются пачки sms | |
foreach ($SendArray as $Part) { | |
# инициализация соединения с сервером OperSMS | |
$Ch = curl_init("http://83.69.139.182:8080/"); | |
# включаем опцию возврата ответа: | |
curl_setopt($Ch, CURLOPT_RETURNTRANSFER, 1); | |
# устанавливаем ограничение на выполнение запроса 30 секунд: | |
curl_setopt($Ch, CURLOPT_TIMEOUT, 30); | |
# получаем данные: | |
curl_setopt($Ch, CURLOPT_POSTFIELDS, "login=$LOGIN&password=$PASSWORD&data=" . json_encode($Part)); | |
# Записываем результат выполнения запроса в переменную: | |
$Result = curl_exec($Ch); | |
# Закрываем соединение с сервером OperSMS: | |
curl_close($Ch); | |
/** | |
* Далее приведен пример получения статуса отправленного сообщения. | |
* Возвращается строка в формате JSON, которая записывается в переменную | |
* для дальнейшей обработки программным обеспечением клиента: | |
*/ | |
# Преобразуем предыдущий ответ сервера из формата JSON в обычный массив: | |
$ResultArray[] = json_decode($Result, true); | |
} | |
# возвращаем результат выполнения функции ^_^ | |
return $ResultArray; | |
###################################################################################### | |
###################################################################################### | |
###################################################################################### | |
} | |
/** | |
* Функция проверки статуса СМС сообщения | |
* @param $SMSID mixed | |
* @param $LOGIN string | |
* @param $PASSWORD string | |
* @return mixed (result = array, exceptions = string) | |
*/ | |
public static function CheckStatus($SMSID, $LOGIN, $PASSWORD) | |
{ | |
###################################################################################### | |
############################# В А Л И Д А Ц И Я ################################## | |
###################################################################################### | |
# проверяем id sms сообщения, является ли он массивом или строкой, если нет то ошибка | |
if (!is_string($SMSID) || !is_array($SMSID)) { | |
return "Exception: First argument SmsID must be integer, string or array!"; | |
} | |
# проверяем строкой ли нам прислали логин | |
if (!is_string($LOGIN)) { | |
return "Exception: Second argument Login must be string!"; | |
} | |
# проверяем строкой ли нам прислали пароль | |
if (!is_string($PASSWORD)) { | |
return "Exception: Third argument Password must be string!"; | |
} | |
# проверяем действительно ли текст прислали списком без подмассивов | |
if (is_array($SMSID)) { | |
# объявляем временную переменную | |
$TempSmsIdArray = []; | |
# перебираем каждый элемент | |
foreach ($SMSID as $ValidateSmsId) { | |
# проверяем на то , является ли он строкой | |
if (is_string($ValidateSmsId)) { | |
$TempSmsIdArray[] = $ValidateSmsId; | |
} | |
} | |
# считаем кол-во строк входного и выходного массива если не совпадает, выдаём обшибку | |
if (count($SMSID) !== count($TempSmsIdArray)) { | |
return "Exception: An array of sms ids includes subarrays. The function expects a list of sms ids"; | |
} | |
} | |
###################################################################################### | |
###################################################################################### | |
###################################################################################### | |
###################################################################################### | |
################################## О Т П Р А В К А ################################## | |
###################################################################################### | |
# проверяем строка ли sms id если да то запускаем отправку | |
if (is_string($SMSID)) { | |
# инициализация соединения с сервером OperSMS: | |
$Ch = curl_init("http://83.69.139.182:8081/status"); | |
# включаем опцию возврата ответа: | |
curl_setopt($Ch, CURLOPT_RETURNTRANSFER, 1); | |
# устанавливаем ограничение на выполнение запроса 30 секунд: | |
curl_setopt($Ch, CURLOPT_TIMEOUT, 30); | |
# получаем данные: | |
curl_setopt($Ch, CURLOPT_POSTFIELDS, "login=$LOGIN&password=$PASSWORD&data=[{\"request_id\":\"" . $SMSID . "\"}]"); | |
# Записываем результат выполнения запроса в переменную: | |
$ResultStatus[] = curl_exec($Ch); | |
# Закрываем соединение с сервером OperSMS: | |
curl_close($Ch); | |
return $ResultStatus; | |
} | |
# проверяем , является ли sms id массивом | |
if (is_array($SMSID)) { | |
# обявляем переменную, куда будем запихивать результат | |
$ResultArrayStatus = []; | |
# запускаем перебор всех sms id в цикле если да то запускаем отправку в цикле | |
foreach ($SMSID as $SendedSms) { | |
# инициализация соединения с сервером OperSMS: | |
$Ch = curl_init("http://83.69.139.182:8081/status"); | |
# включаем опцию возврата ответа: | |
curl_setopt($Ch, CURLOPT_RETURNTRANSFER, 1); | |
# устанавливаем ограничение на выполнение запроса 30 секунд: | |
curl_setopt($Ch, CURLOPT_TIMEOUT, 30); | |
# получаем данные: | |
curl_setopt($Ch, CURLOPT_POSTFIELDS, "login=$LOGIN&password=$PASSWORD&data=[{\"request_id\":\"" . $SendedSms . "\"}]"); | |
# Записываем результат выполнения запроса в переменную: | |
$ResultArrayStatus[] = curl_exec($Ch); | |
# Закрываем соединение с сервером OperSMS: | |
curl_close($Ch); | |
} | |
# возвращаем результат выполнения функции ^_^ | |
return $ResultArrayStatus; | |
} | |
###################################################################################### | |
###################################################################################### | |
###################################################################################### | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment