USSD API (HTTPS, JSON)
Введение
USSD (Unstructured Supplementary Service Data) — стандартный сервис в сетях GSM, позволяющий организовать интерактивное взаимодействие между абонентом сети и сервисным приложением в режиме передачи коротких сообщений.
USSD-сервис во многом схож с SMS, оба сервиса используют для передачи данных формат коротких сообщений. Однако USSD в основном предназначен для обмена сообщениями между абонентом и дополнительными сервисами.
Основное направление использования USSD-сервиса — предоставление абонентам возможности получать дополнительную информацию от приложений и управлять этими приложениями. USSD работает на всех существующих телефонах стандарта GSM, за исключением самых ранних моделей 1998—1999 годов выпуска.
USSD-сервис поддерживает два вида сессий, USSD Phase 1 и USSD Phase 2 (инициирование сессии со стороны USSD-приложения). Обе вида во многом схожи и отличаются по большей части лишь способом вызова.
Приложение, использующее данное API инициализирует сессии вида USSD Phase 2
Сессия представляет собой последовательность связанных друг с другом сообщений в следущей последовательности: вопрос от приложения –ответ оператора (абонента) - вопрос от приложения –ответ оператора (абонента) … вопрос от приложения. В дальнейшем вместо термина «вопрос от приложения» будет употребляться общепринятый термин “меню”
Меню — это текст содержащий вопрос и/или инструкции по продолжению диалога
Примером меню может быть такой текст:
Выберите услугу:
1 — перевод
2 — блокировка карты
0 — выход
или
Оцените качество предоставляемых услугВозможны две кодировки меню:
GSM-7 — «латиница», до 182 символов на меню
UCS2 — «юникод» UTF-16, до 67 символов на меню
Точные ограничения зависят от конкретного оператора сотовой связи. Ответы абонентов допускают только латиницу и цифры.
API
Течение сессии можно разделить на три этапа: старт, общение и завершение
Сессия стартует когда USSD приложение посылает запрос на URL https://auth.terasms.ru/ussdapi/start/json с указанием номера телефона абонента, кодировки и пр. параметрами ( все параметры будут указаны ниже).
После этого платформа инициализирует сессию и посылает запрос на адрес партнера {base_ur}/start, где {partner_url} – это URL партнера, например http://partner_host/partner_script указанный вами
В ответ на запрос скрипт партнера , скрипт расположенный по адресу {base_url}/start отдает первое меню пересылаемое платформой сначала оператору, а затем абоненту.
Фаза “общения” начинается когда получен первый ответ от абонента (параметр text). Ответ доставляется путем запроса платформы к скрипту партнера расположенному по адресу {base_url}/response. В ответ платформа ожидает следующее меню с флагом shouldClose, который говорит платформе будет ли меню завершающим или нет. Как только приходит очередной ответ от пользователя фаза повторяется.
“Общение” продолжается до тех пор пока сессия не завершится.
События приводящие к завершению сессии:
- Со стороны приложения, при отправке меню с флагом
shouldClose = true(завершающее меню) - Со стороны приложения, запрос
https://auth.terasms.ru/ussdapi/release/json - Со стороны абонента
- Проблемы с сетью
| Статус | Описание |
|---|---|
| 200 | Сессия завершена нормально (завершающее меню) |
| 500 | Сессия завершена из-за проблем с сетью |
| 510 | Сессия завершена USSD приложением |
| 520 | Сессия завершена абонентом |
| 600 | Превышен таймаут |
В ответ посылаются ответ, подтверждающий что мы приняли запрос. Подробно все параметры будут описаны ниже.
Описание методов платформы
Для управления сессией используется два метода start и release, доступные соответственно по адресам:
https://auth.terasms.ru/ussdapi/start/json и https://auth.terasms.ru/ussdapi/release/json
| Метод | HTTP метод | Формат данных |
|---|---|---|
| start | HTTP POST | JSON |
| release | HTTP POST | JSON |
Пример запроса и ответа метода start:
>> POST https://auth.terasms.ru/ussdapi/start/json HTTP/1.1
>> Content-Length: 45
>> Content-Type: application/json
>> Host: localhost:80
>> Connection: Keep-Alive
>>
>> {
>> "login" => "login",
>> "password" => "password",
>> "bill_type" => "s",
>> "optional" => "id=234",
>> "destinstionAddr" => "79569900099",
>> "lang" => "UCS2"
>> }
<< HTTP/1.1 200 OK
<< Server: Apache-Coyote/1.1
<< Content-Language: hr-HR
<< Transfer-Encoding: chunked
<< Date: Thu, 08 Oct 2010 10:27:24 GMT
<<
<< {"responseExitCode":200,"responseMessage":"OK"}Параметры запроса метода start:
| Параметр | Значения | Описание |
|---|---|---|
| login | строка | обязательный параметр
Логин и пароль Партнера на Платформе TERASMS |
| password | строка | |
| billType | строка | обязательный параметрs - Тарификация по сессиямr - Тарификация по реквестам |
| destinationAddr | строка | обязательный параметр Номер абонента в международном формате. Пример: 79161111111 |
| optional | строка | необязательный параметр дополнительные параметры которые вы хотите передать вашему приложению при старте сессии, не меняются в течении всей сессии |
| optional | строка | обязательный параметр кодировка в котором меню будут передаваться абоненту |
Пример на языке программирования php:
$api_uri = "https://auth.terasms.ru/ussdapi/start/json";
$query_array = array(
"login" => "login",
"password" => "password",
"billType" => "r",
"optional" => "id=234",
"destinationAddr" => "79569900099"
);
$context = stream_context_create( array(
"http" => array(
"method" => "POST",
"content" => http_build_query( $query_array ),
"timeout" => 10,
),
));
$response = file_get_contents( $api_uri, false, $context);Пример запрос и ответа метода release:
>> POST https://auth.terasms.ru/ussdapi/release/json HTTP/1.1
>> Content-Length:234
>> Content-Type: application/json
>> Host: localhost:80
>> Connection: Keep-Alive
>>
>> {
>> "sessionId" : "13edc5f863606c69766531",
>> "reason" : "test reason",
>> "login" => "login",
>> "password" => "password",
>> }
<< HTTP/1.1 200 OK
<< Server: Apache-Coyote/1.1
<< Content-Language: hr-HR
<< Transfer-Encoding: chunked
<< Date: Thu, 08 Oct 2010 11:38:29 GMT
<<
<< {"responseExitCode":200,"responseMessage":""}Параметры запроса метода release:
| Параметр | Значения | Описание |
|---|---|---|
| login | строка | обязательный параметр Логин и пароль Партнера на Платформе TERASMS |
| password | строка | |
| sessionId | строка | обязательный параметр Идентификатор сессии идентификатор сессии |
| reason | строка | обязательный параметр Причина по которой была завершена сессия |
Пример на языке программирования php:
$api_uri = "https://auth.terasms.ru/ussdapi/release/json";
$query_array = array(
"login" => "login",
"password" => "password",
"sessionId" => "13edc5f863606c69766531",
"reason" => "password",
);
$context = stream_context_create( array(
"http" => array(
"method" => "POST",
"content" => http_build_query( $query_array ),
"timeout" => 10,
),
));
$response = file_get_contents( $api_uri, false, $context);Ответ в обоих случаях приходит в JSON формате и содержит в себе два параметра
-responseExitCode показывает удачно ли завершился запрос. Расшифровки кодов ниже:
| Статус | Описание |
|---|---|
| 200 | Запрос прошел без ошибок |
| 400 | Ошибка обработки JSON данных |
| 401 | Ошибка авторизации |
| 500 | Внутренняя ошибка сервера |
| -10 | Способ тарификации задан неверно (bill_type) |
| -30 | Номер абонента задан неверно (destinationAddr) |
| -40 | Кодировка задана неверно (lang) |
| -70 | Недостаточно средств на счете |
-responseMessage указывает возможную причину ошибки
Описание методов партнера
Приложение со стороны партнера должно располагать следующими методами, расположенными по адресу:
{partner_url} / status
{partner_url} / start
{partner_url} / response
{partner_url} / endЗначение partner_url зависит от сервера на котором расположено приложение партнера, например http://partner_host/partner_script.
Тело HTTP запроса представляет собой данные в JSON формате (кроме метода status) заданных кодировке UTF-8. HTTP методы запросов представлены ниже:
| Метод | HTTP метод |
|---|---|
| status | HTTP GET |
| start | HTTP POST |
| response | HTTP POST |
| end | HTTP POST |
Пример запроса и ответа метода status:
>> GET {partner_url}/6651/status HTTP/1.1
>> Host: localhost:80
>> Connection: Keep-Alive
<< HTTP/1.1 200 OK
<< Server: Apache-Coyote/1.1
<< Content-Language: en-US
<< Transfer-Encoding: chunked
<< Date: Thu, 18 Oct 2012 10:18:00 GMT
<<
<< {"sessionActive":true,"responseExitCode":0,"responseMessage":""}Параметры запроса метода status:
| Параметр | Значения | Описание |
|---|---|---|
| sessionId | строка | обязательный параметр идентификатор сессии |
Параметры ответа:
| Параметр | Значения | Описание |
|---|---|---|
| sessionActive | boolean | True если сессия активна, false если завершена |
| responseExitCode | строка | обязательный параметр код результата обработки запроса |
| responseMessage | строка |
пояснение к коду обработки, “” – если не возникло ошибок
Коды результата обработки запроса:
| Статус | Описание |
|---|---|
| 200 | Запрос прошел без ошибок |
| 400 | Ошибка обработки JSON данных |
| 500 |
Пример запроса и ответа метода start:
>> POST {partner_url}/6651/status HTTP/1.1
>> Content-Length: 17
>> Content-Type: application/json
>> Host: localhost:80
>> Connection: Keep-Alive
>>
>> {
>> "sessionId":"13ee0c52f8326c69766531",
>> "destinationAddr":"79079007899",
>> "text":"",
>> "optional":"id=234"
>> }
<< HTTP/1.1 200 OK
<< Server: Apache-Coyote/1.1
<< Content-Language: en-US
<< Transfer-Encoding: chunked
<< Date: Thu, 08 Oct 2012 12:28:53 GMT
<<
<< {
<< "shouldClose":false,
<< "ussdMenu":"1. Проверить баланс\n0. Выход ",
<< "responseExitCode" => 200,
<< "responseMessage" => ''
<< }Параметры запроса метода start:
| Параметр | Значения | Описание |
|---|---|---|
| sessionId | строка | обязательный параметр идентификатор сессии |
| destinationAddr | строка | обязательный параметр Номер абонента в международном формате. Пример: 79161111111 |
| optional | строка | необязательный параметр дополнительные параметры переданные в одноименном параметре при старте сессии (вызов https://auth.terasms.ru/ussdapi/start/json ) |
Параметры ответа метода start:
| Параметр | Значения | Описание |
|---|---|---|
| shouldClose | boolean | обязательный параметр true если это последнее меню , отправляемое абоненту (завершающее меню), false если сессия продолжается |
| ussdMenu | строка | обязательный параметр ussd меню отправляемое пользователю, для переноса строки используется “\n” |
| responseExitCode | строка | обязательный параметр код результата обработки запроса |
| text | строка | необязательный параметр эмуляция ответа абонента на отправленное меню |
Коды результата обработки запроса аналогичны методу status
Пример запроса и ответа метода response:
>> POST {partner_url}/6651/status HTTP/1.1
>> Content-Length: 96
>> Content-Type: application/json
>> Host: localhost:80
>> Connection: Keep-Alive
>>
>> {
>> "sessionId":"13ee0c52f8326c69766531",
>> "destinationAddr":"79079007899",
>> "optional":"id=234"
>> "conversation":"menu_id=3&count=2",
>> "text" : "1"
>> }
<< HTTP/1.1 200 OK
<< Server: Apache-Coyote/1.1
<< Content-Language: en-US
<< Transfer-Encoding: chunked
<< Date: Thu, 18 Oct 2013 11:21:01 GMT
<< {
<< "shouldClose":false,
<< "ussdMenu":"Оцените качество работы сервиса",
<< "conversation":"menu_id=3&count=2",
<< "responseExitCode":"200",
<< "responseMessage":""
<< }Параметры запроса метода response:
| Параметр | Значения | Описание |
|---|---|---|
| sessionId | строка | обязательный параметр |
| destinationAddr | строка | обязательный параметр обязательный параметр Номер абонента в международном формате. Пример: 79161111111 |
| optional | строка | необязательный параметр дополнительные параметры переданные в одноименном параметре при старте сессии (вызов https://auth.terasms.ru/ussdapi/start/json) |
| text | строка | обязательный параметр ответ абонента на отправленное меню |
| conversation | строка | необязательный параметр если в ответе с меню передавался параметр conversation он вернется вместе с ответом |
Параметры ответа метода response:
| Параметр | Значения | Описание |
|---|---|---|
| shouldClose | boolean | обязательный параметр true если это последнее меню , отправляемое абоненту (завершающее меню), false если сессия продолжается |
| ussdMenu | строка | необязательный параметр возвращается с ответом только если был передан с вместе с меню , используется для хранения промежуточной информации партнера, например идентификатора предыдущего меню |
| conversation | строка | |
| responseExitCode | строка | обязательный параметр код результата обработки запроса |
| responseMessage | строка | обязательный параметр “” – если не возникло ошибок |
Коды результата обработки запроса аналогичны методу status
Пример запроса и ответа метода end:
>> PUT {partner_url}/6651/end HTTP/1.1
>> Content-Length: 87
>> Content-Type: application/json
>> Host: localhost:8
>> Connection: Keep-Alive
>>
>> {
>> "sessionId":"13ee0c52f8326c69766531",
>> "reason" : "ok",
>> "exitCode" : 200
>> }
<< HTTP/1.1 200 OK
<< Server: Apache-Coyote/1.1
<< Content-Language: en-US
<< Transfer-Encoding: chunked
<< Date: Thu, 06 Oct 2012 02:21:54 GMT
<<
<< {"responseExitCode":0,"responseMessage":""}Параметры запроса метода end:
| Параметр | Значения | Описание |
|---|---|---|
| sessionId | строка | обязательный параметр идентификатор сессии |
| reason | строка | обязательный параметр сообщение о причине завершения сессии |
| exitCode | строка | обязательный параметр код завершения сессии, расшифровка указаны в конце раздела 3. AP |
| responseExitCode | строка | обязательный параметр код результата обработки запроса |
| responseMessage | строка | обязательный параметр пояснение к коду обработки, “” – если не возникло ошибок |
Коды результата обработки запроса аналогичны методу status
