# Создание приложения



# Регистрация нового приложения

Для начала работы надо авторизоваться в приложение API TPU ([https://api.tpu.ru](https://api.tpu.ru))

1. Перейти на сайт API TPU ([https://api.tpu.ru](https://api.tpu.ru))
2. Нажать на кнопку вход (см. рисунок) следуя инструкциям авторизации ввести свой корпоративный логин и пароль.

[![Screenshot_20.jpg](https://devdocs.tpu.ru/uploads/images/gallery/2024-10/scaled-1680-/screenshot-20.jpg)](https://devdocs.tpu.ru/uploads/images/gallery/2024-10/screenshot-20.jpg)

3\. После авторизации в боковом меню выбрать раздел "Все приложения"

<p class="callout info">В списке будут отображаться приложения, где вы являетесь разработчиком. Если кто-то вас добавит к своему приложению - оно отобразиться у вас в боковом меню.</p>

[![Screenshot_21.jpg](https://devdocs.tpu.ru/uploads/images/gallery/2024-10/scaled-1680-/screenshot-21.jpg)](https://devdocs.tpu.ru/uploads/images/gallery/2024-10/screenshot-21.jpg)

4\. В правом верхнем углу нажмите кнопку "Добавить" и заполните все поля, при необходимости можете сразу указать [публичный SSL ключ](https://devdocs.tpu.ru/books/prilozeniia-tpu/page/kliuc-dostupa) вашего приложения

[![Screenshot_22.jpg](https://devdocs.tpu.ru/uploads/images/gallery/2024-10/scaled-1680-/screenshot-22.jpg)](https://devdocs.tpu.ru/uploads/images/gallery/2024-10/screenshot-22.jpg)

5\. После добавления вашего приложения отправьте заявку на почту <support@tpu.ru> для подтверждения вашего приложения.

# Добавление платформы приложения

После добавления вашего приложения, требуется добавить платформы и получить API Key для работы с методами API.

Для этого в меню выберите следующие пункты "Настройки" -&gt; "Платформы".

[![Screenshot_25.jpg](https://devdocs.tpu.ru/uploads/images/gallery/2024-10/scaled-1680-/screenshot-25.jpg)](https://devdocs.tpu.ru/uploads/images/gallery/2024-10/screenshot-25.jpg)

В появившимся окне необходимо выбрать [тип платформы](https://devdocs.tpu.ru/books/prilozeniia-tpu/page/platformy-prilozeniia) приложения и заполнить все поля. Нажать "Сохранить".

<p class="callout info">Идентификатор платформы должен содержать только латинские буквы. Обычно это алиас системы или доменное имя сайта, записанное в обратном порядке</p>

[![Screenshot_24.jpg](https://devdocs.tpu.ru/uploads/images/gallery/2024-10/scaled-1680-/screenshot-24.jpg)](https://devdocs.tpu.ru/uploads/images/gallery/2024-10/screenshot-24.jpg)

# Добавлении версии приложения

Следующий шаг - это добавление версии приложения, для того чтобы получить [API Key](https://devdocs.tpu.ru/books/prilozeniia-tpu/page/versii-prilozeniia) и [Private Key](https://devdocs.tpu.ru/books/prilozeniia-tpu/page/versii-prilozeniia) для работы с методами [https://api.tpu.ru](https://api.tpu.ru)

Выберите пункт "Версии" напротив интересующей вас платформы приложения.

<p class="callout info">Каждая платформа приложения может иметь несколько разных версий</p>

[![Screenshot_26.jpg](https://devdocs.tpu.ru/uploads/images/gallery/2024-10/scaled-1680-/screenshot-26.jpg)](https://devdocs.tpu.ru/uploads/images/gallery/2024-10/screenshot-26.jpg)

В модальном окне заполните номер версии приложения, описание и статус.

<p class="callout info">Только *версия приложения* в статусе "Опубликовано" будет работать в API TPU</p>

  
![Screenshot_27.jpg](https://devdocs.tpu.ru/uploads/images/gallery/2024-10/scaled-1680-/screenshot-27.jpg)

После добавления версии приложения вы получите два ключа *публичный* и *приватный.* Вы их будете использовать при работе с методами API TPU.

[![Screenshot_28.jpg](https://devdocs.tpu.ru/uploads/images/gallery/2024-10/scaled-1680-/screenshot-28.jpg)](https://devdocs.tpu.ru/uploads/images/gallery/2024-10/screenshot-28.jpg)

# Расчет контрольной суммы

Для некоторых методов требуется указать дополнительный параметр безопасности sig. В интерфейсе вы сможете проверить алгоритм расчета этого параметра на сервере. Разработчику приложения нужно реализовать свой собственный метод для получения данного параметра.

[![Screenshot_29.jpg](https://devdocs.tpu.ru/uploads/images/gallery/2024-10/scaled-1680-/screenshot-29.jpg)](https://devdocs.tpu.ru/uploads/images/gallery/2024-10/screenshot-29.jpg)

> Список параметров, которые могут быть переданы через HTTP-Get запрос, игнорируемые при расчёте контрольной суммы. т.к. эти параметры системные и не могут влиять на работу.
> 
> 1. **sig**
> 2. **apikey**
> 3. **suppress\_response\_code**
> 4. **access\_token**

Пример на языке [PHP](https://www.php.net/)

```php
public function sig(array $arguments, $secret)
{
    ksort($arguments);
    $string = '';

    foreach ($arguments as $key => $value) {
        $string .= "$key=$value";
    }

    return md5($string . $secret);
}
```

Пример на языке [Java](https://www.java.com/ru/)

```java
import java.security.MessageDigest;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.security.NoSuchAlgorithmException;

public String sig(Map<String, String> arguments, String secret) throws NoSuchAlgorithmException {
    StringBuilder builder = new StringBuilder();

    List<String> keys = arguments.keySet().stream().sorted().collect(Collectors.toList());

    for(String key : keys) {
        builder.append(key).append("=").append(arguments.get(key));
    }

    builder.append(secret);
    byte[] digest = MessageDigest.getInstance("MD5").digest(builder.toString().getBytes());

    StringBuilder resultBuilder = new StringBuilder();

    for(byte b : digest) {
        resultBuilder.append(String.format("%02x", b));
    }

    return resultBuilder.toString();
}
```

Пример на языке [Scala](https://scala-lang.org/)

```scala
import java.security.MessageDigest
import scala.collection.immutable.ListMap

def sig(arguments: Map[String, String], secret: String): String = {
    MessageDigest.getInstance("MD5").digest {
        s"${ListMap(arguments.toSeq.sortBy({ case (key, value) => key }):_*).map({ case (key, value) => s"$key=$value" }).mkString}$secret".getBytes
    }.map(byte => String.format("%02x", byte)).mkString
}
```

Пример на языке [Python](https://www.python.org/)

```python
import collections
import hashlib

def sig(arguments, secret):
    ordered = collections.OrderedDict(sorted(arguments.items()))
    concated = "".join(list(map(lambda k,v: k + "=" + v, ordered.keys(), ordered.values()))) + secret
    return hashlib.md5(concated.encode()).hexdigest()
```