meraproject/module/integration/smsc/model.php
keboss-m 5c21d25d45 Initial commit: Merakomis portal, Docker stack and user-reader API.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-24 11:04:05 +03:00

244 lines
11 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?
namespace integration;
class SMSC {
var $LOGIN = ""; // логин клиента
var $PASSWORD = ""; // пароль или MD5-хеш пароля в нижнем регистре
var $POST = 0; // использовать метод POST
var $HTTPS = 0; // использовать HTTPS протокол
var $CHARSET = "utf-8"; // кодировка сообщения: utf-8, koi8-r или windows-1251 (по умолчанию)
var $DEBUG = 0; // флаг отладки
var $FROM = "api@smsc.ru"; // e-mail адрес отправителя
public function __construct($login,$password) {
$this->LOGIN = $login;
$this->PASSWORD = $password;
}
// Функция отправки SMS
//
// обязательные параметры:
//
// $phones - список телефонов через запятую или точку с запятой
// $message - отправляемое сообщение
//
// необязательные параметры:
//
// $translit - переводить или нет в транслит (1,2 или 0)
// $time - необходимое время доставки в виде строки (DDMMYYhhmm, h1-h2, 0ts, +m)
// $id - идентификатор сообщения. Представляет собой 32-битное число в диапазоне от 1 до 2147483647.
// $format - формат сообщения (0 - обычное sms, 1 - flash-sms, 2 - wap-push, 3 - hlr, 4 - bin, 5 - bin-hex, 6 - ping-sms)
// $sender - имя отправителя (Sender ID). Для отключения Sender ID по умолчанию необходимо в качестве имени
// передать пустую строку или точку.
// $query - строка дополнительных параметров, добавляемая в URL-запрос ("valid=01:00&maxsms=3&tz=2")
//
// возвращает массив (<id>, <количество sms>, <стоимость>, <баланс>) в случае успешной отправки
// либо массив (<id>, -<код ошибки>) в случае ошибки
function send_sms($phones, $message, $translit = 0, $time = 0, $id = 0, $format = 0, $sender = false, $query = "")
{
static $formats = array(1 => "flash=1", "push=1", "hlr=1", "bin=1", "bin=2", "ping=1");
$m = $this->_smsc_send_cmd("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" : ""));
// (id, cnt, cost, balance) или (id, -error)
if ($this->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;
}
// SMTP версия функции отправки SMS
function send_sms_mail($phones, $message, $translit = 0, $time = 0, $id = 0, $format = 0, $sender = "")
{
return mail("send@send.smsc.ru", "", $this->LOGIN.":".$this->PASSWORD.":$id:$time:$translit,$format,$sender:$phones:$message", "From: ".$this->FROM."\nContent-Type: text/plain; charset=".$this->CHARSET."\n");
}
// Функция получения стоимости SMS
//
// обязательные параметры:
//
// $phones - список телефонов через запятую или точку с запятой
// $message - отправляемое сообщение
//
// необязательные параметры:
//
// $translit - переводить или нет в транслит (1,2 или 0)
// $format - формат сообщения (0 - обычное sms, 1 - flash-sms, 2 - wap-push, 3 - hlr, 4 - bin, 5 - bin-hex, 6 - ping-sms)
// $sender - имя отправителя (Sender ID)
// $query - строка дополнительных параметров, добавляемая в URL-запрос ("list=79999999999:Ваш пароль: 123\n78888888888:Ваш пароль: 456")
//
// возвращает массив (<стоимость>, <количество sms>) либо массив (0, -<код ошибки>) в случае ошибки
function get_sms_cost($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->_smsc_send_cmd("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 ($this->DEBUG) {
if ($m[1] > 0)
echo "Стоимость рассылки: $m[0]. Всего SMS: $m[1]\n";
else
echo "Ошибка №", -$m[1], "\n";
}
return $m;
}
// Функция проверки статуса отправленного SMS или HLR-запроса
//
// $id - ID cообщения
// $phone - номер телефона
// $all - вернуть все данные отправленного SMS, включая текст сообщения (0 или 1)
//
// возвращает массив:
//
// для SMS-сообщения:
// (<статус>, <время изменения>, <код ошибки доставки>)
//
// для HLR-запроса:
// (<статус>, <время изменения>, <код ошибки sms>, <код IMSI SIM-карты>, <номер сервис-центра>, <код страны регистрации>, <код оператора>,
// <название страны регистрации>, <название оператора>, <название роуминговой страны>, <название роумингового оператора>)
//
// При $all = 1 дополнительно возвращаются элементы в конце массива:
// (<время отправки>, <номер телефона>, <стоимость>, <sender id>, <название статуса>, <текст сообщения>)
//
// либо массив (0, -<код ошибки>) в случае ошибки
function get_status($id, $phone, $all = 0)
{
$m = $this->_smsc_send_cmd("status", "phone=".urlencode($phone)."&id=".$id."&all=".(int)$all);
// (status, time, err, ...) или (0, -error)
if ($this->DEBUG) {
if ($m[1] != "" && $m[1] >= 0)
echo "Статус SMS = $m[0]", $m[1] ? ", время изменения статуса - ".date("d.m.Y H:i:s", $m[1]) : "", "\n";
else
echo "Ошибка №", -$m[1], "\n";
}
if ($all && count($m) > 9 && (!isset($m[14]) || $m[14] != "HLR")) // ',' в сообщении
$m = explode(",", implode(",", $m), 9);
return $m;
}
// Функция получения баланса
//
// без параметров
//
// возвращает баланс в виде строки или false в случае ошибки
function get_balance()
{
$m = $this->_smsc_send_cmd("balance"); // (balance) или (0, -error)
if ($this->DEBUG) {
if (!isset($m[1]))
echo "Сумма на счете: ", $m[0], "\n";
else
echo "Ошибка №", -$m[1], "\n";
}
return isset($m[1]) ? false : $m[0];
}
// ВНУТРЕННИЕ ФУНКЦИИ
// Функция вызова запроса. Формирует URL и делает 3 попытки чтения
function _smsc_send_cmd($cmd, $arg = "")
{
$url = ($this->HTTPS ? "https" : "http")."://smsc.ru/sys/$cmd.php?login=".urlencode($this->LOGIN)."&psw=".urlencode($this->PASSWORD)."&fmt=1&charset=".$this->CHARSET."&".$arg;
$i = 0;
do {
if ($i)
sleep(2);
$ret = $this->_smsc_read_url($url);
}
while ($ret == "" && ++$i < 3);
if ($ret == "") {
if ($this->DEBUG)
echo "Ошибка чтения адреса: $url\n";
$ret = ","; // фиктивный ответ
}
return explode(",", $ret);
}
// Функция чтения URL. Для работы должно быть доступно:
// curl или fsockopen (только http) или включена опция allow_url_fopen для file_get_contents
function _smsc_read_url($url)
{
$ret = "";
$post = $this->POST || strlen($url) > 2000;
if (function_exists("curl_init"))
{
static $c = 0; // keepalive
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 (!$this->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;
}
}