====== Техническое описание "смс:ключ" ======
===== Общая информация =====
Услуга **смс:ключ** является простым способом ограничить доступ пользователя к содержимому того или иного сетевого ресурса, доступ к которому возможен только после ввода кода (пароля). Для того чтобы получить требуемый код доступа, пользователь отправляет Premium SMS на короткий номер и получает пароль в ответном сообщении. Владелец сайта, на котором находится контент, может задать параметры, определяющие, сколько раз и в течение какого времени этот код может быть использован. Легкость установки и гибкость настройки делают **смс:ключ** предпочтительным решением для большинства сайтов.
Характерными особенностями **смс:ключа** являются:
* легкость и быстрота установки: стандартная интеграция занимает 5-10 минут;
* простота адаптации к требованиям пользователя: возможно не только изменение внешнего вида, но и частичная или полная замена формы запроса, добавление пользовательских параметров.
В [[http://smscoin.com/software/|Библиотеке готовых скриптов]] имеются многочисленные варианты применения данной услуги. Также по ходу этой статьи встречаются ссылки, демонстрирующие различые аспекты ее реализации.
===== Алгоритм работы =====
- Сетевой ресурс с ограниченным доступом предлагает пользователю ввести код доступа (пароль) или заполнить поля выбора страны/оператора для получения инструкции по отправке SMS ((Внешний вид формы может отличаться в зависимости от реализации)), которая включает в себя:
* короткий номер, на который необходимо отправить SMS;
* текст SMS, состоящий из:
* префикса;
* идентификатора **смс:ключа** (ID смс:ключа);
* необязательных дополнительных данных (см. [[#Смс:ключ с удаленным обработчиком|смс:ключ с удаленным обработчиком]]).
* стоимость SMS, которая в зависимости от страны может как включать, так и не включать НДС;
* указание о дополнительных налогах и сборах, которые могут быть установлены в выбранной стране;
* дополнительная информация: правила составления текста SMS, условия ответственности, информация о технической поддержке и пр.
- Отправленное пользователем SMS-сообщение через оператора поступает на наш сервер.
- Согласно тексту SMS определяется соответствующий **смс:ключ** и проверяется:
* статус оплаты принятого оператором сотовой связи сообщения;
* соответствие стоимости принятого SMS-сообщения и стоимости, установленной в настройках **смс:ключа**
- Если проверка прошла успешно, на нашем сервере генерируется и фиксируется в базе данных уникальный, в пределах данного **смс:ключа**, код доступа. При этом также фиксируются следующие параметры:
* Access limit - количество раз, которое можно использовать код, установленное в настройках **смс:ключа** на момент генерации кода;
* Accessed left - равное Access limit;
* Timeout - срок действия кода в минутах с момента его первого использования (ввода на сайт), установленный в настройках **смс:ключа** на момент генерации кода;
* Created - дата и время генерации кода доступа.
- Сгенерированный код передается оператору сотовой связи, который передает его пользователю в виде ответного сообщения.
- Если используется [[#Смс:ключ с удаленным обработчиком|смс:ключ с удаленным обработчиком]], то наш сервер с помощью HTTP-запроса вызывает обработчик по URL-адресу, указанному в настройках **смс:ключа** в поле **Result URL**, и передает ему необходимые [[#Данные, передаваемые на обработчик|данные]], включая сгенерированный код.
- Пользователь на сайте вводит код доступа, полученный в ответном SMS.
- Введенный код проверяется на корректность. При этом:
* в случае использования [[#Стандартная версия смс:ключа|стандартной версии смс:ключа]] (без удаленного обработчика) проверка осуществляется на сервере smscoin;
* в случае использования [[#Смс:ключ с удаленным обработчиком|смс:ключа с удаленным обработчиком]] проверка осуществляется на сервере сетевого ресурса.
- Если проверка прошла успешно, пользователю предоставляется доступ к оплаченному ресурсу.
- Код доступа прекращает свое действие, если было выполнено хотя-бы одно из условий ((В случае использования [[#Смс:ключ с удаленным обработчиком|смс:ключа с удаленным обработчиком]], владелец сервиса может изменить/добавить свои условия)):
* либо исчерпано количество раз, которое можно использовать код;
* либо истек срок действия кода.
__**Примечание.**__ Генерируемый код доступа содержит в себе только цифры и буквы латинского алфавита. Соответственно, пользователь должен вводить только латинские буквы и цифры, даже если им соответствуют похожие по написанию буквы других алфавитов.
===== Добавление услуги и настройка =====
Добавление/настройка услуги **смс:ключ** производится в Панели Управления -> Услуги -> смс:ключ. После добавления услуги необходимо на сетевом ресурсе разместить клиентский код скрипта, взаимодействующий с нашим сервером и реализующий соответствующую логику.
Чтобы подключить к аккаунту новый **смс:ключ**, необходимо нажать "Добавить" и заполнить предлагаемую форму. При настройке параметров **смс:ключа** следует учитывать следующие особенности:
- **Адрес сайта**\\ Обязательно необходимо указать правильный адрес сайта, на котором планируется установить услугу. Этот адрес будет проверен модератором, после чего сервис заработает.
- **Стоимость**\\ Выбирается тариф (по стране/оператору) равный или больший заданной стоимости. Если стоимость выше любого тарифа в одной или нескольких странах (операторах), то они исключаются из списка доступных (из [[#Тарифная сетка|тарифной сетки]]). Если стоимость превышает тарифы во всех странах, то выдается пустой список (пустая [[#Тарифная сетка|тарифная сетка]]).
- **Время действия** и **Количество запросов**
* Если "Время действия" установлено в 0, то действие кода доступа будет неограниченно по времени.
* Если "Количество запросов" установлено в 0, действие кода будет неограниченно по количеству раз использования.
* Для получения безлимитного ("вечного") кода доступа необходимо оба параметра установить в 0.
- **Тип ключа**\\ Параметр необходимо задать, если ключ будет установлен на ресурсе, содержащим контент "для взрослых". В этом случае страны, в которых запрещено подключение сайтов "для взрослых", автоматически исключаются из списка доступных (из [[#Тарифная сетка|тарифной сетки]]), кроме России.
- **Передача паролей**\\ Задает режим работы **смс:ключа**. Существуют два режима работы:
* если не выбрано - используется [[#Стандартная версия смс:ключа|стандартная версия]];
* если выбрано - используется версия [[#Смс:ключ с удаленным обработчиком|с удаленным размещением обработчика]].
- **Адрес обработчика.**\\ Если включена **Передача паролей**, то необходимо задать URL-адрес обработчика, начинающийся с http://, на который нашим сервером передаются [[#Данные, передаваемые на обработчик|данные]] согласно [[#Реализация услуги смс:ключ с удаленным обработчиком|реализации услуги смс:ключ с удаленным обработчиком]].
- **пароль.**\\ Если включена **Передача паролей**, то необходимо задать пароль для защиты данных, передаваемых на удаленный обработчик. Задается произвольным набором символов в кодировке UTF-8 длиной, не превышающей 32 символа.
- **Рассылки**\\ Этот параметр не задействован, т.е. игнорируется.
**Обратите внимание!** Изменение настроек **смс:ключа** скажется только на тех пользователях, которые получат код доступа только после сохраненных изменений.
===== Стандартная версия смс:ключа =====
Эта услуга подходит для тех, кто не обладает навыками программирования или не уверен в своих возможностях. Код клиентского скрипта для использования стандартной версии **смс:ключа** доступен в Панели Управления по ссылке [[agregator:smscoin:smskey#PHP-версия скрипта по умолчанию|код ключа]]
http://smscoin.com/keys/html/<идентификатор ключа>/
и имеет версии для наиболее распространенных языков программирования:
* PHP
* Perl
* Phyton
* ASP.NET
__**Замечание.**__
Несмотря на то, что мы не предоставляем отдельной версии **смс:ключа** для использования на сайтах, построенных целиком на технологии Flash, также имеется [[#Версия скрипта на технологии Flash|версия скрипта на технологии Flash]] для проверки паролей ключей.
Для установки стандартной версии **смс:ключа** необходимо скопировать клиентский код скрипта из Панели Управления и вставить его в самом начале страницы (без пробелов и пустых строк!), содержимое которой планируется скрыть. Все, что находится ниже этого кода, будет доступно пользователю только после отправки SMS-сообщения и активации пароля, полученного в ответном SMS.\\
Посмотреть на пример работы стандартной версии **смс:ключа** можно [[http://smscoin.com/demo/key/normal/|здесь]]. В случае, если в настройках сервиса вы указали, что ресурс "для взрослых", результат будет несколько отличаться, как показано [[http://smscoin.com/demo/key/adult/|здесь]].
==== PHP-версия скрипта по умолчанию ====
;
$response = @file("http://key.smscoin.com/key/?s_key=".$key_id
."&s_pair=".urlencode(substr($_GET["s_pair"],0,10))
."&s_language=".urlencode(substr($_GET["s_language"],0,10))
."&s_ip=".$_SERVER["REMOTE_ADDR"]
."&s_url=".$_SERVER["SERVER_NAME"].htmlentities(urlencode($_SERVER["REQUEST_URI"])));
if ($response !== false) {
if (count($response)>1 || $response[0] != 'true') {
die(implode("", $response));
}
} else die('Не удалось запросить внешний сервер');
@ini_set('user_agent', $old_ua);
### SMS:Key end ###
?>
**Исправление кодировки**\\
Для исправления кодировки может понадобиться перед строкой
die(implode("", $response));
добавить следующую строку:
header('Content-Type: text/html; charset=utf-8');
**Установка языка интерфейса по умолчанию**\\
По умолчанию используется русский язык интерфейса. Для смены языка необходимо заменить адрес запроса в приведенном ниже коде
http://key.smscoin.com/key/
на
http://key.smscoin.com/language/english/key/
Вместо english можно указать любой поддерживаемый язык.
Пример работы можно увидеть [[http://smscoin.com/demo/key/english/|здесь]].
**Порядок взаимодействия скрипта с нашей системой**
- Скрипт выполняет GET-запрос на наш сервер по адресу http://key.smscoin.com/key/.\\ При этом, передаются следующие параметры:
* s_key - ID услуги смс:ключ;
* s_pair - код доступа (если введен пользователем);
* s_language - язык, на котором отображается страница оплаты;
* s_ip - IP адрес, с которого выполняется запрос (используется для автоматического определения страны и пр.);
* s_url - строка URL-запроса (используется для передачи пользовательских параметров обратно на страницу).\\ Кроме того, дополнительно можно передать следующие параметры:
* s_country - выбранная страна по-умолчанию;
* s_provider - выбранный оператор по-умолчанию;
* s_pure=1 - если код используется как часть пользовательской HTML-страницы (т.е. страница оплаты не будет иметь стандартное оформление).\\ В этом случае можно указать вспомогательный параметр:
* s_enc - кодировка пользовательской HTML-страницы.
- Согласно переданному **s_key** наш сервер осуществляет поиск записи, содержащей **s_pair**.
- Для найденного кода доступа (s_pair) проверяется:
* истекло ли время действия кода, прошедшее с момента его первого ввода (Accessed + Timeout);
* исчерпано ли количество раз использования кода (Accessed left > 0).
- Если проверка прошла успешно, то в соответствующей коду доступа записи в базе данных фиксируется следующая информация:
* Accessed - дата и время первого использования кода;
* IP - из параметра **s_ip**;
* URL - из параметра **s_url**;
* Accessed left - предыдущее значение, уменьшенное на единицу.
- Ответом на GET-запрос является массив **$response**, содержащий:
* единственный элемент **$response[0]='true'** - если код доступа корректный;
* стандартную форму ввода кода доступа (как правило) - в противном случае.
- Если введенный код доступа некорректный, то скрипт выводит на экран соответствующую стандартную форму и принудительно завершает выполнение файла, содержащего скрипт. В противном случае, выполняется код, расположенный ниже скрипта.
==== Альтернативная PHP-версия скрипта по умолчанию ====
Некоторые хостинги отключают возможность отправки GET-запроса удаленному скрипту при помощи функции file() (директива allow_url_fopen отключена). Специально для таких случаев существует альтернативная версия скрипта, приведенная ниже
Этот код находится [[http://smscoin.com/mediabank/examples/smskey_extended_php.zip|здесь]].
==== PHP-версия скрипта для внедрения в дизайн страницы ====
Недостатком [[#PHP-версия скрипта по умолчанию|версии скрипта по умолчанию]] является недостаточная интеграция с дизайном сайта, на котором она используется. Существуют несколько вариантов решения этой проблемы.
=== Вариант 1 ===
Заключается в том, чтобы заменить строку
die(implode("", $response));
на следующий код:
die('
');
Отличительными особенностями данной модификации скрипта являются:
* оформление страницы целиком ложится на плечи владельца сетевого ресурса, включая вывод инструкции по отправке SMS (чтобы вывести эту инструкцию, потребуется [[#Тарифная сетка|тарифная сетка]] используемого смс:ключа),
* можно добавить любые дополнительные пользовательские параметры, которые могут быть использованы ниже в коде скрипта **смс:ключа**.
=== Вариант 2 ===
Можно модифицировать стандартный скрипт следующим образом:
;
$response = @file("http://key.smscoin.com/key/?s_pure=1&s_key=".$key_id
."&s_pair=".urlencode(substr($_GET["s_pair"],0,10))
."&s_language=".urlencode(substr($_GET["s_language"],0,10))
."&s_ip=".$_SERVER["REMOTE_ADDR"]
."&s_url=".$_SERVER["SERVER_NAME"].htmlentities(urlencode($_SERVER["REQUEST_URI"])));
if ($response !== false) {
if (count($response)>1 || $response[0] != 'true') {
echo implode("", $response);
} else{
// ****************** ЗАКРЫТАЯ КЛЮЧОМ ИНФОРМАЦИЯ ******************
}
} else die('Не удалось запросить внешний сервер');
@ini_set('user_agent', $old_ua);
### SMS:Key end ###
// ****************** НИЖНЯЯ ЧАСТЬ ОФОРМЛЕНИЯ ******************
?>
Отличительными особенностями данной модификации скрипта являются:
* использование параметра **s_pure=1** (пример работы параметра можно увидеть [[http://smscoin.com/demo/key/noskin/|здесь]].);
* возможность задать кодировку через параметр **s_enc** (кодировкой по умолчанию является windows-1251);
* возможность использовать оформление верхней и нижней части страницы;
* возможность использования CSS для оформления внешнего вида формы (CSS, используемую по умолчанию, можно скачать [[http://smscoin.com/skin/default/style.css|здесь]]);
* в случае некорректного кода доступа выполнение файла не завершается принудительно.
==== Версия скрипта на технологии Flash ====
Несмотря на то, что мы не предоставляем отдельной версии **смс:ключа** для использования на сайтах, построенных на технологии Flash, ниже приведен ActionScript-код для проверки кодов доступа (паролей):
var key : String = new String("ID услуги смс:ключ");
var pair : String = new String("код доступа");
var loadVars : LoadVars = new LoadVars();
loadVars.onLoad = function(success : Boolean) {
if(success && loadVars.toString() == "true") {
// код доступа подтвержден
} else {
// код доступа не подтвержден
}
}
loadVars.load("http://key.smscoin.com/key/?s_key=" + key
+ "&s_pair=" + pair);
Где:
* ID услуги смс:ключ - идентификатор услуги смс:ключ;
* код доступа — код доступа, введенный пользователем;
* код доступа подтвержден - переход к закрытой части сайта;
* код доступа не подтвержден - сообщение об ошибке или предложение ввести код доступа повторно.
===== Смс:ключ с удаленным обработчиком =====
В [[#Стандартная версия смс:ключа|стандартной версии смс:ключа]] всю работу по выдаче и проверке паролей выполняет наш сервер. При этом, услуга лишена некоторой гибкости. В версии же с удаленным обработчиком владелец сервиса получает дополнительные преимущества:
* все пароли хранятся и обрабатываются на стороне владельца сервиса;
* использование любых языков программирования;
* полная свобода управления внешним видом услуги;
* возможность изменения, в определенных пределах, принципа работы услуги;
* в отправляемом пользователем SMS-сообщении появляется возможность после идентификатора **смс:ключа** добавить произвольный текст, который будет передан на обработчик (см.[[#Данные, передаваемые на обработчик]]);
* владелец сервиса в меньшей степени зависим от разного рода атак на наши сервера, перебоев работы сети и т.д.
Минусами услуги являются:
* повышенные требования к навыкам программирования и работы с базами данных у владельцев ресурса;
* задержка (до 1-2 минут) вызова обработчика.
==== Реализация услуги смс:ключ с удаленным обработчиком ====
- Владелец сервиса берет на себя организацию ограничения доступа к платному ресурсу, включая оформление и вывод инструкции по отправке SMS.
- Согласно [[#Алгоритм работы|Алгоритму работы]] вызываемый обработчик **Result URL** принимает [[#Данные, передаваемые на обработчик|соответствующие данные]] и проверяет корректность принятой информации с помощью вычисления MD5-хэш строки, состоящей из соединенных через двойное двоеточие ("::") параметров **secret_code, key, pair, timeout, limit, content, country, cost_local, provider** (в указанном порядке), и сравнения полученного результата со строкой **sign_v4**.
- В случае успешной проверки принятая информация, как правило, фиксируется в базе данных владельца сервиса (здесь и далее - локальной базе данных).
- Введенный пользователем код доступа обрабатывается в соответствии с реализованной владельцем логикой (поиск кода в локальной базе данных, проверка лимитов и т.п.).
__**Замечания.**__
- Одна локальная база данных может быть использована для нескольких услуг **смс:ключ** (разные ID).
- Обработчик **Result URL** обязательно должен возвращать HTTP статус 200 OK и слово "OK" в теле ответа, даже если принятая информация некорректна. Это связано с тем, что если запрос на обработчик возвращает статус отличный от 200, то наш сервер еще дважды, примерно с минутным интервалом, будет пытаться повторить запросы. Для минимизации нагрузки на наш сервер это нежелательно.
Пример исходного кода скрипта, реализующего функционал **смс:ключа** с удаленным обработчиком находится [[http://smscoin.com/mediabank/examples/smskey_remote_php.zip|здесь]].
==== Данные, передаваемые на обработчик ====
^ Параметр ^ Тип ^ Описание ^
|country | char(2) |Двухбуквенный код страны |
|provider | char(16) |Оператор сотовой связи |
|key | int |Идентификатор услуги смс:ключ |
|pair | char(10) |Сгенерированный нашим сервером пароль |
|timeout | int |Время жизни сгенерированного пароля (pair) в минутах |
|limit | int |Количество активаций сгенерированного пароля |
|content | char(128) |Текст сообщения, следующий за идентификатором услуги смс:ключ |
|cost_local | float |Стоимость SMS-сообщения в локальной валюте |
|sign_v4 | char(32) |MD5-хэш строки, состоящей из соединенных через двойное двоеточие ("::") параметров\\ secret_code, key, pair, timeout, limit, content, country, cost_local, provider (в указанном порядке),\\ где secret_code - значение поля "пароль." в настройках услуги смс:ключ в Панели Управления |
| Пользовательские данные |||
|user_1\\ user_2\\ ...\\ user_n | |Не обязательный перечень параметров, определяемый пользователем,\\ который задается в строке **Адреса обработчика** в Панели Управления в настройках услуги.\\ Суммарное ограничение размера всех пар "поле-значение" составляет 155 символов.\\ \\ __**Внимание!**__\\ Пользовательские параметры не должны начинаться с префикса s_,\\ поскольку его использование зарезервировано для наших внутренних нужд. |
==== Типичный PHP-скрипт удаленного обработчика ====
$v) {
$_GET[$k] = substr(trim(strip_tags($v)), 0, 250);
}
// service secret code
// секретный код сервиса
$secret_code = KEY_SECRET;
// collecting required data
// собираем необходимые данные
$key = $_REQUEST["key"];
$pair = $_REQUEST["pair"];
$timeout = $_REQUEST["timeout"];
$limit = $_REQUEST["limit"];
$content = $_REQUEST["content"];
$country = $_REQUEST["country"];
$provider = $_REQUEST["provider"];
$cost_local = $_REQUEST["cost_local"];
$sign = $_REQUEST["sign_v4"];
// users data
// пользовательские данные
$user_1 = $_REQUEST["user_1"];
$user_2 = $_REQUEST["user_2"];
...
$user_n = $_REQUEST["user_n"];
// making the reference signature
// создаем эталонную подпись
$reference = ref_sign($secret_code, $key, $pair, $timeout, $limit, $content, $country, $cost_local, $provider);
// validating the signature
// проверяем, верна ли подпись
if($sign == $reference) {
// success, proceeding
// обрабатываем полученные данные
echo 'OK';
} else {
// failure, reporting error
// неправильно составлен запрос
echo 'checksum failed';
}
?>
===== Тарифная сетка =====
Тарифную сетку для услуги **смс:ключ** можно получить по следующим адресам:
в формате XML:
http://service.smscoin.com/xml2/key/идентификатор ключа/
или
http://key.smscoin.com/xml2/key/идентификатор ключа/
в формате JSON:
http://service.smscoin.com/json/key/идентификатор ключа/
или
http://key.smscoin.com/json/key/идентификатор ключа/
===== Примеры работы и готовые скрипты =====
==== Примеры работы ====
^ Ссылка ^ Описание ^
|[[http://smscoin.com/demo/key/normal/]] |Стандартная версия |
|[[http://smscoin.com/demo/key/noskin/]] |Стандартная версия без оформления |
|[[http://smscoin.com/demo/key/adult/]] |Стандартная версия с отметкой "для взрослых" |
|[[http://smscoin.com/demo/key/english/]] |Стандартная версия с заданным языком по-умолчанию |
|[[http://smscoin.com/demo/key/wml/]] |Стандартная версия для мобильных броузеров |
|[[http://demo.sms-payment-scripts.com/]] |Услуги, реализованные с помощью [[http://smscoin.com/software/|Библиотеки готовых скриптов]] |
|[[http://demo.sms-payment-scripts.com/smskey_remote/check_popup.php]] |Стандартный смс:ключ с удаленным обработчиком (без всплывающего окна) |
|[[http://demo.sms-payment-scripts.com/smskey_remote/check.php]] |cмс:ключ с удаленным обработчиком c отображением инструкции в списке по странам |
|[[http://demo.sms-payment-scripts.com/smskey_remote/check_popup.html]] |cмс:ключ с удаленным обработчиком c отображением инструкции во всплывающем окне |
==== Готовые скрипты ====
^ Ссылка ^ Описание ^
|[[http://smscoin.com/mediabank/examples/smskey_extended_php.zip]] |Альтернативная PHP-версия стандартного скрипта |
|[[http://smscoin.com/skin/default/style.css]] |CSS по-умолчанию |
|[[http://smscoin.com/mediabank/examples/smskey_remote_php.zip]] |cмс:ключ с удаленным обработчиком |
|[[http://smscoin.com/mediabank/examples/smskey_remote_php_geo.zip]]|cмс:ключ с удаленным обработчиком с автоопределением страны по IP |