Tarlanpayments
Eng
Eng
  • Acquiring
    • General information
      • Structure of payment processing
      • Kinds of operations
      • 3D-Secure
      • PCI DSS
    • Types of transactions
    • Structure of system responses
    • Error code
    • Transaction statuses
    • Signature Creation
    • Additional parameters
    • Interaction with the payment method
      • Initiating funds receipts
      • Initiating pay out
      • Card link
      • Initiating funds using Apple Pay
      • Initiating funds using Google Pay
      • Iframe
    • Payments without form of payment
      • One click
    • Smart Pay
      • Google pay
    • Supplementary methods
      • Removal of a linked user card
      • Verification of transaction status
      • Receiving a list of cards
      • Refund
      • Upper fee calculation
    • Webhook of the payment system
      • Payment Status
      • Payment ready to be made
    • Tilda Publishing
    • Edit summary
  • AGWS
    • Account Status Codes Guide
    • Error Codes
    • Reason for operation rejection
    • Transaction Lifetime
    • Transaction Status Guide
    • Creating a Signature
    • Check account status
    • Make a payment
    • Checking the refill status
    • Checking the remaining balance on the account
    • Confirmation of funds debit
    • Creating a payment link
    • Showcase Flow
    • Service Provider Flow
    • Payment System Callback
    • Payment Processing Scheme
  • Receiving a fiscal receipt
  • Calculation of the upper commission
Powered by GitBook
On this page
  1. AGWS

Checking the refill status

Last updated 18 days ago

ATTENTION: New Error Response Format In the near future, errors in our system will be classified as expected and unexpected. Depending on the type of error, the format of the JSON response will be changed. Please review the new formats on the page. This change will be applied to all APIs in the AGWS system except '''.

Click to view the old and new JSON error responses. Please take note of this update and ensure your system is ready for these changes, if necessary.

POSThttps://agwsapi.tarlanpayments.kz/showcase-gateway/api/v1/action/status

Headers

Name
Value

Content-Type

application/json

X-Signature

Body

Name
Type
Description

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

Payment ID on the showcase side

Response

Name
Type
Description

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

--fail_reason

Object

---code

Int

Rejection Reason Code

---message

String

Description of the Operation Rejection Reason

--external_id

String

Payment ID on the showcase side

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

Examples of error responses before the changes

{
    "status": false,
    "status_code": 1041,
    "message": "Order not found",
    "result": {}
}
{
    "status": false,
    "status_code": 1014,
    "message": "Invalid signature",
    "result": {}
}

Examples of error responses after the changes

{
    "status": true,
    "status_code": 0,
    "message": "Success",
    "result": {
        "error_code" : 1041,
        "message": "Order not found",
        "data": null
    }
}
{
    "status": false,
    "status_code": 1014,
    "message": "Invalid signature",
    "result": {}
}

Checking the refill status

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"`
	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)
	json.Unmarshal(jsonData, &dataMap)

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

// CheckCashStatus отправляет POST-запрос и обрабатывает ответ
func CheckCashStatus(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/status"
	// Secret Проекта
	SecretKey := "12345"

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

	// Генерация заголовка
	sign, err := MakeSign(requestBody, SecretKey)
	if err != nil {
		log.Println("Error generating signature:", err)
		return
	}
	// Отправка запроса
	Response, err := CheckCashStatus(requestBody, RequestURL, sign)
	if err != nil {
		log.Panic("Error sending request", err)
		return
	}

	if Response != "" {
		log.Println(Response)
	}
}

Field Containing the

Error Codes
Make a payment
here
Authorization hash
Failure Reason