Skip to content

XaznaPass

XaznaPass — приём оплаты по одноразовому коду, который пользователь показывает в приложении Xazna. Мерчант передаёт этот код в API, а Xazna списывает сумму с карты пользователя. Тело каждого запроса шифруется алгоритмом RSA и передаётся в поле data.

Основные требования

Данные мерчанта

После регистрации поставщик услуг получает следующие данные для подключения и отправки запросов к API:

#ParameterData typeDescription
1merchantIdUUIDТорговый ID мерчанта, передаётся в открытом виде
2secretKeyStringКлюч, которым шифруется тело запроса
3usernameStringЛогин для basic-авторизации
4passwordStringПароль для basic-авторизации

Ключ мерчанта

Параметр secretKey является конфиденциальным, и поставщик услуг несёт полную ответственность за его безопасность. Разглашение ключа может привести к утечке ваших данных.

Аутентификация и заголовки

Запросы отправляются с basic-авторизацией — заголовок Auth: Basic. Параметр timestamp — UNIX timestamp (10 цифр, секунды с начала эпохи).

#HeaderValue
1Acceptapplication/json
2AuthorizationBasic — username и password, выданные при регистрации
3Content-Typeapplication/json

Шифрование данных

  • Во всех методах данные запроса шифруются с использованием алгоритма RSA.
  • Данные (json) шифруются ранее предоставленным secretKey и отправляются в формате Base64.
  • Размер шифруемых данных не должен превышать 350 байт.

Результат шифрования передаётся в поле data. Открытым текстом передаётся только merchantId — по нему Xazna выбирает ключ для расшифровки.

Формат ответа

Все методы возвращают один и тот же конверт: полезная нагрузка лежит в data, результат обработки — в code.

#ParameterData typeDescription
1dataObjectДанные транзакции
2errorMessageStringОписание ошибки
3codeIntegerКод обработки, см. справочник кодов
4timestampLongВременная метка

Поля data

#ParameterData typeDescription
1merchantIdUUIDТорговый ID мерчанта
2paymentIdUUIDXazna транзакция ID
3paymentStatusStringСтатус оплаты: SUCCESS, ERROR, PENDING, REVERSED
4amountLongСумма в тийинах. 100000 = 1000.00 сум
5paymentTimeStringВремя оплаты (yyyy-mm-dd hh:mm:ss)
6messageStringОписание транзакции
7cardTypeStringТип карты
8cardNumberStringМаскированный номер карты
9phoneStringНомер телефона

Статусы платежа

StatusDescription
SUCCESSПлатёж проведён
PENDINGПлатёж в обработке — статус нужно перепроверить
ERRORПлатёж не прошёл, причина — в code и errorMessage
REVERSEDПлатёж отменён

Оплата

Списывает сумму с пользователя по одноразовому коду otpData, который он показал в приложении.

json
POST {base_url}/api/v1/qr-pass/payment
Accept: application/json
Content-Type: application/json
Auth: Basic

{
  "merchantId": "string",
  "data": "your_hashing_data"
}

// your_hashing_data — значение, зашифрованное алгоритмом RSA

Параметры запроса

#ParameterData typeDescription
1merchantIdUUIDТорговый ID мерчанта
2dataStringЗашифрованное значение на основе алгоритма RSA

Шифруемые данные

json
{
  "otpData": "70704778812456456092",
  "amount": 100000, // 1000.00 сум
  "transactionId": "123"
}
#ParameterData typeDescription
1otpDataStringОдноразовый код для оплаты
2amountLongСумма в тийинах. 100000 = 1000.00 сум
3transactionIdStringТранзакция ID мерчанта

Пример ответа

json
{
  "data": {
    "merchantId": "string",
    "paymentId": "string",
    "paymentStatus": "SUCCESS",
    "amount": 100000,
    "paymentTime": "2025-08-01 14:22:02",
    "cardType": "HUMO",
    "cardNumber": "****3445",
    "phone": "998911234567",
    "message": "Успешная транзакция"
  },
  "errorMessage": "",
  "code": 0,
  "timestamp": 1754040127141
}

Сохраняйте paymentId

Идентификатор paymentId из ответа нужен для проверки статуса, отмены платежа и привязки фискального чека. Сохраняйте его вместе со своим transactionId.

Проверка статуса платежа по Xazna

Возвращает текущий статус платежа по идентификатору транзакции Xazna (paymentId).

json
POST {base_url}/api/v1/qr-pass/check/xazna
Accept: application/json
Content-Type: application/json
Auth: Basic

{
  "merchantId": "string",
  "data": "your_hashing_data"
}

// your_hashing_data — значение, зашифрованное алгоритмом RSA

Шифруемые данные

json
{
  "paymentId": "string"
}
#ParameterData typeDescription
1paymentIdUUIDXazna транзакция ID

Пример ответа

json
{
  "data": {
    "merchantId": "string",
    "paymentId": "string",
    "paymentStatus": "PENDING",
    "amount": 100000,
    "paymentTime": "2025-08-01 14:22:02",
    "cardType": "HUMO",
    "cardNumber": "****3445",
    "phone": "998911234567",
    "message": "Транзакция в ожидании"
  },
  "errorMessage": "",
  "code": 0,
  "timestamp": 1754040127141
}

Проверка статуса платежа по мерчанту

То же самое, но поиск ведётся по идентификатору транзакции мерчанта — тому transactionId, который был передан при оплате.

json
POST {base_url}/api/v1/qr-pass/check/merchant
Accept: application/json
Content-Type: application/json
Auth: Basic

{
  "merchantId": "string",
  "data": "your_hashing_data"
}

// your_hashing_data — значение, зашифрованное алгоритмом RSA

Шифруемые данные

json
{
  "paymentId": "string"
}
#ParameterData typeDescription
1paymentIdUUIDТранзакция ID мерчанта

Имя поля

В этом методе поле называется paymentId, но передаётся в нём идентификатор транзакции мерчанта, а не Xazna.

Пример ответа

json
{
  "data": {
    "merchantId": "string",
    "paymentId": "string",
    "paymentStatus": "PENDING",
    "amount": 100000,
    "paymentTime": "2025-08-01 14:22:02",
    "cardType": "HUMO",
    "cardNumber": "****3445",
    "phone": "998911234567",
    "message": "Транзакция в ожидании"
  },
  "errorMessage": "",
  "code": 0,
  "timestamp": 1754040127141
}

Отмена платежа

Возвращает средства пользователю. После успешной отмены статус платежа становится REVERSED.

json
POST {base_url}/api/v1/qr-pass/reverse
Accept: application/json
Content-Type: application/json
Auth: Basic

{
  "merchantId": "string",
  "data": "your_hashing_data"
}

// your_hashing_data — значение, зашифрованное алгоритмом RSA

Шифруемые данные

json
{
  "paymentId": "string"
}
#ParameterData typeDescription
1paymentIdUUIDXazna транзакция ID

Пример ответа

json
{
  "data": {
    "merchantId": "string",
    "paymentId": "string",
    "paymentStatus": "REVERSED",
    "amount": 100000,
    "paymentTime": "2025-08-01 14:22:02",
    "cardType": "HUMO",
    "cardNumber": "****3445",
    "phone": "998911234567",
    "message": "Транзакция отменена"
  },
  "errorMessage": "",
  "code": 0,
  "timestamp": 1754040127141
}

Привязка фискализированных данных

Привязывает ссылку на фискальный чек к уже проведённому платежу.

Адрес метода

В исходной документации XaznaPass (версия 1.0) URL этого метода не указан — уточните его у менеджера Xazna перед интеграцией. Формат тела запроса и ответа приведён ниже.

json
Accept: application/json
Content-Type: application/json
Auth: Basic

{
  "merchantId": "string",
  "data": "your_hashing_data"
}

// your_hashing_data — значение, зашифрованное алгоритмом RSA

Параметры запроса

#ParameterData typeDescription
1merchantIdUUIDТорговый ID мерчанта
2dataStringЗашифрованное значение на основе алгоритма RSA

Шифруемые данные

json
{
  "paymentId": "string",
  "qrUrl": ""
}
#ParameterData typeDescription
1paymentIdUUIDXazna транзакция ID
2qrUrlStringСсылка на фискальный чек

Пример ответа

json
{
  "data": {
    "message": "Успешно"
  },
  "errorMessage": "",
  "code": 0,
  "timestamp": 1769422251103
}
#ParameterData typeDescription
1messageStringОписание результата
2errorMessageStringОписание ошибки
3codeIntegerКод обработки, см. справочник кодов
4timestampLongВременная метка

Справочник кодов

Значение поля code в ответе:

#КодСообщение
10Успешная транзакция
2-1Срок действия QR-кода истёк
3-2Пользователь не найден
4-3Карта не найдена
5-4Сервис не найден
6-5Сервис неактивен
7-6Тип операции не найден
8-7Некорректная сумма
9-8Ошибка при проведении транзакции
10-9Операция не найдена
11-10Статус операции неактивен
12-11Ошибка при отмене
13-12Ошибка. Отсутствуют параметры
14-13Ошибка декодирования данных
15-14Ошибка подключения
16999Системная ошибка

АК «Халқ банки» — платежная система Xazna