Skip to content

Instantly share code, notes, and snippets.

@hackimov
Last active March 9, 2020 06:19
Show Gist options
  • Save hackimov/c35b6dab43e69399aac17721b04d9db6 to your computer and use it in GitHub Desktop.
Save hackimov/c35b6dab43e69399aac17721b04d9db6 to your computer and use it in GitHub Desktop.
OperSMS sms sender class / ОперСМС класс отправки смс сообщения
<?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