# Формирование подписи

Запросы для взаимодействия с сервисом подписываются с использованием алгоритма SHA256.

Подпись формируется отдельно для каждого запроса.

Для формирования подписи, выполните следующие шаги:

1. **Тело запроса сортируется по алфавиту и кодируется в BASE64.**
2. **Конкатенируем кодированное тело запроса и secret\_key(предоставляется отдельно)**
3. **Используя хэш функцию SHA256 хэшируем полученный результат конкатенации**
4. **Добавляем подпись в заголовках запроса X-Signature**

{% hint style="warning" %}
В формировании подписи не учавствуют ключи имеющие вложенную структуру:

* info
  {% endhint %}

Поля запроса заполненные как <mark style="color:green;">**""**</mark> не участвуют в формировании подписи./

{% tabs %}
{% tab title="Python3" %}

```python
import json
import base64
import hashlib
#Тело запроса меняется в зависимости от запроса

request_data = {
  "agent": "tarlan",
  "project": "mobile",
  "service_code": "101",
}
#Для примера взяли secret 12345
secret = "12345"

sorted_data = json.dumps(
      request_data,
      sort_keys=True,
      ensure_ascii=False,
      separators=(',', ':'),
  )


base64_encoded_data = base64.b64encode(sorted_data.encode()).decode()

data_to_sign = base64_encoded_data + secret

sha256_hash = hashlib.sha256(data_to_sign.encode()).hexdigest()

print("Sign:",sha256_hash)
```

{% endtab %}

{% tab title="Golang" %}

```go
package main

import (
  "crypto/sha256"
  "encoding/base64"
  "encoding/json"
  "fmt"
) 
//Тело запроса меняется в зависимости от запроса

type Request struct {
  Agent       string `json:"agent"`
  Project     string `json:"project"`
  ServiceCode string `json:"service_code"`
}
//Для примера secret 12345
const secret = "12345"

func main() {
  request := Request{
      Agent:       "tarlan",
      Project:     "mobile",
      ServiceCode: "101",
  }

  notSortedJson, err := json.Marshal(&request)
  if err != nil {
      panic(err)
  }

  var notSortedMap map[string]interface{}

  if err = json.Unmarshal(notSortedJson, &notSortedMap); err != nil {
      panic(err)
  }

  sortedJson, err := json.Marshal(&notSortedMap)
  if err != nil {
      panic(err)
  }

  signData := base64.StdEncoding.EncodeToString(sortedJson)

  sign := sha256.Sum256([]byte(signData + secret))
fmt.Printf("Sign: %x", sign)
}
```

{% endtab %}
{% endtabs %}
