# Проверка статуса пополнения

{% hint style="danger" %}
**ВНИМАНИЕ: Новый формат ответа для ошибок**

В ближайшее время в нашей системе ошибки будут разделены на **ожидаемые** и **неожидаемые**. Это приведет к изменению формата JSON-ответа в зависимости от типа ошибки. Пожалуйста, ознакомьтесь с изменениями на странице [**Коды Ошибок**](/agws/kody-oshibok.md). Изменения будут применены ко всем API в системе AGWS, за исключением методов «[Проведение платежа](/agws/provedenie-platezha.md)».

Нажмите [здесь](#primery-otvetov-ob-oshibkakh-do-vneseniya-izmenenii), чтобы просмотреть старые и новые ответы об ошибках JSON. Обратите внимание на это обновление и убедитесь, что ваша система готова к изменениям, если это необходимо.
{% endhint %}

<mark style="color:green;">`POST`</mark> `https://agwsapi.tarlanpayments.kz/showcase-gateway/api/v1/action/status`

**Headers**

| Name         | Value                                                             |
| ------------ | ----------------------------------------------------------------- |
| Content-Type | `application/json`                                                |
| X-Signature  | [Авторизационный хэш](/platezhnyi-shlyuz/formirovanie-podpisi.md) |

**Body**

<table><thead><tr><th width="215">Name</th><th width="89">Type</th><th>Description</th></tr></thead><tbody><tr><td>agent<mark style="color:red;">*</mark></td><td>String</td><td>Код витрины в системе Tarlanpayments</td></tr><tr><td>project<mark style="color:red;">*</mark></td><td>String</td><td>Код Проекта присваиваемый Tarlanpayments</td></tr><tr><td>service_code<mark style="color:red;">*</mark></td><td>String</td><td>Идентификатор услуги на стороне витрины</td></tr><tr><td>external_id<mark style="color:red;">*</mark></td><td>String</td><td>Идентификатор платежа на стороне витрины</td></tr></tbody></table>

**Response**

<table><thead><tr><th width="193">Name</th><th width="111">Type</th><th>Description</th></tr></thead><tbody><tr><td>status</td><td>bool</td><td>Статус обработки запроса</td></tr><tr><td>status_code</td><td>uint</td><td>Код ошибки</td></tr><tr><td>message</td><td>string</td><td>Описание ошибки</td></tr><tr><td>result</td><td>Object</td><td>Результат запроса, в котором содержится информация</td></tr><tr><td>-error_code</td><td>uint</td><td>Код ошибки</td></tr><tr><td>-message</td><td>String</td><td>Описание ошибки</td></tr><tr><td>-data</td><td>Object</td><td>Информация о данных</td></tr><tr><td>--status_code</td><td>String</td><td>Код статуса транзакции</td></tr><tr><td>--status_message</td><td>String</td><td>Описание статуса транзакции</td></tr><tr><td>--username</td><td>String</td><td>Идентификатор пользователя</td></tr><tr><td>--amount</td><td>Float</td><td>Зачисленная сумма </td></tr><tr><td>--fail_reason</td><td>Object</td><td>Поле содержащее причину неуспеха</td></tr><tr><td>--datetime</td><td>String</td><td>Время инициации платежа в системе витрины.Формат ISO 8601 Current Timestamp</td></tr><tr><td>--project</td><td>String</td><td>Код Проекта присваиваемый Tarlan-ом</td></tr><tr><td>--service_code</td><td>String</td><td>Идентификатор услуги на стороне витрины</td></tr><tr><td>--external_id</td><td>String</td><td>Идентификатор платежа на стороне витрины</td></tr></tbody></table>

{% tabs %}
{% tab title="200: OK Пример успешного ответа" %}

```json
{    
    "status": true,
    "status_code": 0,
    "message": "Success",
    "result":{
        "error_code" : 0,
        "message": "",
        "data": {
            "status_code": "4",
            "status_message": "Transaction was failed",
            "username": "989898",
            "amount": 100,
            "datetime": "2022-12-01T15:45:00Z",
            "project": "mobile",
            "service_code": "201106",
            "external_id": "200001",
        },
        "fail_reason": {
            "code": 100,
            "message": "Unknown reason, clarification required"
        }
}
```

{% endtab %}
{% endtabs %}

#### Примеры ответов об ошибках *до* внесения изменений

{% tabs %}
{% tab title="404 Not Found" %}

<pre class="language-json"><code class="lang-json"><strong>{
</strong>    "status": false,
    "status_code": 1041,
    "message": "Order not found",
    "result": {}
}
</code></pre>

{% endtab %}

{% tab title="400 Bad Request" %}

```json
{
    "status": false,
    "status_code": 1014,
    "message": "Invalid signature",
    "result": {}
}
```

{% endtab %}
{% endtabs %}

#### Примеры ответов об ошибках *после* внесения изменений

{% tabs %}
{% tab title="200: OK Ожидаемая ошибка" %}

<pre class="language-json"><code class="lang-json"><strong>{
</strong>    "status": true,
    "status_code": 0,
    "message": "Success",
    "result": {
        "error_code" : 1041,
        "message": "Order not found",
        "data": null
    }
}
</code></pre>

{% endtab %}

{% tab title="400 Bad Request: Неожидаемая ошибка" %}

```json
{
    "status": false,
    "status_code": 1014,
    "message": "Invalid signature",
    "result": {}
}
```

{% endtab %}
{% endtabs %}

Проверка статуса пополнения

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

```go
package main

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

const (
	// agent - код витрины на стороне Tarlan
	agent = "agent"
	// serviceCode - идентификатор услуги витрины
	serviceCode = "service"
	// project - код проекта на стороне Tarlan
	project = "project"
	// url - URL для отправки запроса
	url = "https://agwsapi.tarlanpayments.kz/showcase-gateway/api/v1/action/status"
	// secret -secret проекта
	secret = "12345"
)

// Response представляет тело ответа от сервера
type Response struct {
	Status     bool   `json:"status"`
	StatusCode uint32 `json:"status_code"`
	Message    string `json:"message"`
	Result     Result `json:"result"`
}

type Result struct {
	ErrorCode      uint32                 `json:"error_code"`
	Message        string                 `json:"message"`
	Data           Data                   `json:"data"`
}

type Data struct {
	StatusCode    string    `json:"status_code"`
	StatusMessage string    `json:"status_message"`
	Username      string    `json:"username"`
	Amount        float64   `json:"amount"`
	Datetime      time.Time `json:"datetime"`
	Project       string    `json:"project"`
	ServiceCode   string    `json:"service_code"`
	ExternalID    string    `json:"external_id"`
}

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

// MakeSign генерирует подпись для HTTP-запроса
func MakeSign(body Body, secretKey string) (string, error) {
	// Конвертируем структуру в map для сортировки
	dataMap := make(map[string]interface{})
	jsonData, _ := json.Marshal(body)
	err := json.Unmarshal(jsonData, &dataMap)
	if err != nil {
		return "", err
	}

	// Сортируем ключи по алфавиту
	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
}

// CheckStatus отправляет POST-запрос и обрабатывает ответ
func CheckStatus(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
	}
	jsonResponse := string(bodyBytes)

	// Структура для парсинга ответа
	var response Response
	err = json.Unmarshal([]byte(jsonResponse), &response)
	if err != nil {
		return "", err
	}

	log.Printf("Status-%v, %v", resp.StatusCode, jsonResponse)

	// Определение поля message
	var message string

	// Извлечение ответа
	if resp.StatusCode == http.StatusOK {
	if response.StatusCode == 0 && response.Result.ErrorCode == 0 {
	message = response.Result.Data.StatusMessage + ", reference " + response.Result.Data.ExternalID
	} else {
	message = response.Result.Message
	}
	} else {
	message = response.Message
	}

	// Вывод ответа и результата
	return message, nil
}

func main() {
	// URL Запроса
	RequestURL := url
	// Secret Проекта
	SecretKey := secret
	// externalID - номер заказа
	var externalID string = "reference"

	// Тело запроса
	requestBody := Body{
		Agent:       agent,
		Project:     project,
		ServiseCode: serviceCode,
		ExternalID:  externalID,
	}

	// Генерация заголовка
	sign, err := MakeSign(requestBody, SecretKey)
	if err != nil {
		log.Println("Error generating signature:", err)
		return
	}

	// Отправка запроса
	Message, err := CheckStatus(requestBody, RequestURL, sign)
	if err != nil {
		log.Panic("Error sending request", err)
		return
	}

	// Вывод message из лога
	if Message != "" {
		log.Println(Message)

	}
}

```

{% endtab %}
{% endtabs %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.tarlanpayments.kz/agws/proverka-statusa-popolneniya.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
