Интеграция (API)

14.png

Тестема имеет простой и удобный API, благодаря которому, может быть легко организовано взаимодействие со сторонними ресурсами при ее коммерческом использовании, когда обучающие материалы распространяются на платной основе. Подробнее о продаже материалов, а также о применении API для этой цели, можно узнать, ознакомившись с описанием типичных сценариев использования Тестемы.

Алгоритм реализации материала с применением API через сторонний веб-ресурс, принадлежащий автору или посреднику, выглядит следующим образом:

  1. Запрос к API на получение информации о доступности материала.
  2. Размещение информации о материале на стороннем ресурсе (самостоятельно).
  3. Принятие оплаты от покупателя материала, а также получение его адреса электронной почты (самостоятельно).
  4. Запрос к API на создание системного персонального задания и получение в ответ ключа для доступа к материалу.
  5. Предоставление покупателю ссылки, сформированной на базе ключа (самостоятельно или средствами Тестемы при условии передачи соответствующего параметра в рамках запроса к API, указанному в п. 4).
  6. Получение от API на свой URL обратного вызова информации о наличии результатов выполнения заданий материала покупателем (необязательно).
  7. Запрос к API на удаление системного персонального задания (при необходимости).

Методы API

Обращение к API Тестемы осуществляются путем отправки POST-запросов на URL https://testema.ru/integration/api в формате JSON. При этом добавление к запросам каких-либо заголовков не требуется, поскольку данные, необходимые для аутентификации, включаются в тело запроса.

В случае успешного завершения запроса ответ будет иметь статус 200. При некорректном запросе или невозможности его выполнения ответ будет иметь статус 400 («Bad request»), а также в теле ответа в большинстве случаев будет присутствовать описание проблемы. Тело ответа при этом имеет формат TEXT.

Метод checkUser (еще методы: addItem, removeItem, getItems)

Проверяет возможность создания системного персонального задания для организации доступа к материалу пользователя или другого автора. В качестве параметра ответа достаточно получить его статус (200 – возможность есть, 400 – возможность отсутствует).

Параметры запроса:

Параметр Обязательный Тип Родитель Описание
method да string - Название метода.
token да string - API-токен пользователя.
data да object - Объект с данными запроса.
emailUser да string data Адрес электронной почты автора материала.
moduleId да string data Идентификатор материала.

Параметры ответа:

Статус ответа Значение
200 «ok» (формат TEXT).
400 Описание проблемы (формат TEXT).

Пример запроса:


JSON:

{
   "method":"checkUser",
   "token":"989e5e7aa3282072f1cdc79314ecefa",
   "data":
   {
      "emailUser":"author@author.ru",
      "moduleId":92,
   }
}

Метод addItem (еще методы: checkUser, removeItem, getItems)

Создает системное персональное задание для организации доступа конечного получателя к материалу пользователя или другого автора. Возвращает ключ для доступа к материалу в Тестеме.

Параметры запроса:

Параметр Обязательный Тип Родитель Описание
method да string - Название метода.
token да string - API-токен пользователя.
data да object - Объект с данными запроса.
customer да object data Объект с данными получателя материала.
emailUser да string data Адрес электронной почты автора материала.
moduleId да string data Идентификатор материала.
sendEmail нет boolean data Если параметр не указан или имеет значение «true», получателю на адрес электронной почты будет отправлено стандартное сообщение от Тестемы со ссылкой для доступа к материалу.
message нет string data При отправке сообщения получателю вводная фраза «Здравствуйте! Вам предоставили доступ к материалу в приложении Тестема!» будет заменена на значение параметра.
accessLimit нет integer data Если параметр не указан или имеет значение 0, получатель сможет открывать материал неограниченное количество раз до тех пор, пока не нажмет на надпись «ЗАВЕРШИТЬ» в его конце. Иначе данная возможность будет ограничена значением параметра.
firstName нет string customer Имя получателя материала.
lastName нет string customer Фамилия получателя материала.
emailCustomer да string customer Адрес электронной почты получателя материала.

Параметры ответа:

Статус ответа Значение
200 Hash-ключ доступа к материалу в Тестеме (формат TEXT, длина 32 знака).
400 Описание проблемы (формат TEXT).

Пример запроса с минимальным набором обязательных параметров:


JSON:

{
   "method":"addItem",
   "token":"989e5e7aa3282072f1cdc79314ecefa",
   "data":
   {
      "customer":
      {
         "emailCustomer":"customer@customer.ru"
      },
      "emailUser":"author@author.ru",
      "moduleId":92,
   }
}

Метод removeItem (еще методы: checkUser, addItem, getItems)

Удаляет системное персональное задание, обеспечивающее доступ конечного получателя к материалу. Возвращает количество оставшихся активных персональных заданий у пользователя.

Параметры запроса:

Параметр Обязательный Тип Родитель Описание
method да string - Название метода.
token да string - API-токен пользователя.
data да object - Объект с данными запроса.
itemKey да string data Hash-ключ доступа к материалу задания (32 знака).

Параметры ответа:

Статус ответа Значение
200 Количество оставшихся персональных заданий пользователя (формат TEXT).
400 Описание проблемы (формат TEXT).

Пример запроса:


JSON:

{
   "method":"removeItem",
   "token":"989e5e7aa3282072f1cdc79314ecefa",
   "data":
   {
      "itemKey":"35e2a957f6679e12b58d7559a178a2f1",
   }
}

Метод getItems (еще методы: checkUser, addItem, removeItem)

Запрос подробной информации об имеющихся системных персональных заданиях пользователя. Возвращает объект с данными. При указании в запросе ключа доступа к материалу в рамках конкретного системного задания (в параметре itemKey) объект ответа будет содержать информацию только по этому заданию.

Параметры запроса:

Параметр Обязательный Тип Родитель Описание
method да string - Название метода.
token да string - API-токен пользователя.
data нет object - Объект с данными запроса.
itemKey нет string data Hash-ключ доступа к материалу задания (32 знака).

Параметры ответа:

Статус ответа Значение
200 Сериализованный объект (формат JSON).
400 Описание проблемы (формат TEXT).

Объект, возвращаемый при статусе ответа 200, содержит свойство «items», представляющее собой массив объектов системных заданий.

Свойства объекта системного задания:

Свойство Тип Описание
key string Hash-ключ доступа к материалу задания (32 знака).
user_email string Адрес электронной почты автора материала.
module_name string Публичное название материала.
customer_name string Фамилия и имя получателя материала.
customer_email string Адрес электронной почты получателя материала.
customer_started boolean Значение «true» говорит о том, что получатель материала уже воспользовался ссылкой для доступа к материалу. Фактически, свидетельствует о том, получатель успешно получил доступ к материалу.
customer_finished boolean Значение «true» говорит о том, что получатель материала завершил его прохождение в Тестеме. Свидетельствует о том, что была нажата кнопка «ЗАВЕРШИТЬ» на последней странице материала, в результате чего он больше недоступен для получателя.
attempts string В случае, если материал имеет ограничение по количеству просмотров, отображает количество оставшихся просмотров у получателя.
attestation string Если материал содержит блоки автоматической оценки знаний (например, тестирование), отображает результат тестирования в процентах. Может быть использовано в случаях, когда получателю по итогам освоения материала автор или продавец должен выдать соответствующий документ.

Пример запроса на получение данных о всех системных заданиях:


JSON:

{
   "method":"getItems",
   "token":"989e5e7aa3282072f1cdc79314ecefa",
}

Пример ответа:


JSON:

{
   "items":
   [
      {
      "key":"35e2a957f6679e12b58d7559a178a2f1",
      "user_email":"author@author.ru",
      "module_name":"Выращивание клубники",
      "customer_name":"Иванов Иван",
      "customer_email":"customer1@customer.ru",
      "customer_started":false,
      "customer_finished":false,
      "attempts":"не ограничено",
      "attestation":"не предусмотрено"
      },

      {
      "key":"f8fc8e2edf8494c22f348e09dac4679d",
      "user_email":"author@author.ru",
      "module_name":"Основы программирования",
      "customer_name":"Степанова Елена Ивановна",
      "customer_email":"customer2@customer.ru",
      "customer_started":true,
      "customer_finished":false,
      "attempts":"3",
      "attestation":"75"
      },

      ...
   ]
}

Пробные запросы к API

Поскольку запрос addItem влечет за собой списание средств с баланса учетной записи автора материалов, не следует использовать для тестирования API адреса электронной почты реальных пользователей. Для этих целей в Тестеме предусмотрен специальный пользователь с адресом электронной почты test@testema.ru. Все пробные запросы следует отправлять только с указанием данного адреса в качестве идентификатора автора материала. Ниже представлен рекомендуемый алгоритм отладки вашего ПО для взаимодействия с API Тестемы:

  1. Отправьте запрос addItem, указав в параметрах emailUser и emailCustomer один и тот же адрес test@testema.ru, а в параметре moduleId текст 00_00. Параметр sendEmail не указывайте совсем. В случае успеха на адрес электронной почты вашей учетной записи придет демонстрационное письмо со ссылкой для доступа к материалу на базе того же ключа, который вернул метод addItem.
  2. Запросите данные созданного системного персонального задания при помощи getItems. В результате вы должны получить объект с единственной записью в массиве items. Материал будет иметь название «Как пользоваться мобильным приложением?».
  3. При необходимости, повторите запрос addItem несколько раз с теми же параметрами и сохраните ключи, полученные в ответ. После этого, используя getItems, убедитесь в том, что было создано соответствующее количество системных персональных заданий.
  4. Удалите все системные персональные задания, поочередно выполнив запрос removeItem для каждого из сохраненных ключей.

Взаимодействие с получателями материалов

Если в запросе addItem параметр sendEmail не указан или имеет значение «true», получателю на адрес электронной почты будет отправлено стандартное сообщение от Тестемы, содержащее ссылку для доступа к материалу и краткую инструкцию.

В случае, если вы хотите отправить собственное сообщение, установите значение «false» для параметра sendEmail. При этом в тексте вашего сообщения обязательно потребуется указать ссылку для доступа к материалу. В противном случае у получателя не будет возможности просмотра приобретенного им материала. Ссылка должна иметь следующий вид: https://app.testema.ru/?key=accesskey&start=moduleId, где вместо accesskey укажите ключ доступа, полученный в ответе на запрос addItem (32 знака), а вместо moduleId - идентификатор материала, который вы использовали в качестве значения параметра moduleId при отправке этого запроса.

При поступлении запроса addItem система проверяет наличие учетной записи в Тестеме у получателя материалов. Идентификация происходит по адресу электронной почты, указанному в параметре emailCustomer. Если пользователь не был зарегистрирован ранее, для него автоматически создается учетная запись, логином которой является значение параметра emailCustomer. При этом стандартное сообщение от Тестемы будет содержать соответствующее предупреждение с указанием логина и пароля для входа в личный кабинет. Из соображений безопасности пароль не может быть передан в ответ на запросы к API, поэтому в случае отправки вами собственного сообщения получателю материала, вы не сможете предоставить ему указанный выше пароль. В этой ситуации потребуется предоставить получателю ссылку для восстановления пароля https://testema.ru/password-recovery, а также уведомить его о необходимости ее использования, если учетная запись в Тестеме не была создана ранее самим получателем.

Получение уведомлений от API

Для организации эффективного управления продажами нередко требуется отслеживание действий покупателей с приобретенными ими материалами. При возникновении некоторых важных событий API Тестемы автоматически отправляет уведомления в адрес URL, с доменных имен которых ранее поступили запросы на создание соответствующих системных персональных заданий.

Для обработки обратных вызовов API на стороне пользователя необходимо создать функцию, запуск которой будет осуществляться при поступлении запроса к URL, имеющему следующий шаблон: https://ваш домен/testema/callback. Например, в случае с доменом mysite.ru URL для уведомлений будет таким: https://mysite.ru/testema/callback. На указанный URL API Тестемы отправит POST-запрос с телом в формате JSON.

Параметры запроса:

Параметр Обязательный Тип Описание
token да string API-токен, полученный вами для доступа к API. Передается для верификации того, что запрос поступил действительно от API Тестемы.
event да string Тип события, в результате которого отправлен запрос.
itemKeys да array string Массив с ключами системных персональных заданий, в отношении которых произошло событие.

API не ожидает и не проверяет ответ на свои запросы, поэтому в случае, если на стороне вашего сервера возникнет ошибка, повторной отправки запроса не произойдет.

Событие moduleComplete (еще события: moduleRefused, moduleRemoved)

Возникает, когда получатель материала полностью завершил его прохождение (нажал на надпись «ЗАВЕРШИТЬ» в конце материала). Отслеживание данного события будет полезно, например, в том случае, если по итогу прохождения материала пользователь должен получить от вас соответствующий документ (сертификат, диплом и т.п.). Массив itemKeys для данного события будет содержать только один элемент.

Пример запроса:


JSON:

{
   "token":"989e5e7aa3282072f1cdc79314ecefa",
   "event":"moduleComplete",
   "itemKeys":
   [
      "35e2a957f6679e12b58d7559a178a2f1"
   ]
}

Событие moduleRefused (еще события: moduleComplete, moduleRemoved)

Возникает, когда получатель материала по какой-либо причине отказался от его прохождения, удалив материал у себя в Тестеме. Массив itemKeys для данного события будет содержать только один элемент.

Пример запроса:


JSON:

{
   "token":"989e5e7aa3282072f1cdc79314ecefa",
   "event":"moduleRefused",
   "itemKeys":
   [
      "35e2a957f6679e12b58d7559a178a2f1"
   ]
}

Событие moduleRemoved (еще события: moduleComplete, moduleRefused)

Возникает, когда автор материала, на основе которого вами были созданы системные персональные задания, удалил указанный материал. Данное событие не может произойти, если хотя бы один получатель материала, не удаливший материал у себя в Тестеме, еще ни разу не открывал его либо не завершил прохождение материала (не нажал на надпись «ЗАВЕРШИТЬ» в конце). Автору будет позволено удалить материал только при соблюдении указанных выше условий, поэтому при поступлении запроса с событием moduleRemoved вы можете быть полностью уверены в том, что системные персональные задания, ключи которых присутствуют в массиве itemKeys, можно удалить без каких-либо негативных последствий для взаимоотношений с получателями этих заданий. Кроме этого, возникновение события moduleRemoved говорит о необходимости удаления из продажи соответствующего материала на вашем веб-ресурсе. Следует отметить, что вы не получите уведомление с событием moduleRemoved в случае, если у вас нет ни одного системного персонального задания, созданного на основе материала, который был удален его автором.

Пример запроса:


JSON:

{
   "token":"989e5e7aa3282072f1cdc79314ecefa",
   "event":"moduleRemoved",
   "itemKeys":
   [
      "35e2a957f6679e12b58d7559a178a2f1",
      "d8fc8e2edf8494c22f348e09dac4679d"
   ]
}