Sms server GoIP

от автора

Как устанавливать смс сервер от GoIP не буду расписывать. Вот пример установки и настройки смс сервера voxlink.ru/kb/voip-devices-configuration/986.

Здесь будет краткое руководство как пользоваться их API. В свое время нужно было привязать отправку и получение смс к своему программному обеспечению. Каждый раз лазить в вебморду смс сервера от GoIP и проверять вх./исх. сообщения было неудобно.

API сервера

Для отправки смс используется API

http://192.168.1.35/goip/en/dosend.php?USERNAME=root&PASSWORD=root&smsprovider=1&smsnum=13800138000&method=2&Memo=hello


Бывает, что сообщение не уходит, тогда нужно его отправить повторно

http://192.168.1.35/goip/en/resend.php?messageid=уникальный_номер_смс_сообщения_в_бд&USERNAME=root&PASSWORD=root'

Вот пример методов класса для отправки смс сообщения

public function send() { 	// Номер телефона на который нужно отправить сообщение. 	// Формат номера 10 значный номер (XXX-XXX-XX-XX) без 8, +7 	// $smsnum = '9658795588'; 	// Получаем номер телефона с клиента 	$smsnum = substr($_POST['phone'],2,10);  	// Код сотового оператора 	$code = substr($smsnum,0,3);  	$regexp = '/9[0,1,2,3,5,6,7,9][0,1,2,3,4,5,6,7,8,9]/';  	// Проверяем Коды сотовых операторов 	if( !preg_match($regexp, $code)) { 		return 'Ошибка. Номер телефона неверный.'; 	}  	// Само сообщение 	// $msg = 'тест'; 	// $msg = mb_substr(trim($_POST['smsText']),0,335,'UTF-8'); 	$msg = trim($_POST['smsText']);  	// Массив или объект содержащий свойства 	$arr = array('Memo' => $msg);  	// Генерирует URL-кодированную строку запроса 	$msg = http_build_query($arr);  	// MTC 910, 915, 916, 917, 919, 985, 986 	$regexp = '/910|915|916|917|919|985|986|/';  	// Сообщения на номера МТС отправляем со второй группы линии,  	// остальные с первой группы 	if(preg_match($regexp, $code)) { 		$smsprovider = 2; 	} else { 		$smsprovider = 1; 	}  	// С помощью такого Url мы отправляем сообщение на смс сервер GoIp 	$url = 'http://192.168.1.35/goip/en/' 	.'dosend.php?USERNAME=root&PASSWORD=root&smsprovider='.$smsprovider 	.'&smsnum='.$smsnum.'&method=2&'.$msg;  	// Читает содержимое файла в строку, в нашем случае мы должны получить messageid 	$get = file_get_contents($url); 	//echo htmlspecialchars($get);  	// Убираем пробелы, иначе функция preg_match не может найти подстроку 	$str = str_replace(" ","",$get);  	// Шаблон для поиска  	$reg = '/resend.php\?messageid=(.*?).*USERNAME=root.*PASSWORD=root/';  	// Результат пишет в массив 	preg_match($reg, $str, $matches);  	$url = 'http://192.168.1.35/goip/en/'.$matches[0];  	//Делаем Get запрос чтобы смс сообщение было отправлено 	file($url);  	return $res = 1; }  public function resend() { 	// Номер сообщения которое нужно переотправить 	$msgid = (int) $_POST['msgid'];  	$url = 'http://192.168.1.35/goip/en/resend.php?messageid='.$msgid 		.'&USERNAME=root&PASSWORD=root';  	// Делаем Get запрос чтобы смс сообщение было отправлено 	file($url);  	return $res = 1; } 

Данные по исх./вх. сообщениям хранятся в таблицах receive и sends

// Запрос на получение всей истории переписки по заданному номеру $query = "(SELECT 'in' AS route,time,goipname,msg,0 AS msgid," 	."CHAR_LENGTH(msg) AS msg_length,'0' AS over" ." FROM `receive` WHERE `srcnum`='".$srcnum."')" ." UNION " ."(SELECT 'out' AS route,T2.time,T3.name AS goipname,T2.msg,"; 	."T1.messageid AS msgid," 	."CHAR_LENGTH(T2.msg) AS msg_length,T1.over" ." FROM `sends` AS T1" 	." INNER JOIN message AS T2 ON T1.messageid=T2.id" 	." INNER JOIN goip AS T3 ON (T2.goipid=T3.id OR T1.goipid=T3.id)" 		." WHERE telnum='".$srcnum."')" ." ORDER BY time"; 

Готовых примеров применения вышеописанных кодов уже не осталось. Года 2 тому назад был изучен обмен данными между родным смс сервером и самим шлюзом GoIP. На основании полученных данных написал собственный смс-сервер. Плюсом стало, что можно отслеживать статус доставки смс сообщения. Но там есть нюанс, что статус доставки смс сообщения отразится, если телефон включен в момент отправки. Если номер включат позже на несколько часов или дней, то статус доставки не увидим, хотя само сообщение будет доставлено. А в остальном только плюсы.

Если есть опыт работы с wireshark, то можно проследить следующий алгоритм общения между GoIP и родным смс сервером. Далее несложно написать свой собственный смс сервер.

 1.BulkSMSRequest 2.BulkSMSConfirm/BulkSMSReject 3.AuthenticationRequest 5.SubmitNumberRequest 1 4.AuthenticationConfirm 6.SubmitNumberStatus 1 7.SubmitNumberRequest 2 8.SubmitNumberStatus 2 … 9.EndRequest 10.EndConfirm 

Сам код проекта с примерами выложить в краткой форме не получится. Слишком много данных, и все это привязано к другому проекту. В ближайшее время планирую запустить тестовую версию смс сервера на PHP, скоро выложу ссылку на проект.

ссылка на оригинал статьи https://habr.com/ru/post/507460/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *