Copy package main
import (
"bytes"
"crypto/sha256"
"encoding/base64"
"encoding/hex"
"encoding/json"
"io/ioutil"
"log"
"net/http"
"sort"
)
// Response представляет ответ от сервера
// Body представляет структуру запроса
type Body struct {
Agent string `json:"agent"`
UserName string `json:"username"`
Project string `json:"project"`
ServiseCode string `json:"service_code"`
}
// MakeSign генерирует подпись для HTTP-запроса
func MakeSign (body Body , secretKey string ) ( string , error ) {
// Конвертируем структуру в map для сортировки
dataMap := make ( map [ string ] interface {})
jsonData, _ := json.Marshal(body)
json.Unmarshal(jsonData, & dataMap)
// Удаляем "additional_data", если нужно
delete (dataMap, "additional_data" )
// Сортируем ключи по алфавиту
keys := make ([] string , 0 , len (dataMap))
for key := range dataMap {
keys = append (keys, key)
}
sort.Strings(keys)
// Создаем отсортированный JSON
sortedData := make ( map [ string ] interface {})
for _, key := range keys {
sortedData[key] = dataMap[key]
}
// Преобразуем отсортированные данные в JSON
sortedJson, err := json.Marshal(sortedData)
if err != nil {
return "" , err
}
// Кодируем JSON в base64
base64EncodedData := base64.StdEncoding.EncodeToString(sortedJson)
// Конкатенируем base64-данные с секретом
dataToSign := base64EncodedData + secretKey
// Хешируем SHA-256
sha256Hash := sha256.Sum256([] byte (dataToSign))
sign := hex.EncodeToString(sha256Hash[:])
return sign, nil
}
// CheckLogin отправляет POST-запрос и обрабатывает ответ
func CheckLogin (body Body , url, signature string ) ( string , error ) {
// Конвертируем структуру в JSON для отправки
jsonData, err := json.Marshal(body)
if err != nil {
return "" , err
}
// Создаем и отправляем POST-запрос
req, err := http.NewRequest( "POST" , url, bytes.NewBuffer(jsonData))
if err != nil {
return "" , err
}
// Устанавливаем подпись запроса
req.Header.Set( "X-Signature" , signature)
req.Header.Set( "Content-Type" , "application/json" )
client := & http . Client {}
resp, err := client.Do(req)
if err != nil {
return "" , err
}
defer resp.Body.Close()
// Чтение и обработка ответа
bodyBytes, err := ioutil.ReadAll(resp.Body)
if err != nil {
return "" , err
}
response := string (bodyBytes)
// Вывод ответа и результата
return response, nil
}
func main () {
// URL Запроса
RequestURL := "https://agwsapi.tarlanpayments.kz/showcase-gateway/api/v1/user/check"
// Secret Проекта
SecretKey := "12345"
// Тело запроса
requestBody := Body {
Agent: "agent" ,
UserName: "login" ,
Project: "project" ,
ServiseCode: "servise" ,
}
// Генерация заголовка
sign, err := MakeSign(requestBody, SecretKey)
if err != nil {
log.Println( "Error generating signature:" , err)
return
}
// Отправка запроса
Response, err := CheckLogin(requestBody, RequestURL, sign)
if err != nil {
log.Panic( "Error sending request" , err)
return
}
if Response != "" {
log.Println(Response)
}
}