Страницы

Поиск по вопросам

понедельник, 24 февраля 2020 г.

Релизация смс-рассылки с помощью API smsc

#php #mysql


Необходимо реализовать смс-рассылку абонентам с помощью API smsc.

Есть у меня две таблицы. В первую заносятся данные об абоненте: логин, моб. телефон
и тип подключаемой рассылки.



Во второй к каждому типу рассылки прикрепляется характерное для него сообщение.



Общая идея есть, но очень смутная и не факт, что правильная. 

Выбираем логин абонента, проверяем каким-то условием какой тип рассылки для этого
логина включен. Если включено, допустим, оповещение о Приближении срока оплаты - высылаем
характерное для этого типа сообщение на номер абонента.

Вручную сообщение я высылал таким вот образом:




Необходимо каким-то образом подставлять номера телефонов и сообщения для них. Но
в силу своих скудных знаний - придумать как это сделать пока не могу. Очень надеюсь
на помощь.

UPD:

Так я добавляю данные в первую таблицу:

$table = $system_site_prefix . 'erps_services_sms'; 
database_insert("INSERT INTO `$table` VALUES 
  (\"$index\", \"$abon_login\", \"$telephone\", \"$pay\", \"$orders\", \"$news\",
\"$other\")");


Так во вторую:

$table = $system_site_prefix . 'erps_messages_sms'; 
database_insert("INSERT INTO `$table` VALUES (\"$index\", \"$group\", \"$title\",
\"$message\")");


UPD2:

Структура таблиц:








    


Ответы

Ответ 1



$result = file_get_contents("https://smsc.ru/sys/send.php?login=login&psw=psw&phones=".urlencode($phones)."&mes=".urlencode($message)); Для того, что бы выбрать сразу абонентов с номерами и текстами сообщений, необходимо сделать join двух таблиц по типу отправляемого сообщения. Для контроля кодов ответа сервера (200, 404, 403, etc...) лучше использовать curl в PHP -- Структура таблицы для связи сообщений и абонентов CREATE TABLE `erps_services_messages` ( `index` int(11) NOT NULL AUTO_INCREMENT, `service` int(11) NOT NULL, `message` int(11) NOT NULL, PRIMARY KEY (`index`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 -- Запрос для выборки sms SELECT sm.index AS `index`, m.message AS message, s.telephone AS telephone FROM `erps_services_messages` AS sm INNER JOIN `erps_messages_sms` AS m ON m.index = sm.message INNER JOIN `erps_services_sms` AS s ON s.index = sm.service +-------+----------------------+-------------+ | index | message | telephone | +-------+----------------------+-------------+ | 1 | Сообщение 1 | +7999999999 | | 2 | Сообщение 3 | +7999999999 | | 3 | Сообщение 1 | +7888888888 | | 4 | Сообщение 4 | +7888888888 | +-------+----------------------+-------------+ -- После успешной отправки сообещния просто выполните DELETE FROM `erps_services_messages` WHERE `index` = % -- Пример заполнения данными моих тестовых таблиц select * from erps_messages_sms; +-------+----------------------+ | index | message | +-------+----------------------+ | 1 | Сообщение 1 | | 2 | Сообщение 2 | | 3 | Сообщение 3 | | 4 | Сообщение 4 | +-------+----------------------+ select * from erps_services_sms; +-------+-------------+ | index | telephone | +-------+-------------+ | 1 | +7999999999 | | 2 | +7888888888 | +-------+-------------+ select * from erps_services_messages; +-------+---------+---------+ | index | service | message | +-------+---------+---------+ | 1 | 1 | 1 | | 2 | 1 | 3 | | 3 | 2 | 1 | | 4 | 2 | 4 | +-------+---------+---------+ Для добавления команды на отправку sms достаточно просто создать запись в таблице erps_services_messages и указать index из таблицы абонентов и index из таблицы сообщений. Скрипт отправки sms можно запускать по крону.

Ответ 2



У них есть класс на PHP для работы с их сервисом, можно его использовать. Логин и пароль добавите свой. "flash=1", "push=1", "hlr=1", "bin=1", "bin=2", "ping=1"); $m = $this->SmsSendCmd("send","cost=3&phones=".urlencode($phones)."&mes=".urlencode($message)."&translit=$translit&id=$id". ($format > 0 ? "&".$formats[$format] : ""). ($sender === false ? "" : "&sender=".urlencode($sender)). ($time ? "&time=".urlencode($time) : "").($query ? "&$query" : "")); if (self::debug) { if ($m[1] > 0) echo "Сообщение отправлено успешно. ID: $m[0], всего SMS: $m[1], стоимость: $m[2], баланс: $m[3].\n"; else echo "Ошибка №", -$m[1], $m[0] ? ", ID: ".$m[0] : "", "\n"; } return $m; } public function GetSmsCost($phones, $message, $translit = 0, $format = 0, $sender = false, $query = "") { static $formats = array(1 => "flash=1", "push=1", "hlr=1", "bin=1", "bin=2", "ping=1"); $m = $this->SmsSendCmd("send", "cost=1&phones=".urlencode($phones)."&mes=".urlencode($message). ($sender === false ? "" : "&sender=".urlencode($sender)). "&translit=$translit".($format > 0 ? "&".$formats[$format] : "").($query ? "&$query" : "")); // (cost, cnt) или (0, -error) if (self::debug) { if ($m[1] > 0) echo "Стоимость рассылки: $m[0]. Всего SMS: $m[1]\n"; else echo "Ошибка №", -$m[1], "\n"; } return $m; } private function SmsSendCmd($cmd, $arg = "") { $url = (self::https ? "https" : "http")."://smsc.ru/sys/$cmd.php?login=".urlencode(self::login)."&psw=".urlencode(self::pass)."&fmt=1&charset=".self::charset."&".$arg; $i = 0; do { if ($i) sleep(2); $ret = $this->SmsReadUrl($url); } while ($ret == "" && ++$i < 3); if ($ret == "") { if (self::debug) echo "Ошибка чтения адреса: $url\n"; $ret = ","; // фиктивный ответ } return explode(",", $ret); } private function SmsReadUrl($url) { $ret = ""; $post = self::post || strlen($url) > 2000; if (function_exists("curl_init")) { static $c = 0; if (!$c) { $c = curl_init(); curl_setopt($c, CURLOPT_RETURNTRANSFER, true); curl_setopt($c, CURLOPT_CONNECTTIMEOUT, 10); curl_setopt($c, CURLOPT_TIMEOUT, 60); curl_setopt($c, CURLOPT_SSL_VERIFYPEER, 0); } if ($post) { list($url, $post) = explode('?', $url, 2); curl_setopt($c, CURLOPT_POST, true); curl_setopt($c, CURLOPT_POSTFIELDS, $post); } curl_setopt($c, CURLOPT_URL, $url); $ret = curl_exec($c); } elseif (!self::https && function_exists("fsockopen")) { $m = parse_url($url); $fp = fsockopen($m["host"], 80, $errno, $errstr, 10); if ($fp) { fwrite($fp, ($post ? "POST $m[path]" : "GET $m[path]?$m[query]")." HTTP/1.1\r\nHost: smsc.ru\r\nUser-Agent: PHP".($post ? "\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: ".strlen($m['query']) : "")."\r\nConnection: Close\r\n\r\n".($post ? $m['query'] : "")); while (!feof($fp)) $ret .= fgets($fp, 1024); list(, $ret) = explode("\r\n\r\n", $ret, 2); fclose($fp); } } else $ret = file_get_contents($url); return $ret; } } После того как получите данные, уже в цикле можете проводить рассылку, вызывая метод SendSmsWorld $sms = new Sms(); foreach ($arrListPhone as $r) { $sms->SendSmsWorld($r['telephone'], $r['message'], 0); } Для большого количества номеров лучше использовать массовую рассылку одним запросом, не уверен точно есть у них эта возможность или нет, но вообще должна быть, где-то в документации нужно искать. Можно задать вопрос тех поддержке, они подскажут и ссылку скинут.

Комментариев нет:

Отправить комментарий