Joywork/engine/smsc_api.php
2026-05-22 21:21:54 +03:00

304 lines
13 KiB
PHP
Raw 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.

<?php
// SMSC.RU API (smsc.ru) версия 3.7 (09.10.2017)
// пароль adm#123
define("SMSC_LOGIN", "ban_adm"); // логин клиента
define("SMSC_PASSWORD", "5e2b2251e46459211159032578f9813f"); // пароль
define("SMSC_POST", 1); // использовать метод POST
define("SMSC_HTTPS", 1); // использовать HTTPS протокол
define("SMSC_CHARSET", "utf-8"); // кодировка сообщения: utf-8, koi8-r или windows-1251 (по умолчанию)
define("SMSC_DEBUG", 0); // флаг отладки
define("SMTP_FROM", "api@smsc.ru"); // e-mail адрес отправителя
define("SECRET_STR_FOR_SMS","okimsiofj9892384928jce9_!<?kdfc9999");
function ok_code($s) {
return hexdec(substr(md5($s.SECRET_STR_FOR_SMS.mt_rand(1000,9999)), 7, 5));
}
// Функция отправки 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, 7 - mms, 8 - mail, 9 - call, 10 - viber)
// $sender - имя отправителя (Sender ID).
// $query - строка дополнительных параметров, добавляемая в URL-запрос ("valid=01:00&maxsms=3&tz=2")
// $files - массив путей к файлам для отправки mms или e-mail сообщений
//
// возвращает массив (<id>, <количество sms>, <стоимость>, <баланс>) в случае успешной отправки
// либо массив (<id>, -<код ошибки>) в случае ошибки
function send_sms($phones, $message, $translit = 0, $time = 0, $id = 0, $format = 0, $sender = false, $query = "", $files = array())
{
static $formats = array(1 => "flash=1", "push=1", "hlr=1", "bin=1", "bin=2", "ping=1", "mms=1", "mail=1", "call=1", "viber=1");
$m = _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" : ""), $files);
// (id, cnt, cost, balance) или (id, -error)
if (SMSC_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", "", SMSC_LOGIN.":".SMSC_PASSWORD.":$id:$time:$translit,$format,$sender:$phones:$message", "From: ".SMTP_FROM."\nContent-Type: text/plain; charset=".SMSC_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, 7 - mms, 8 - mail, 9 - call, 10 - viber)
// $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", "mms=1", "mail=1", "call=1", "viber=1");
$m = _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 (SMSC_DEBUG) {
if ($m[1] > 0)
echo "Стоимость рассылки: $m[0]. Всего SMS: $m[1]\n";
else
echo "Ошибка №", -$m[1], "\n";
}
return $m;
}
// Функция проверки статуса отправленного SMS или HLR-запроса
//
// $id - ID cообщения или список ID через запятую
// $phone - номер телефона или список номеров через запятую
// $all - вернуть все данные отправленного SMS, включая текст сообщения (0,1 или 2)
//
// возвращает массив (для множественного запроса двумерный массив):
//
// для одиночного SMS-сообщения:
// (<статус>, <время изменения>, <код ошибки доставки>)
//
// для HLR-запроса:
// (<статус>, <время изменения>, <код ошибки sms>, <код IMSI SIM-карты>, <номер сервис-центра>, <код страны регистрации>, <код оператора>,
// <название страны регистрации>, <название оператора>, <название роуминговой страны>, <название роумингового оператора>)
//
// при $all = 1 дополнительно возвращаются элементы в конце массива:
// (<время отправки>, <номер телефона>, <стоимость>, <sender id>, <название статуса>, <текст сообщения>)
//
// при $all = 2 дополнительно возвращаются элементы <страна>, <оператор> и <регион>
//
// при множественном запросе:
// если $all = 0, то для каждого сообщения или HLR-запроса дополнительно возвращается <ID сообщения> и <номер телефона>
//
// если $all = 1 или $all = 2, то в ответ добавляется <ID сообщения>
//
// либо массив (0, -<код ошибки>) в случае ошибки
function get_status($id, $phone, $all = 0)
{
$m = _smsc_send_cmd("status", "phone=".urlencode($phone)."&id=".urlencode($id)."&all=".(int)$all);
// (status, time, err, ...) или (0, -error)
if (!strpos($id, ",")) {
if (SMSC_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[$idx = $all == 1 ? 14 : 17]) || $m[$idx] != "HLR")) // ',' в сообщении
$m = explode(",", implode(",", $m), $all == 1 ? 9 : 12);
}
else {
if (count($m) == 1 && strpos($m[0], "-") == 2)
return explode(",", $m[0]);
foreach ($m as $k => $v)
$m[$k] = explode(",", $v);
}
return $m;
}
// Функция получения баланса
//
// без параметров
//
// возвращает баланс в виде строки или false в случае ошибки
function get_balance()
{
$m = _smsc_send_cmd("balance"); // (balance) или (0, -error)
if (SMSC_DEBUG) {
if (!isset($m[1]))
echo "Сумма на счете: ", $m[0], "\n";
else
echo "Ошибка №", -$m[1], "\n";
}
return isset($m[1]) ? false : $m[0];
}
// ВНУТРЕННИЕ ФУНКЦИИ
// Функция вызова запроса. Формирует URL и делает 5 попыток чтения через разные подключения к сервису
function _smsc_send_cmd($cmd, $arg = "", $files = array())
{
$url = $_url = (SMSC_HTTPS ? "https" : "http")."://smsc.ru/sys/$cmd.php?login=".urlencode(SMSC_LOGIN)."&psw=".urlencode(SMSC_PASSWORD)."&fmt=1&charset=".SMSC_CHARSET."&".$arg;
$i = 0;
do {
if ($i++)
$url = str_replace('://smsc.ru/', '://www'.$i.'.smsc.ru/', $_url);
$ret = _smsc_read_url($url, $files, 3 + $i);
}
while ($ret == "" && $i < 5);
if ($ret == "") {
if (SMSC_DEBUG)
echo "Ошибка чтения адреса: $url\n";
$ret = ","; // фиктивный ответ
}
$delim = ",";
if ($cmd == "status") {
parse_str($arg, $m);
if (strpos($m["id"], ","))
$delim = "\n";
}
return explode($delim, $ret);
}
// Функция чтения URL. Для работы должно быть доступно:
// curl или fsockopen (только http) или включена опция allow_url_fopen для file_get_contents
function _smsc_read_url($url, $files, $tm = 5)
{
$ret = "";
$post = SMSC_POST || strlen($url) > 2000 || $files;
if (function_exists("curl_init"))
{
static $c = 0; // keepalive
if (!$c) {
$c = curl_init();
curl_setopt_array($c, array(
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CONNECTTIMEOUT => $tm,
CURLOPT_TIMEOUT => 60,
CURLOPT_SSL_VERIFYPEER => 0,
CURLOPT_HTTPHEADER => array("Expect:")
));
}
curl_setopt($c, CURLOPT_POST, $post);
if ($post)
{
list($url, $post) = explode("?", $url, 2);
if ($files) {
parse_str($post, $m);
foreach ($m as $k => $v)
$m[$k] = isset($v[0]) && $v[0] == "@" ? sprintf("\0%s", $v) : $v;
$post = $m;
foreach ($files as $i => $path)
if (file_exists($path))
$post["file".$i] = function_exists("curl_file_create") ? curl_file_create($path) : "@".$path;
}
curl_setopt($c, CURLOPT_POSTFIELDS, $post);
}
curl_setopt($c, CURLOPT_URL, $url);
$ret = curl_exec($c);
}
elseif ($files) {
if (SMSC_DEBUG)
echo "Не установлен модуль curl для передачи файлов\n";
}
else {
if (!SMSC_HTTPS && function_exists("fsockopen"))
{
$m = parse_url($url);
if (!$fp = fsockopen($m["host"], 80, $errno, $errstr, $tm))
$fp = fsockopen("212.24.33.196", 80, $errno, $errstr, $tm);
if ($fp) {
stream_set_timeout($fp, 60);
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;
}
// Examples:
// include "smsc_api.php";
// list($sms_id, $sms_cnt, $cost, $balance) = send_sms("79999999999", "Ваш пароль: 123", 1);
// list($sms_id, $sms_cnt, $cost, $balance) = send_sms("79999999999", "http://smsc.ru\nSMSC.RU", 0, 0, 0, 0, false, "maxsms=3");
// list($sms_id, $sms_cnt, $cost, $balance) = send_sms("79999999999", "0605040B8423F0DC0601AE02056A0045C60C036D79736974652E72750001036D7973697465000101", 0, 0, 0, 5, false);
// list($sms_id, $sms_cnt, $cost, $balance) = send_sms("79999999999", "", 0, 0, 0, 3, false);
// list($sms_id, $sms_cnt, $cost, $balance) = send_sms("dest@mysite.com", "Ваш пароль: 123", 0, 0, 0, 8, "source@mysite.com", "subj=Confirmation");
// list($cost, $sms_cnt) = get_sms_cost("79999999999", "Вы успешно зарегистрированы!");
// send_sms_mail("79999999999", "Ваш пароль: 123", 0, "0101121000");
// list($status, $time) = get_status($sms_id, "79999999999");
// $balance = get_balance();
?>