Make a payment

POST https://agwsapi.tarlanpayments.kz/showcase-gateway/api/v1/action/cash-in

Headers

NameValue

Content-Type

application/json

X-Signature

Body

NameTypeDescription

username*

String

User ID

amount*

Float

Transaction amount

agent*

String

Showcase code in Tarlan system

project*

String

Project Code assigned by Tarlan

service_code*

String

Service ID on the showcase side

external_id*

String

Unique payment identifier on the side of the storefront

datetime*

String

Time of payment initiation in the storefront system. ISO 8601 Current Timestamp format

Response

NameTypeDescription

status

bool

Request processing status

status_code

uint

Error code

message

string

Description of error

result

Object

The result of a query that contains information

-error_code

uint

Error code

-message

String

Error description

-data

Object

Information about data

--status_code

String

Transaction status code

--status_message

String

Description of transaction status

--username

String

User ID

--amount

Float

Amount credited

--datetime

String

Time of payment initiation in the storefront system. ISO 8601 Current Timestamp format

--project

String

Project Code assigned by Tarlan

--service_code

String

Service ID on the showcase side

--external_id

String

Payment ID on the showcase side

-additional_data

Object

Additional information returned depending on the service (Depending on the service, this field may vary)

{
    "status": true,
    "status_code": 0,
    "message": "Success",
    "result": {
        "error_code": 0,
        "message": "",
        "data": {
            "status_code": "2",
            "status_message": "Transaction successfully processed",
            "username": "12345",
            "amount": 1000,
            "datetime": "2024-01-01T00:00:00",
            "project": "project",
            "service_code": "service",
            "external_id": "200001"
        },
        "additional_data": {}
    }
}

Make Payment

package main

import (
	"bytes"
	"crypto/sha256"
	"encoding/base64"
	"encoding/hex"
	"encoding/json"
	"io/ioutil"
	"log"
	"net/http"
	"sort"
	"time"
)

// Response представляет ответ от сервера

// Body представляет структуру запроса
type Body struct {
	UserName    string  `json:"username"`
	Agent       string  `json:"agent"`
	Project     string  `json:"project"`
	ServiseCode string  `json:"service_code"`
	Amount      float64 `json:"amount"`
	ExternalID  string  `json:"external_id"`
	DateTime    string  `json:"datetime"`
}

// 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/action/cash-in"
	// Secret Проекта
	SecretKey := "v7JsYryRfhd4paMFPnHczU"

	// Тело запроса
	requestBody := Body{
		UserName:    "login",
		Agent:       "agent",
		Project:     "project",
		ServiseCode: "xbetTest",
		Amount:      10.01,
		ExternalID:  "reference_id",
		DateTime:    time.Now().Format(time.RFC3339),
	}

	// Генерация заголовка
	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)
	}
}

Last updated