heap.tech
лаборатория велосипедов
×

Подключение СМС оповещений на сайт

29 марта 2016
Уверен, что почти каждый администратор ресурса в какой-то момент понимал, что ему необходимо оперативное оповещение пользователей. Оповещение по емейл это круто, но когда нужна оперативность - вариант не подходит. Еще можно отправлять сообщения на вайбер, ватсап, телеграм, скайп, аську, вконтакте и еще овер 9000 мессенджеров. К тому-же кто-то пользуется вайбером, кто-то скайпом, а параноик Василий вообще сидит в ТОХ. Поэтому функционал оперативных сообщение через мессенджеры для конкретного пользователя - нереально. Самый простой и лучший вариант это СМС-оповещения. Сейчас у каждого школьника, старше первого класса, есть айфон.

Значит нужно прикручивать отправку СМС на любимый портал. Цель такого функционала может быть любой, от паролей по СМС, оповещений или поздравлений до спама грандиозных рекламных кампаний.


Прежде всего нужно выбрать компанию, у которой уже есть подписанные контракты со всеми сотовыми операторами и у которой приемные цены и вразумительный АПИ для автоматизации отправки. Лично я выбрал вебсмс. Первое - цены максимально низкие + есть возможность отправлять сообщения от цифрового имени (это еще удешевляет отправку). Второе - обширный API для отправки СМС-сообщений. Из минусов то, что он (API) архаичен как диплодок.

спойлер
Сейчас, в РФ, реальность такова, что для отправки СМС сообщений со своего сайта вы должны заключить договор со всеми операторами (чтобы отправлять СМС на все мобильные телефоны) либо заключить договор с компаний, которая занимается СМС - рассылками. И таки да, даже если вы физическое лицо - это никого не волнует, подписывайте договор. Тем боле если вы работаете как ИП, АО, ПАО, ООО ну и так далее.

Код

Перед тем, как непосредственно приступить к написанию кода – нужно зарегистрироваться на их сайте (websms.ru/r). Запомните ваш логин и пароль, они еще пригодятся. Да, после регистрации вам дадут некоторое количество бесплатных СМС, для тестирования однозначно полезно.

Всё, вот теперь точно КОД. Поехали!

Я приведу несколько примеров реализации для наиболее популярных языков.

PHP

class SendSMS { protected $rcpt; protected $message; const URL = 'http://cab.websms.ru/http_in6.asp'; const UID = 'YOUR_LOGIN'; const PWD = 'YOUR_PASSW'; public function __construct($r, $m) { $this->rcpt = $r; $this->message = urlencode($m); } public function Send() { $ch = curl_init(); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_TIMEOUT, 10); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, 'Http_username='.urlencode(self::UID).'&Http_password='.urlencode(self::PWD).'&Phone_list='.$this->rcpt.'&Message='.$this->message.'&test=0'); curl_setopt($ch, CURLOPT_URL, self::URL); //parse sended message ID preg_match("/message_id\s*=\s*([0-9]+)/i", trim(curl_exec($ch)), $mathes); curl_close($ch); return $mathes[1]; } }


SendSMS - это наш основной класс. В нем жестко прописаны константы, содержащие учетные данные для доступа к API. И тут же кроится та самая архаичность api – каждый раз при отправке СМС необходимо посылать логин и пароль. Понятия сессия, авторизация и токен не существует – вместо этого приходится гонять по сети учетные данные. И самая фишка в том, что по умолчанию, это все идет по обычному http. То есть без шифрования. Вообще! Поэтому будьте внимательны.
Но к чести разрабов - сервисы все-же поддерживают https. Поэтому можно задать константу URL вот так 'http[b]s[/b]://cab.websms.ru/http_in6.asp'. Уже не так плохо.

Вызывать так

if($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['rcpt']) && isset($_POST['body'])) { $rcpt = $_POST['rcpt']; $message = $_POST['body']; $sender = new SendSMS($rcpt, $message); $result = $sender->Send(); }


C#

В .NET крайне удобно использовать SOAP протокол. Объектная модель сервиса создается автоматически – просто вводишь ссылку на WSDL-документацию и студия сама создаст в проекте необходимые классы, объекты, методы и т.д.

По аналогии с PHP я создал класс для отправки СМСок.

public class SendSMS { const string UID = "YOUR_LOGIN"; const string PWD = "YOUR_PASSW"; string rcpt; string message; public SendSMS(string rcpt, string message) { this.rcpt = rcpt; this.message = message; } public long Send() { using (var ws = new SOAP.SOAPSoapServClient()) { var messageId = 0L; try { var result = ws.sendSMS2(SendSMS.UID, SendSMS.PWD, "", this.message, this.rcpt, 0, 0, string.Format("{0:dd.MM.yyyy}", DateTime.Now), 4, 0, 0); var match = System.Text.RegularExpressions.Regex.Match(result, "<systemId<([0-9]+)</systemId<"); messageId = match.Success && match.Groups.Count >= 2 ? Convert.ToInt64(match.Groups[1].Value) : 0; } catch {} return messageId; } } }


Вот это cоздает экземпляр клиента для SOAP-сервиса.
new SOAP.SOAPSoapServClient())
Далее нужно просто вызывать методы в уже созданном экземпляр. Вот так
ws.sendSMS2(SendSMS.UID, SendSMS.PWD, "", this.message, this.rcpt, 0, 0, string.Format("{0:dd.MM.yyyy}", DateTime.Now), 4, 0, 0);

Вызывается метод sendSMS2. В который передаются значения логин, пароль, имя отправителя (если пусто, то имя отправителя подставляется автоматически), текст сообщения, номер получателя сообщения, дата создания сообщения, GMT пояс, период ожидания доставки (по умолчанию 0). Ответом на такой запрос будет вот такой недо-xml

<results>
<record>
<userMessId>1</userMessId>
<systemId>12345678</systemId>
<state error='OK' errcode='0'>Accepted</state>
<message_parts>1</message_parts>
<message_cost>0.40</message_cost>
</record>
</results>

Распарсить его встроенным XML парсером не удастся – нет заголовка <?xml version=\"1.0\"?>.
Правда, по большому счету, парсить ответ полностью не нужно. Достаточно получить systemId, message_parts и message_cost. Ну это для порядка и, может, бухгалтерии )
Если сообщение отправлено не было – systemId будет 0. В строке “state error” будет чепуха, без возможности анализа. Поле userMessId – тоже достаточно странное, поэтому оно тоже без надобности.

Для реализации отправки СМС нужно добавить класс SendSMS в нужное место и дергать его метод Send().
Да, реализация в примерах, не подходит для создания массовых СМС-рассылок - так как необходимо создавать новый экземпляр для отправки каждого сообщения.
Плюс нужно получать статусы для всех отправленных сообщений и массовая отправка – скорее длительный процесс, поэтому стоит подумать об асинхронности.
 
1996
0

Оставлять комментарии могут только зарегистрированные пользователи

пока никто не оставлял комментариев