# Общая информация

**Платежный шлюз** представляет собой программное решение, которое обеспечивает интеграцию между платежным шлюзом и вашим приложением или веб-сайтом. Данный документ описывает подробности методов, необходимых для взаимодействия с платежным шлюзом.

***

## **Термины и сокращения**

&#x20;**API: Application Programming Interface** — набор готовых методов, предоставляемых приложением (системой) для использования во внешних программных продуктах.

**REST: Representational State Transfer** — архитектурный стиль взаимодействия компонентов распределенного приложения в сети.

**JSON: JavaScript Object Notation** — текстовый формат обмена данными, основанный на JavaScript RFC 7159.

**3DS: 3-D Secure** — протокол защиты карточных данных, используемый для аутентификации держателя банковской карты во время совершения платежной операции через интернет. Tarlan Payments поддерживает как версию 3DS 1.0, так и версию 3DS 2.0 протокола.

**ТСП, Мерчант** — Торгово-сервисное предприятие, работающее с системой.

**Проект —** дочерняя сущность партнёра (мерчанта). Позволяет мерчанту разграничивать юридические лица, терминалы, а также, отчёты.

**Мерчант (партнёр) —** юридическое лицо, которое имеет возможность получать денежные средства за осуществление услуг, продажи товаров и так далее. Также является агрегирующей сущностью проектов.

**Секретный ключ** — Символьная строка для авторизации проекта используемая для его идентификации.&#x20;

**Платежный токен** — Символьная строка, созданная по данным карты, для безакцептных платежей.

***

### Этапы имплементации

1. Оставьте заявку на подключение на сайте[ tarlanpayments.kz](https://tarlanpayments.kz/)

   *После обработки заявки менеджер Службы поддержки обсудит с вами возможные варианты подключения, запросит необходимые документы, запустит процесс интеграции с банками, договор, создание терминала.*
2. Получите доступ к личному кабинету.\
   *При подключении к Протоколу приема платежей вы получаете уникальный идентификатор мерчанта и доступ в Личный кабинет. Параметры доступа отправляются на указанный при регистрации e-mail.*
3. Выпустите ключ доступа к API.

   *Ключ доступа к API используется для взаимодействия с API. Получите ключ API у аккаунт-менеджера.*
4. Протестируйте взаимодействие.\
   *При подключении ваш идентификатор находится в тестовом режиме. В этом режиме вы можете проводить операции без списания средств с банковской карты.*

Когда интеграция на вашей стороне закончена, мы переводим ваш идентификатор project\_id в производственный режим.

***Внимание!** В производственном режиме выполняются **реальные списания средств с карт.***

### Обратная связь

Вопросы и предложения можно отправлять по адресу:

&#x20;[support@tarlanpayments.kz](mailto:support@onevision.kz)

&#x20;А также,  по реквизитам указанным в разделе "Контакты" на официальном [сайте ](https://tarlanpayments.kz)


# Процесс одностадийного платежа&#x20;

#### Шаги проведения платежа

1. Клиент Партнера делает запрос на создание платежа в проекте Мерчанта
2. Проект отправляет запрос на создание транзакции&#x20;
3. Проект получает URL страницы платежа&#x20;
4. Проект перенаправляет клиента на страницу платежа
5. Клиент вводит данные карты и нажимает "Оплатить"
6. Платежная система получает запрос, если при создании транзакции был указан параметр [confirm\_url](/platezhnyi-shlyuz/webhook-platezhnoi-sistemy/gotovnost-provedeniya-oplaty), платежная система делает запрос в проект Мерчанта
7. Проект отвечает по адресу указанному в параметре [confirm\_url](/platezhnyi-shlyuz/webhook-platezhnoi-sistemy/gotovnost-provedeniya-oplaty). В случае, если проект отвечает http-кодом, отличным от "200", транзакция прерывается
8. Платежная система отправляет запрос в банк&#x20;
9. Платежная система получает ответ от банка со статусом транзакции&#x20;
10. Платежная система выводит чек на странице платежа&#x20;
11. Платежная система отправляет статус транзакции в проект на адрес указанный в параметре [callback\_url](/platezhnyi-shlyuz/webhook-platezhnoi-sistemy/status-oplaty)&#x20;

#### UML-диаграмма проведения платежа&#x20;

<img src="/files/QR0i73MAuNbsjJzFFKf5" alt="" class="gitbook-drawing">


# Процесс двухстадийного платежа

#### Шаги проведения платежа

1. Клиент Партнера делает запрос на создание платежа в проекте Мерчанта с указанием параметра is\_hold = true
2. Проект отправляет запрос на создание транзакции&#x20;
3. Проект получает URL страницы платежа&#x20;
4. Проект перенаправляет клиента на страницу платежа
5. Клиент вводит данные карты и нажимает "Оплатить"
6. Платежная система получает запрос, если при создании транзакции был указан параметр [confirm\_url](/platezhnyi-shlyuz/webhook-platezhnoi-sistemy/gotovnost-provedeniya-oplaty), платежная система делает запрос в проект Мерчанта
7. Проект отвечает по адресу указанному в параметре [confirm\_url](/platezhnyi-shlyuz/webhook-platezhnoi-sistemy/gotovnost-provedeniya-oplaty). В случае, если проект отвечает http-кодом, отличным от "200", транзакция прерывается
8. Платежная система отправляет запрос в банк на блокирование средств
9. Платежная система получает ответ от банка со статусом транзакции&#x20;
10. Платежная система выводит чек на странице платежа&#x20;
11. Платежная система отправляет статус транзакции в проект на адрес указанный в параметре [callback\_url](/platezhnyi-shlyuz/webhook-platezhnoi-sistemy/status-oplaty)&#x20;
12. Проект Мерчанта может [подтвердить](/platezhnyi-shlyuz/vspomogatelnye-metody/podtverzhdenie-spisaniya-sredstv) или [отменить](/platezhnyi-shlyuz/vspomogatelnye-metody/otmena-spisaniya-sredstv) списание средств используя API или ЛК
13. &#x20;Платежная система отправляет запрос в банк на списание или отмену блокировки средств

{% hint style="warning" %}
По истечению определенного количества времени будет выполнено автоматическое списание денежных средств, настройка данного периода выполняется в ЛК и может быть от 3 до 13 дней включительно &#x20;
{% endhint %}

{% hint style="info" %}
Доступно списание или отмена всех заблокированных средств
{% endhint %}

#### UML-диаграмма проведения платежа&#x20;

<img src="/files/QR0i73MAuNbsjJzFFKf5" alt="" class="gitbook-drawing">


# Виды операций

**Приём (pay in)** — Операция по оплате товаров/услуг, совершенная через Интернет с использованием банковских карт. При оплате денежные средства перечисляются со счета держателя платежной карты в пользу Партнёра.

**Вывод (pay out)** — При выводе денежные средства перечисляются со счета Партнёра на карточный счёт клиента Партнёра

**Возврат (refund)** - Возврат денежных средств. Доступен только после успешного приёма денежных средств.

***

**Двухстадийный платёж (pay in)** - Операция по оплате товаров/услуг, совершенная через Интернет с использованием банковских карт требующая дополнительного подтверждения. Двухстадийный механизм работы позволяет разделить процесс проверки платежеспособности банковской карты (авторизация) и снятие денег (финансовое подтверждение). На первой стадии двухстадийного платежа происходит блокирование средств на счету держателя карты, а на второй списание.&#x20;

* **Списание** - Операция доступная только при двухстадийном платеже после авторизации денежных средств. Возможно как полное, так и частичное списание заблокированной суммы.
* **Отмена** - Операция доступная только при двухстадийном платеже после авторизации денежных средств. Возможно как полное, так и частичное списание заблокированной суммы.

***

**Привязка карты (card link)** - Операция при которой происходит фиксированное списание денежных средств с банковской карты (pay in) и дальнейшем возвратом денежных средств на карту (refund).

**Безакцептный приём (one click pay in) -** Операция приёма денежных средств с использованием сохранённой карты в платёжной системе без ввода карточных данных и без [3DS аутентификации](/platezhnyi-shlyuz/welcom/3d-secure)

**Безакцептный вывод (one click pay out) -** Операция вывода денежных средств с использованием сохранённой карты в платёжной системе без ввода карточных данных.


# 3D-Secure

**3-D Secure** — протокол, используемый как дополнительный уровень безопасности онлайн-кредитных и дебетовых карт, для двухфакторной аутентификации пользователя.

Цель - проверка подлинности держателя и защита от несанкционированного использования карты.

Как это работает: владелец карты указывает реквизиты карты, далее открывается сайт эмитента, где держателю предлагается ввести пароль или секретный код.

В большинстве случаев, код отправляется в СМС-сообщении. Если код указан правильно, оплата будет проведена. Если нет — отклонена.


# PCI DSS

**PCI DSS** — стандарт информационной безопасности, принятый в индустрии платежных карт Visa и Mastercard. Соблюдать требования стандарта обязаны все компании, которые принимают карты к оплате. Некоторым компаниям необходимо подтверждать свое соответствие.

Соблюдение стандартов безопасности

Основным принципом, на который ориентирован данный стандарт, является стремление максимально ограничить доступ к данным, связанным с платежными картами.

Считается, что наилучшим решением будет вообще избегать обработки таких данных и, вместо этого, обращаться к сертифицированным провайдерам для приема платежей. Практически это означает, что мы не должны запрашивать и не должны передавать номера карт. В случае, если клиент пытается сообщить номер карты, например, во время звонка с проблемой платежа, наша задача - немедленно прервать эту попытку и объяснить, почему мы не можем принимать такие данные.

Если данные поступают по электронной почте или через мессенджеры, мы должны удалить их и предупредить отправителя о рисках передачи данных карты.

Под охраняемыми данными мы понимаем:

* Полный номер карты
* Код CVV2/CVC2 (три цифры, расположенные на обратной стороне карты).
* Имена владельцев карты
* Срок действия

Маскированные номера карты (первые 6 и последние 4 цифры) не требуют такой же строгой защиты в соответствии с требованиями стандарта и могут использоваться в разумных пределах.

Tarlan Payments ежегодно проходит данную сертификацию и соответствует всем требованиям PCI DSS

<div align="left"><figure><img src="/files/x47gZEK8LfZioEznQVFe" alt=""><figcaption></figcaption></figure></div>


# Типы транзакций

<table data-full-width="true"><thead><tr><th width="205" align="center">код</th><th align="center">описание</th></tr></thead><tbody><tr><td align="center">in</td><td align="center">Списание средств с карты пользователя</td></tr><tr><td align="center">out</td><td align="center">Вывод денежных средств со счёта проекта на карту пользователя</td></tr><tr><td align="center">one_click_pay_in</td><td align="center">Списание средств по сохранённой карте пользователя</td></tr><tr><td align="center">one_click_pay_out</td><td align="center">Вывод средств со счёта проекта на сохранённую карту пользователя</td></tr><tr><td align="center">google_pay</td><td align="center">Оплата по средствам технологии Google Pay</td></tr><tr><td align="center">apple_pay</td><td align="center">Оплата по средствам технологии Apple Pay</td></tr><tr><td align="center">card_link</td><td align="center">Привязка карты пользователя в платёжной системе (используется для безакцептных платежей)</td></tr><tr><td align="center">two_stage_pay_in</td><td align="center">Двустадийное списание средств с карты пользователя  </td></tr></tbody></table>


# Структура ответов системы

Ответ на каждый запрос содержит в себе поля: `status`, `status_code`, `message`, `result`.

При успешной обработке запроса параметр `status` в ответе всегда равен `true`, а `status_code` равен `0`.

В других случаях, поле `status_code` отображает причину некорректной обработки запроса.

| наименование поля | тип данных |                    Описание                    |
| :---------------: | :--------: | :--------------------------------------------: |
|      `status`     |   `bool`   | Поле указывает на успешность обработки запроса |
|   `status_code`   |  `integer` |                   Код ошибки                   |
|     `message`     |  `string`  |         Текстовое описание кода ошибки         |
|      `result`     |  `object`  |        Результат запрашиваемого ресурса        |


# Коды ошибок

<table data-full-width="true"><thead><tr><th align="center">Код</th><th align="center">Текстовое сопровождение</th><th align="center">Описание</th><th align="center">HTTP status</th></tr></thead><tbody><tr><td align="center">1021</td><td align="center">request validation error</td><td align="center">Ошибка валидации полей запроса</td><td align="center">400</td></tr><tr><td align="center">5102</td><td align="center">undefined transaction type</td><td align="center">Неопределённый тип транзакции</td><td align="center">404</td></tr><tr><td align="center">8301</td><td align="center">unexpected db error</td><td align="center">Неопознанная ошибка при обработке ресурса</td><td align="center">500</td></tr><tr><td align="center">5400</td><td align="center">couldn't receive project data</td><td align="center">Возникла ошибка при получении данных по проекту</td><td align="center">500</td></tr><tr><td align="center">5406</td><td align="center">invalid project secret</td><td align="center">Некорректное формирование хэша</td><td align="center">400</td></tr><tr><td align="center">8008</td><td align="center">project doesn't exist</td><td align="center">Проект не найден</td><td align="center">404</td></tr><tr><td align="center">5000</td><td align="center">transaction already exists</td><td align="center">Транзакция уже была создана</td><td align="center">400</td></tr><tr><td align="center">5101</td><td align="center">undefined transaction status</td><td align="center">Неизвестный статус транзакции</td><td align="center">404</td></tr><tr><td align="center">5107</td><td align="center">transaction limit doesn't exist</td><td align="center">Не установлены лимиты для транзакции</td><td align="center">404</td></tr><tr><td align="center">5006</td><td align="center">transaction amount limit is over</td><td align="center">Превышен лимит по сумме транзакции</td><td align="center">400</td></tr><tr><td align="center">5003</td><td align="center">an error occurred while creating transaction</td><td align="center">Возникла ошибка при создании транзакции</td><td align="center">500</td></tr><tr><td align="center">5202</td><td align="center">request failed</td><td align="center">Ошибка при отправке запроса в адрес проекта</td><td align="center">500</td></tr><tr><td align="center">1022</td><td align="center">couldn't parse response body</td><td align="center">Получен некорректный ответ</td><td align="center">500</td></tr><tr><td align="center">5205</td><td align="center">unavailable project server</td><td align="center">Не доступен сервер мерчанта при проведении <a href="/pages/BzTqzCAAzNMownRWaLfz">запроса на подтверждение транзакции</a></td><td align="center">500</td></tr><tr><td align="center">3108</td><td align="center">card doesn't exist </td><td align="center">Карта не найдена </td><td align="center">500</td></tr><tr><td align="center">3010</td><td align="center">inoperable transaction status for this method</td><td align="center">Статус транзакции не позволяет сделать повторный возврат</td><td align="center">400</td></tr></tbody></table>

**Коды ошибок провайдера**&#x20;

Ошибки описывающие причину отклонения платежа, передаются при [статусе failed](/platezhnyi-shlyuz/statusy-tranzakcii)\
Данные ошибки передаются как доп. параметры в:

* [Webhook](/platezhnyi-shlyuz/webhook-platezhnoi-sistemy/status-oplaty) на статус оплаты
* В [запросе ](/platezhnyi-shlyuz/vspomogatelnye-metody/proverka-statusa-tranzakcii)на статус транзакции &#x20;
* В [One-click](/platezhnyi-shlyuz/platezhi-bez-formy-oplaty/platezh-po-sokhranennoi-karte-one-click) на прием без платежной страницы

<table data-full-width="true"><thead><tr><th>Код ошибки</th><th width="286">Текстовое сопровождение</th><th>Описание</th></tr></thead><tbody><tr><td>100</td><td>undefined error</td><td>Неопределенная ошибка </td></tr><tr><td>101</td><td>3DS authentication failed</td><td>Не удалось провести проверку 3DSecure</td></tr><tr><td>102</td><td>invalid card</td><td>Недействительная карта</td></tr><tr><td>103</td><td>exceeds amount limit</td><td>Превышен лимит суммы</td></tr><tr><td>104</td><td>exceeds transaction frequency limit</td><td>Превышен предел частоты транзакций</td></tr><tr><td>105</td><td>transaction declined by an issuer</td><td>Транзакция отклонена банком-эмитентом</td></tr><tr><td>106</td><td>transaction declined by an acquirer</td><td>Транзакция отклонена банком-эквайером</td></tr><tr><td>107</td><td>unavailable issuer</td><td>Банк-эмитент недоступен</td></tr><tr><td>108</td><td>unavailable acquirer</td><td>Банк-эквайер недоступен</td></tr><tr><td>109</td><td>payment is forbidden for the merchant</td><td>Платеж запрещен для продавца</td></tr><tr><td>110</td><td>stolen card</td><td>Карта украдена</td></tr><tr><td>111</td><td>blocked card</td><td>Карта заблокирована</td></tr><tr><td>112</td><td>non existent card</td><td>Карты не существует</td></tr><tr><td>113</td><td>lost card</td><td>Карта утеряна</td></tr><tr><td>114</td><td>card has expired</td><td>Срок действия карты истёк</td></tr><tr><td>115</td><td>incorrect CVV/CVC</td><td>Некорректный CVV/CVC</td></tr><tr><td>116</td><td>incorrect card number</td><td>Некорректный номер карты</td></tr><tr><td>117</td><td>incorrect card expiration date</td><td>Некорректный срок действия карты</td></tr><tr><td>118</td><td>insufficient funds</td><td>Недостаточно средств</td></tr><tr><td>119</td><td>suspicious client</td><td>Подозрительный клиент</td></tr><tr><td>120</td><td>user did not pay</td><td>Пользователь не произвел оплату</td></tr><tr><td>121</td><td>invalid threeD secure parameters</td><td>Некорректно переданные  параметры 3DSecure</td></tr><tr><td>122</td><td>Declined. Matches the Anti-Fraud Center list. Please contact [source_organization].</td><td>Отклонено. Данные совпали со списком Антифрод Центра. Просим обратиться в [source_organization]</td></tr><tr><td></td><td></td><td></td></tr></tbody></table>


# Статусы транзакций

|        код        |                наименование                |                                                                                                                                               описание                                                                                                                                               |
| :---------------: | :----------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
|        new        |             Транзакция создана             |                                                                                                                                    Статус при создании транзакции                                                                                                                                    |
|     processed     |             Транзакция в работе            |                                                                                                            Пользователь нажал на кнопку "Оплатить". Транзакция прошла все этапы валидации.                                                                                                           |
|  threeds\_waiting |  Транзакция ожидает ответа от 3ds сервера  |                                                                                                                 В ожидании проверки [3D-Secure](/platezhnyi-shlyuz/welcom/3d-secure)                                                                                                                 |
| threeds\_received |  Транзакция получила ответ от 3ds сервера  |                                                                                                                                     Получен ответ от 3DS сервера                                                                                                                                     |
|       failed      |         Транзакция прошла неуспешно        |                                                                                                                      Ошибка со стороны банка эквайера при проведении транзакции                                                                                                                      |
|       refund      |            Транзакция возвращена           |                                                                                                                     Был произведён возврат денежных средств на карту пользователя                                                                                                                    |
|      canceled     |             Транзакция отменена            |                                                                                                                              Отмена транзакции при двухстадийной оплате                                                                                                                              |
|       retry       |         Транзакция в статусе повтор        |                                                                                                               Повторная попытка оплаты. В случае, ошибки ввода со стороны пользователя                                                                                                               |
|      success      |          Транзакция прошла успешно         | Денежные средства сняты с карты пользователя ([Приём](/platezhnyi-shlyuz/vzaimodeistvie-s-formoi-oplaty/iniciaciya-priyoma-denezhnykh-sredstv)). Денежные средства выведены на карту пользователя ([Вывод](/platezhnyi-shlyuz/vzaimodeistvie-s-formoi-oplaty/iniciaciya-vyvoda-denezhnykh-sredstv)). |
|       holded      |       Транзакция в в статусе ожидания      |                                                                                                                                  В ожидании ответа от банка эквайера                                                                                                                                 |
|  refund\_waiting  |   Транзакция в статусе ожидания возврата   |                                                                                                                 Процесс возврата средств был запущен. Транзакция в ожидании возврата.                                                                                                                |
|     authorized    |           Транзакция авторизована          |                                                                                                                    Средства захолдированы. Используется при двухстадийной оплате.                                                                                                                    |
|       error       | Произошла ошибка при проведении транзакции |                                                                                                                                   Ошибка при проведении транзакции                                                                                                                                   |


# Формирование подписи

Запросы для взаимодействия с платежной системой подписываются с использованием алгоритма SHA256.

Для формирование подписи необходимо:

1. В случае POST запроса, тело запроса *requestData* сортируется по алфавиту и кодируется в BASE64.
2. В случае GET запроса, Query params преобразуем в JSON.\
   ИЗ:\
   *<https://prapi.tarlanpayments.kz/transaction/api/v1/system/client/cards?merchant_id=123&project_id=124&project_client_id=999>*\
   В:\
   *{ "merchant\_id" : 123, "project\_client\_id" : "999", "project\_id" : 124}*\
   После преобразования сортируем по алфавиту и кодируем в BASE64.
3. Конкатенируем кодированное тело запроса (*base64EncodedData*) и secret (выдается мерчанту платежной организацией)
4. Используя хеш-функцию SHA256 хешируем полученный результат (*dataToSign*)
5. Добавляем подпись в заголовок запроса  Authorization: Bearer sign

{% hint style="warning" %}
**Все тело запроса участвует в подписи, кроме полей c пустым значением строки ""**\
**Поле additional\_data не участвует в формировании** [**подписи**](/platezhnyi-shlyuz/formirovanie-podpisi)
{% endhint %}

В формировании подписи участвует все тело запроса с исключениями:\
&#x20;          Поля с пустыми строковыми значениями "" не участвуют в подписи;\
&#x20;          Поле additional\_data не участвует в формировании подписи

&#x20;

{% code lineNumbers="true" %}

```bash
curl --location 'https://prapi.tarlanpayments.kz/transaction/...' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer ff1a38a78ccca1b313ae172307e49112066ec2f5a1dfa2a76110104da3012896'
--data-raw '{}'
```

{% endcode %}

{% tabs %}
{% tab title="PHP" %}
{% code lineNumbers="true" %}

```php
<?php

$requestData = [
    "project_client_id" => "9999",
    "merchant_id" => 1,
    "project_id" => 1,
    "additional_data" => ["key" => "This should be excluded"]
];

$secret = "12345";

// Remove the "additional_data" field from the request data
unset($requestData["additional_data"]);

// Sort the request data by keys in alphabetical order
ksort($requestData);

// Encode the sorted request data to JSON
$sortedJson = json_encode($requestData, JSON_UNESCAPED_UNICODE | JSON_HEX_AMP | JSON_UNESCAPED_SLASHES);

// Encode the sorted JSON to base64
$base64EncodedData = base64_encode($sortedJson);

// Concatenate the base64-encoded data with the secret
$dataToSign = $base64EncodedData . $secret;

// Hash the result to SHA-256
$sha256Hash = hash("sha256", $dataToSign);

echo $sha256Hash;
```

{% endcode %}
{% endtab %}

{% tab title="Python3" %}
{% code lineNumbers="true" %}

```python
import json
import base64
import hashlib

request_data = {
    "project_client_id": "9999",
    "merchant_id": 1,
    "project_id": 1,
    "additional_data": {"key":"This should be excluded"}
}

secret = "12345"

# Remove the "additional_data" field from the request data
if "additional_data" in request_data:
    del request_data["additional_data"]

# Sort the request data by keys in alphabetical order
sorted_data = json.dumps(
        request_data,
        sort_keys=True,
        ensure_ascii=False,
        separators=(',', ':'),
    )

# Encode the sorted JSON to base64
base64_encoded_data = base64.b64encode(sorted_data.encode()).decode()

# Concatenate the base64-encoded data with the secret
data_to_sign = base64_encoded_data + secret

# Hash the result to SHA-256
sha256_hash = hashlib.sha256(data_to_sign.encode()).hexdigest()

print(sha256_hash)
```

{% endcode %}
{% endtab %}

{% tab title="Golang" %}

<pre class="language-go" data-line-numbers><code class="lang-go">package main

import (
	"crypto/sha256"
	"encoding/base64"
	"encoding/json"
	"fmt"
)  // Тело берется из создания <a data-footnote-ref href="#user-content-fn-1">транзакции </a>

type Request struct {
	ProjectClientID string `json:"project_client_id"`
	MerchantId      uint64 `json:"merchant_id"`
	ProjectId       uint64 `json:"project_id"`
	AdditionalData  map[string]string `json:"additional_data"`
}

const secret = "12345"

func main() {
	request := Request{
		ProjectClientID: "9999",
		MerchantId:      1,
		ProjectId:       1,
		AdditionalData: map[string]string{
			"key": "This should be excluded",
		},
	}

	notSortedJson, err := json.Marshal(&#x26;request)
	if err != nil {
		panic(err)
	}

	var notSorteddMap map[string]interface{}

	
	if err = json.Unmarshal(notSortedJson, &#x26;notSorteddMap); err != nil {
		panic(err)
	}

	delete(notSortedMap, "additional_data")
	
	sortedJson, err := json.Marshal(&#x26;notSorteddMap)
	if err != nil {
		panic(err)
	}

	signData := base64.StdEncoding.EncodeToString(sortedJson)
	
	sign := sha256.Sum256([]byte(signData + secret))

	fmt.Printf("%x", sign)

}
</code></pre>

{% endtab %}

{% tab title="Dart" %}

```dart
const paymentSecretKey = "123";

String hashedSecretKey({
  required Map<String, dynamic> requestData,
}) {
  // Sort the request data by keys in alphabetical order
  List<MapEntry<String, dynamic>> sortedEntries = requestData.entries.toList()
    ..sort((a, b) => a.key.compareTo(b.key));
  Map<String, dynamic> sortedData = Map.fromEntries(sortedEntries);

  // Sort the request data by keys in alphabetical order
  String encodedData = json.encode(sortedData);

  // Encode the sorted JSON to base64
  String base64EncodedData = base64.encode(Utf8Encoder().convert(encodedData));

  // Concatenate the base64-encoded data with the secret
  String dataToSign = base64EncodedData + paymentSecretKey;

  // Hash the result to SHA-256
  Digest sha256Hash = sha256.convert(Utf8Encoder().convert(dataToSign));

  final result = sha256Hash.toString();
  log('auth token $result');

  return result;
}
```

{% endtab %}
{% endtabs %}

[^1]: [https://app.gitbook.com/o/gxK1VbNmJ8bcGc8xM5wD/s/dkkz4EKtpaWVPlq7ZwsC/\~/changes/61/spravochnik-metodov-api/vzaimodeistvie-s-formoi-oplaty](/platezhnyi-shlyuz/vzaimodeistvie-s-formoi-oplaty)


# Дополнительные параметры

При [взаимодействии с формой оплаты](/platezhnyi-shlyuz/vzaimodeistvie-s-formoi-oplaty) передается поле additional\_data.\
Данное поле содержит динамические параметры мерчанта, которые будут сохранены в платежной системе и переданы мерчанту в [webhook-e со статусом оплаты](/platezhnyi-shlyuz/webhook-platezhnoi-sistemy/status-oplaty) и в [запросе статуса транзакции](/platezhnyi-shlyuz/vspomogatelnye-metody/proverka-statusa-tranzakcii).

{% hint style="warning" %}
Поле additional\_data не участвует в формировании [подписи](/platezhnyi-shlyuz/formirovanie-podpisi)
{% endhint %}


# Взаимодействие с формой оплаты

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

{% content-ref url="/pages/ckuD2hfrCTOXtL9Ssqtm" %}
[Инициация приёма денежных средств](/platezhnyi-shlyuz/vzaimodeistvie-s-formoi-oplaty/iniciaciya-priyoma-denezhnykh-sredstv)
{% endcontent-ref %}

{% content-ref url="/pages/W0l0HAktw86BHDcPZEUJ" %}
[Инициация вывода денежных средств](/platezhnyi-shlyuz/vzaimodeistvie-s-formoi-oplaty/iniciaciya-vyvoda-denezhnykh-sredstv)
{% endcontent-ref %}

{% content-ref url="/pages/fBnyoEnqMmkUDKS8DxSK" %}
[Привязка карты](/platezhnyi-shlyuz/vzaimodeistvie-s-formoi-oplaty/privyazka-karty)
{% endcontent-ref %}


# Инициация приёма денежных средств

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

## Создание транзакции на прием

<mark style="color:green;">`POST`</mark> `https://prapi.tarlanpayments.kz/transaction/api/v1/transaction/primal/pay-in`

#### Headers

<table><thead><tr><th>Name</th><th width="183">Type</th><th>Description</th></tr></thead><tbody><tr><td>Authorization<mark style="color:red;">*</mark></td><td>String </td><td>Bearer Авторизационный хэш (см Формирование подписи)</td></tr></tbody></table>

#### Request Body

| Name                                                     | Type    | Description                                                                                                                                                              |
| -------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| amount<mark style="color:red;">\*</mark>                 | Float   | Сумма платежа                                                                                                                                                            |
| project\_client\_id                                      | String  | Идентификатор клиента на стороне проекта                                                                                                                                 |
| callback\_url                                            | String  | URL проекта для оправки коллбэка со статусом транзакции (см Отправка callback)                                                                                           |
| failure\_redirect\_url<mark style="color:red;">\*</mark> | String  | Страница проекта на которую будет выполнен редирект пользователя после неуспешнй оплаты. Если параметр не был передан, редирект будет выполнен на success\_redirect\_url |
| merchant\_id<mark style="color:red;">\*</mark>           | Integer | Идентификатор мерчанта присваиваемый платежной системой                                                                                                                  |
| project\_id<mark style="color:red;">\*</mark>            | Integer | <p>Идентификатор проекта присваиваемый платежной системой</p><p></p>                                                                                                     |
| project\_reference\_id<mark style="color:red;">\*</mark> | String  | Идентификатор заказа на стороне мерчанта                                                                                                                                 |
| success\_redirect\_url<mark style="color:red;">\*</mark> | String  | Страница проекта на которую будет выполнен редирект пользователя после успешной оплаты                                                                                   |
| shipment                                                 | String  | Адрес доставки                                                                                                                                                           |
| confirm\_url                                             | String  | URL Проекта для подтверждения проведения оплаты (см. Подтверждение проведения оплаты)                                                                                    |
| description<mark style="color:red;">\*</mark>            | String  | Описание платежа (50 символов)                                                                                                                                           |
| additional\_data                                         | Object  | Дополнительные параметры                                                                                                                                                 |
| project\_order\_id                                       | String  | Номер заказа на стороне проекта                                                                                                                                          |
| is\_hold                                                 | Bool    | Указание на [блокирование средств ](/platezhnyi-shlyuz/welcom/process-dvukhstadiinogo-platezha)при проведении платежа                                                    |

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

```json
{
    "status": true,
    "message": "Success",
    "result": "https://process.tarlanpayments.kz?hash=$2a$10$nhrUYWm9sDVYqCL4LKxn9ugrdC4Pszz5wGaUsDYYIqCGc8ZA4Vu0y&transaction_id=100474"
}

```

{% endtab %}

{% tab title="500: Internal Server Error Пример ответа с ошибкой" %}

```json
{
    "status": false,
    "status_code": 5000,
    "message": "transaction already exists",
    "result": {}
}
```

{% endtab %}
{% endtabs %}

Example of a **CURL** request:

{% code fullWidth="true" %}

```bash
curl --location 'https://prapi.tarlanpayments.kz/transaction/api/v1/transaction/primal/pay-in' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer sign' \
--data-raw '{
    "amount": 10,
    "callback_url": "https://test.site/callback_url",
    "confirm_url": "https://test.site/confirm_url",
    "description": "999",
    "failure_redirect_url": "https://www.test.com",
    "merchant_id": 9999,
    "project_client_id": "999",
    "project_id": 9999,
    "project_reference_id": "999",
    "shipment": "Tarlan ave, Payments str.",
    "success_redirect_url": "https://www.test.com",
    "additional_data": {
        "test1": "value1",
        "test2": 2
    }
}'
```

{% endcode %}

**Платеж по сохраненной карте**

При передаче параметра `project_client_id` у пользователя на форме оплаты появится возможность сохранения карты. Для сохранения карты, пользователю, на форме оплаты необходимо кликнуть "сохранить карту" и провести успешный платёж по этой карте.

Для последующих платежей по сохранённой карте необходимо передавать параметр `project_client_id`.

Особенностью платежа по сохранённой карте является отсутствие 3DS аутентификации пользователя, значительно ускоряющий и упрощающий процесс оплаты.


# Инициация вывода денежных средств

## Вывод средств без сохранённой карты

## Создание транзакции на вывод

<mark style="color:green;">`POST`</mark> `https://prapi.tarlanpayments.kz/transaction/api/v1/transaction/primal/pay-out`

#### Headers

| Name                                            | Type   | Description                                                                                      |
| ----------------------------------------------- | ------ | ------------------------------------------------------------------------------------------------ |
| Authorization<mark style="color:red;">\*</mark> | String | Bearer  Авторизационный хэш (см [Формирование подписи](/platezhnyi-shlyuz/formirovanie-podpisi)) |

#### Request Body

| Name                                                     | Type    | Description                                                                                                                                                               |
| -------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| amount<mark style="color:red;">\*</mark>                 | Float   | Сумма платежа                                                                                                                                                             |
| project\_client\_id                                      | String  | Идентификатор клиента на стороне проекта                                                                                                                                  |
| callback\_url                                            | String  | URL проекта для оправки коллбэка со статусом транзакции (см Отправка callback)                                                                                            |
| failure\_redirect\_url                                   | String  | Страница проекта на которую будет выполнен редирект пользователя после неуспешной оплаты. Если параметр не был передан, редирект будет выполнен на `success_redirect_url` |
| merchant\_id<mark style="color:red;">\*</mark>           | Integer | Идентификатор мерчанта присваиваемый платежной системой                                                                                                                   |
| project\_id<mark style="color:red;">\*</mark>            | Integer | <p>Идентификатор проекта присваиваемый платежной системой</p><p></p>                                                                                                      |
| project\_reference\_id<mark style="color:red;">\*</mark> | String  | Номер заказа на стороне проекта                                                                                                                                           |
| success\_redirect\_url<mark style="color:red;">\*</mark> | String  | Страница проекта на которую будет выполнен редирект пользователя после успешной оплаты                                                                                    |
| shipment                                                 | String  | Адрес доставки                                                                                                                                                            |
| confirm\_url                                             | String  | URL Проекта для подтверждения проведения оплаты (см. [Подтверждение проведения оплаты](/platezhnyi-shlyuz/webhook-platezhnoi-sistemy/gotovnost-provedeniya-oplaty))       |
| description<mark style="color:red;">\*</mark>            | String  | Описание платежа (50 символов)                                                                                                                                            |
| additional\_data                                         | Object  | [Дополнительные параметры](/platezhnyi-shlyuz/dopolnitelnye-parametry)                                                                                                    |
| c\_info                                                  | String  | Информация о кредите                                                                                                                                                      |

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

<pre class="language-json"><code class="lang-json"><strong>{
</strong>    "status": true,
    "message": "Success",
    "result": "https://process.tarlanpayments.kz?hash=$2a$10$nhrUYWm9sDVYqCL4LKxn9ugrdC4Pszz5wGaUsDYYIqCGc8ZA4Vu0y&#x26;transaction_id=100474"
}

</code></pre>

{% endtab %}

{% tab title="500: Internal Server Error Примет ответа с ошибкой" %}

<pre class="language-json"><code class="lang-json"><strong>{
</strong>    "status": false,
    "status_code": 5000,
    "message": "transaction already exists",
    "result": {}
}
</code></pre>

{% endtab %}
{% endtabs %}

Пример запроса CURL:

{% code fullWidth="true" %}

```bash
curl --location 'https://prapi.tarlanpayments.kz/transaction/api/v1/transaction/primal/pay-out' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer sign' \
--data-raw '{
    "amount": 10,
    "callback_url": "https://test.site/callback_url",
    "confirm_url": "",
    "description": "999",
    "failure_redirect_url": "https://www.test.com",
    "merchant_id": 9999,
    "project_client_id": "999",
    "project_id": 9999,
    "project_reference_id": "999",
    "shipment": "",
    "success_redirect_url": "https://www.test.com",
    "additional_data": {
        "test1": "value1",
        "test2": 2
    }
}'
```

{% endcode %}

## Вывод средств сохранённой карте

При передаче параметра `project_client_id` у пользователя на форме оплаты появится возможность сохранения карты. Для сохранения карты, пользователю, на форме оплаты необходимо кликнуть "сохранить карту" и провести успешный вывод средств по этой карте.

Для последующих платежей по сохранённой карте необходимо передавать параметр `project_client_id`.


# Привязка карты

1. Создание транзакции для привязки карты с указанием project\_client\_id.
2. Создается платеж на 10тг.
3. Мерчант перенаправляет на страницу оплаты. &#x20;
4. После проведения платежа  происходит возврат 10тг.

{% hint style="info" %}
Результат привязки карты мерчант можете узнать в методе [получения списка привязанных карт пользователя](broken://pages/NUtlqVz5wJmuviFTrYpZ), [Webhook ](/platezhnyi-shlyuz/webhook-platezhnoi-sistemy/status-oplaty)отправляется после списания средств. При последующих оплатах пользователю будут доступны ранее привязанные карты.
{% endhint %}

## Создание транзакции для привязки карты

<mark style="color:green;">`POST`</mark> `https://prapi.tarlanpayments.kz/transaction/api/v1/transaction/primal/card-link`

#### Headers

| Name                                            | Type   | Description                                                                                      |
| ----------------------------------------------- | ------ | ------------------------------------------------------------------------------------------------ |
| Authorization<mark style="color:red;">\*</mark> | String | Bearer  Авторотационный хэш (см [Формирование подписи](/platezhnyi-shlyuz/formirovanie-podpisi)) |

#### Request Body

| Name                                                     | Type    | Description                                                                                                                                                               |
| -------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| project\_id<mark style="color:red;">\*</mark>            | Integer | Идентификатор проекта присваиваемый платежной системой                                                                                                                    |
| merchant\_id<mark style="color:red;">\*</mark>           | Integer | Идентификатор мерчанта присваиваемый платежной системой                                                                                                                   |
| project\_client\_id<mark style="color:red;">\*</mark>    | String  | Идентификатор клиента на стороне проекта                                                                                                                                  |
| success\_redirect\_url<mark style="color:red;">\*</mark> | String  | Страница проекта на которую будет выполнен редирект пользователя после успешной оплаты                                                                                    |
| failure\_redirect\_url<mark style="color:red;">\*</mark> | String  | Страница проекта на которую будет выполнен редирект пользователя после неуспешной оплаты. Если параметр не был передан, редирект будет выполнен на `success_redirect_url` |
| description<mark style="color:red;">\*</mark>            | String  | Описание платежа (50 символов)                                                                                                                                            |
| additional\_data                                         | Object  | Дополнительные параметры                                                                                                                                                  |
| callback\_url                                            | String  | URL проекта для оправки коллбэка со статусом транзакции (см [Отправка callback](/platezhnyi-shlyuz/webhook-platezhnoi-sistemy/status-oplaty))                             |

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

```json
{
    "status": true,
    "message": "Success",
    "result": "https://process.tarlanpayments.kz?hash=$2a$10$nhrUYWm9sDVYqCL4LKxn9ugrdC4Pszz5wGaUsDYYIqCGc8ZA4Vu0y&transaction_id=100474"
}
```

{% endtab %}

{% tab title="500: Internal Server Error Пример ответа с ошибкой" %}

```json
{
    "status": false,
    "status_code": 5000,
    "message": "transaction already exists",
    "result": {}
}
```

{% endtab %}
{% endtabs %}

{% code fullWidth="true" %}

```bash
curl --location 'https://prapi.tarlanpayments.kz/transaction/api/v1/transaction/primal/card-link'  \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer sign' \
--data-raw '{
    "callback_url": "https://test.site/callback_url",
    "description": "desc",
    "failure_redirect_url": "https://www.test.com",
    "merchant_id": 2222,
    "project_client_id": "999",
    "project_id": 111,
    "success_redirect_url": "https://www.test.com",
    "additional_data": {
        "test": "value",
        "qwerty": "123"
    }
}'
```

{% endcode %}


# Инициация приёма денежных средств посредством Apple Pay

***

{% hint style="info" %}
Данный метод оплаты доступен только для операционных систем IOS.
{% endhint %}

***

## Создание транзакции типа Apple Pay

<mark style="color:green;">`POST`</mark> `https://prapi.tarlanpayments.kz/transaction/api/v1/transaction/primal/apple-pay`

#### Headers

<table><thead><tr><th width="236">Name</th><th width="243">Type</th><th>Description</th></tr></thead><tbody><tr><td>Authorization<mark style="color:red;">*</mark></td><td>String </td><td>Bearer Авторизационный хэш (см Формирование подписи)</td></tr></tbody></table>

#### Request Body

| Name                                                     | Type    | Description                                                                                                                                                              |
| -------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| amount<mark style="color:red;">\*</mark>                 | Float   | Сумма платежа                                                                                                                                                            |
| project\_client\_id                                      | String  | Идентификатор клиента на стороне проекта                                                                                                                                 |
| callback\_url                                            | String  | URL проекта для оправки коллбэка со статусом транзакции (см Отправка callback)                                                                                           |
| failure\_redirect\_url<mark style="color:red;">\*</mark> | String  | Страница проекта на которую будет выполнен редирект пользователя после неуспешнй оплаты. Если параметр не был передан, редирект будет выполнен на success\_redirect\_url |
| merchant\_id<mark style="color:red;">\*</mark>           | Integer | Идентификатор мерчанта присваиваемый платежной системой                                                                                                                  |
| project\_id<mark style="color:red;">\*</mark>            | Integer | <p>Идентификатор проекта присваиваемый платежной системой</p><p></p>                                                                                                     |
| project\_reference\_id<mark style="color:red;">\*</mark> | String  | Идентификатор заказа на стороне мерчанта                                                                                                                                 |
| success\_redirect\_url<mark style="color:red;">\*</mark> | String  | Страница проекта на которую будет выполнен редирект пользователя после успешной оплаты                                                                                   |
| shipment                                                 | String  | Адрес доставки                                                                                                                                                           |
| confirm\_url                                             | String  | URL Проекта для подтверждения проведения оплаты (см. Подтверждение проведения оплаты)                                                                                    |
| description<mark style="color:red;">\*</mark>            | String  | Описание платежа (50 символов)                                                                                                                                           |
| additional\_data                                         | Object  | Дополнительные параметры                                                                                                                                                 |
| project\_order\_id                                       | String  | Номер заказа на стороне проекта                                                                                                                                          |

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

```json
{
    "status": true,
    "message": "Success",
    "result": "https://process.tarlanpayments.kz?hash=$2a$10$nhrUYWm9sDVYqCL4LKxn9ugrdC4Pszz5wGaUsDYYIqCGc8ZA4Vu0y&transaction_id=100474"
}

```

{% endtab %}

{% tab title="500: Internal Server Error Пример ответа с ошибкой" %}

```json
{
    "status": false,
    "status_code": 5000,
    "message": "transaction already exists",
    "result": {}
}
```

{% endtab %}
{% endtabs %}

Example of a **CURL** request:

```bash
curl --location 'https://prapi.tarlanpayments.kz/transaction/api/v1/transaction/primal/apple-pay' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer sign' \
--data-raw '{
    "amount": 10,
    "callback_url": "https://test.site/callback_url",
    "confirm_url": "https://test.site/confirm_url",
    "description": "999",
    "failure_redirect_url": "https://www.test.com",
    "merchant_id": 9999,
    "project_client_id": "999",
    "project_id": 9999,
    "project_reference_id": "999",
    "shipment": "Tarlan ave, Payments str.",
    "success_redirect_url": "https://www.test.com",
    "additional_data": {
        "test1": "value1",
        "test2": 2
    }
}'
```


# Инициация приёма денежных средств посредство Google Pay

***

{% hint style="info" %}
Данный метод оплаты доступен только с использованием браузера Google Chrome
{% endhint %}

***

## Создание транзакции типа Google Pay

<mark style="color:green;">`POST`</mark> `https://prapi.tarlanpayments.kz/transaction/api/v1/transaction/primal/google-pay`

`Headers`

<table><thead><tr><th width="236">Name</th><th width="243">Type</th><th>Description</th></tr></thead><tbody><tr><td>Authorization<mark style="color:red;">*</mark></td><td>String </td><td>Bearer Авторизационный хэш (см Формирование подписи)</td></tr></tbody></table>

#### Request Body

| Name                                                     | Type    | Description                                                                                                                                                              |
| -------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| amount<mark style="color:red;">\*</mark>                 | Float   | Сумма платежа                                                                                                                                                            |
| project\_client\_id                                      | String  | Идентификатор клиента на стороне проекта                                                                                                                                 |
| callback\_url                                            | String  | URL проекта для оправки коллбэка со статусом транзакции (см Отправка callback)                                                                                           |
| failure\_redirect\_url<mark style="color:red;">\*</mark> | String  | Страница проекта на которую будет выполнен редирект пользователя после неуспешнй оплаты. Если параметр не был передан, редирект будет выполнен на success\_redirect\_url |
| merchant\_id<mark style="color:red;">\*</mark>           | Integer | Идентификатор мерчанта присваиваемый платежной системой                                                                                                                  |
| project\_id<mark style="color:red;">\*</mark>            | Integer | <p>Идентификатор проекта присваиваемый платежной системой</p><p></p>                                                                                                     |
| project\_reference\_id<mark style="color:red;">\*</mark> | String  | Идентификатор заказа на стороне мерчанта                                                                                                                                 |
| success\_redirect\_url<mark style="color:red;">\*</mark> | String  | Страница проекта на которую будет выполнен редирект пользователя после успешной оплаты                                                                                   |
| shipment                                                 | String  | Адрес доставки                                                                                                                                                           |
| confirm\_url                                             | String  | URL Проекта для подтверждения проведения оплаты (см. Подтверждение проведения оплаты)                                                                                    |
| description<mark style="color:red;">\*</mark>            | String  | Описание платежа (50 символов)                                                                                                                                           |
| additional\_data                                         | Object  | Дополнительные параметры                                                                                                                                                 |
| project\_order\_id                                       | String  | Номер заказа на стороне проекта                                                                                                                                          |

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

```json
{
    "status": true,
    "message": "Success",
    "result": "https://process.tarlanpayments.kz?hash=$2a$10$nhrUYWm9sDVYqCL4LKxn9ugrdC4Pszz5wGaUsDYYIqCGc8ZA4Vu0y&transaction_id=100474"
}

```

{% endtab %}

{% tab title="500: Internal Server Error Пример ответа с ошибкой" %}

```json
{
    "status": false,
    "status_code": 5000,
    "message": "transaction already exists",
    "result": {}
}
```

{% endtab %}
{% endtabs %}

Example of a **CURL** request:

```bash
curl --location 'https://prapi.tarlanpayments.kz/transaction/api/v1/transaction/primal/google-pay' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer sign' \
--data-raw '{
    "amount": 10,
    "callback_url": "https://test.site/callback_url",
    "confirm_url": "https://test.site/confirm_url",
    "description": "999",
    "failure_redirect_url": "https://www.test.com",
    "merchant_id": 9999,
    "project_client_id": "999",
    "project_id": 9999,
    "project_reference_id": "999",
    "shipment": "Tarlan ave, Payments str.",
    "success_redirect_url": "https://www.test.com",
    "additional_data": {
        "test1": "value1",
        "test2": 2
    }
}'
```


# Iframe

Внедрение формы оплаты позволит пользователям внешнего сайта осуществлять платежи через свой сайт. Документация предоставляет шаги по созданию формы оплаты, обработке данных платежа и настройке размера Iframe.

Для задания размера iframe установите атрибуты width и height в HTML-коде вашего iframe:

```html
<iframe src="URL_ВАШЕЙ_ФОРМЫ" width="360" height="700" frameborder="0"></iframe>
```

Здесь width (ширина) установлена в 360 пикселей, а height (высота) установлена в 700 пикселей. Эти значения могут быть настроены в соответствии с вашими предпочтениями и дизайном внешнего сайта.


# Платежи без формы оплаты


# Платеж по сохраненной карте (one click)

Платеж по сохраненной карте

## Проведение транзакции по сохраненной карте

<mark style="color:green;">`POST`</mark> `https://prapi.tarlanpayments.kz/transaction/api/v1/system/one-click/pay-in`

#### Request Body

| Name                                                     | Type    | Description                                                                                                                                                                                                                                                                                                                                             |
| -------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| amount<mark style="color:red;">\*</mark>                 | Float   | Сумма платежа                                                                                                                                                                                                                                                                                                                                           |
| callback\_url                                            | String  | URL проекта для оправки коллбэка со статусом транзакции (см [Отправка callback](/platezhnyi-shlyuz/webhook-platezhnoi-sistemy/status-oplaty))                                                                                                                                                                                                           |
| card\_token<mark style="color:red;">\*</mark>            | String  | Токен платежной системы полученный после [привязки карты](/platezhnyi-shlyuz/vzaimodeistvie-s-formoi-oplaty/privyazka-karty) в [webhook-e](/platezhnyi-shlyuz/webhook-platezhnoi-sistemy/status-oplaty), [списке карт](/platezhnyi-shlyuz/vspomogatelnye-metody/poluchenie-spiska-kart) или [статусе транзакции](/platezhnyi-shlyuz/statusy-tranzakcii) |
| description<mark style="color:red;">\*</mark>            | String  | Описание платежа (50 символов)                                                                                                                                                                                                                                                                                                                          |
| merchant\_id<mark style="color:red;">\*</mark>           | Integer | Идентификатор мерчанта присваиваемый платежной системой                                                                                                                                                                                                                                                                                                 |
| project\_client\_id<mark style="color:red;">\*</mark>    | String  | Идентификатор клиента на стороне проекта                                                                                                                                                                                                                                                                                                                |
| project\_id<mark style="color:red;">\*</mark>            | Integer | Идентификатор проекта присваиваемый платежной системой                                                                                                                                                                                                                                                                                                  |
| project\_reference\_id<mark style="color:red;">\*</mark> | String  | Номер заказа на стороне проекта                                                                                                                                                                                                                                                                                                                         |
| additional\_data                                         | Object  | [Дополнительные параметры](/platezhnyi-shlyuz/dopolnitelnye-parametry)                                                                                                                                                                                                                                                                                  |

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

```json
{
    "status": true,
    "message": "Success",
    "result": {
        "transaction_id": 140001455,
        "transaction_status_code": "success",
        "bank_code":"101",
        "bank_message":"3DS authentication failed"
    }
}
```

{% endtab %}

{% tab title="500: Internal Server Error Пример ответа с ошибкой" %}

```json
{
    "status": false,
    "status_code": 5000,
    "message": "transaction already exists",
    "result": {}
}
```

{% endtab %}
{% endtabs %}

{% code lineNumbers="true" fullWidth="true" %}

```bash
curl --location 'https://prapi.tarlanpayments.kz/transaction/api/v1/system/one-click/pay-in' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer 123gf4d260ab38694d10833asdf3030d9a1cc75df4c598b0wer3230680923b1da7' \
--data-raw '{
    "amount": 10,
    "callback_url": "",
    "card_token": "sdsd13123",
    "description": "test",
    "merchant_id": 9999,
    "project_client_id": "9999",
    "project_id": 9999,
    "project_reference_id": "9999"
}'
```

{% endcode %}


# Вывод по сохраненной карте (one click)

Платеж по сохраненной карте

## Проведение транзакции по сохраненной карте

<mark style="color:green;">`POST`</mark> `https://prapi.tarlanpayments.kz/transaction/api/v1/system/one-click/pay-out`

#### Request Body

| Name                                                     | Type    | Description                                                                                                                                                                                                                                                                                                                                             |
| -------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| amount<mark style="color:red;">\*</mark>                 | Float   | Сумма платежа                                                                                                                                                                                                                                                                                                                                           |
| callback\_url                                            | String  | URL проекта для оправки коллбэка со статусом транзакции (см [Отправка callback](/platezhnyi-shlyuz/webhook-platezhnoi-sistemy/status-oplaty))                                                                                                                                                                                                           |
| card\_token<mark style="color:red;">\*</mark>            | String  | Токен платежной системы полученный после [привязки карты](/platezhnyi-shlyuz/vzaimodeistvie-s-formoi-oplaty/privyazka-karty) в [webhook-e](/platezhnyi-shlyuz/webhook-platezhnoi-sistemy/status-oplaty), [списке карт](/platezhnyi-shlyuz/vspomogatelnye-metody/poluchenie-spiska-kart) или [статусе транзакции](/platezhnyi-shlyuz/statusy-tranzakcii) |
| description<mark style="color:red;">\*</mark>            | String  | Описание платежа (50 символов)                                                                                                                                                                                                                                                                                                                          |
| merchant\_id<mark style="color:red;">\*</mark>           | Integer | Идентификатор мерчанта присваиваемый платежной системой                                                                                                                                                                                                                                                                                                 |
| project\_client\_id<mark style="color:red;">\*</mark>    | String  | Идентификатор клиента на стороне проекта                                                                                                                                                                                                                                                                                                                |
| project\_id<mark style="color:red;">\*</mark>            | Integer | Идентификатор проекта присваиваемый платежной системой                                                                                                                                                                                                                                                                                                  |
| project\_reference\_id<mark style="color:red;">\*</mark> | String  | Номер заказа на стороне проекта                                                                                                                                                                                                                                                                                                                         |
| additional\_data                                         | Object  | [Дополнительные параметры](/platezhnyi-shlyuz/dopolnitelnye-parametry)                                                                                                                                                                                                                                                                                  |

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

```json
{
    "status": true,
    "message": "Success",
    "result": {
        "transaction_id": 140001455,
        "transaction_status_code": "success",
        "bank_code":"101",
        "bank_message":"3DS authentication failed"
    }
}
```

{% endtab %}

{% tab title="500: Internal Server Error Пример ответа с ошибкой" %}

```json
{
    "status": false,
    "status_code": 5000,
    "message": "transaction already exists",
    "result": {}
}
```

{% endtab %}
{% endtabs %}

{% code lineNumbers="true" fullWidth="true" %}

```bash
curl --location 'https://prapi.tarlanpayments.kz/transaction/api/v1/system/one-click/pay-out' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer 123gf4d260ab38694d10833asdf3030d9a1cc75df4c598b0wer3230680923b1da7' \
--data-raw '{
    "amount": 10,
    "callback_url": "",
    "card_token": "sdsd13123",
    "description": "test",
    "merchant_id": 9999,
    "project_client_id": "9999",
    "project_id": 9999,
    "project_reference_id": "9999"
}'
```

{% endcode %}


# Вывод денежных средств (pay-out)

Платеж реализующий вывод денежных средств

## Проведение транзакции по выводу денежных средств

<mark style="color:green;">`POST`</mark> [https://prapi.tarlanpayments.kz/transaction/api/v1/system/pay-out](https://prapi.test-tarlanpayments.kz/transaction/api/v1/system/pay-out)

<mark style="color:green;">`POST`</mark> <https://sandboxapi.tarlanpayments.kz/transaction/api/v1/system/pay-out>

#### Request Body

| Name                                                     | Type    | Description                                                                                                                                   |
| -------------------------------------------------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| amount<mark style="color:red;">\*</mark>                 | Float   | Сумма платежа                                                                                                                                 |
| callback\_url                                            | String  | URL проекта для оправки коллбэка со статусом транзакции (см [Отправка callback](/platezhnyi-shlyuz/webhook-platezhnoi-sistemy/status-oplaty)) |
| description<mark style="color:red;">\*</mark>            | String  | Описание платежа (50 символов)                                                                                                                |
| project\_order\_id                                       | String  | Идентификатор заказа на стороне проекта                                                                                                       |
| merchant\_id<mark style="color:red;">\*</mark>           | Integer | Идентификатор мерчанта присваиваемый платежной системой                                                                                       |
| project\_client\_id                                      | String  | Идентификатор клиента на стороне проекта                                                                                                      |
| project\_id<mark style="color:red;">\*</mark>            | Integer | Идентификатор проекта присваиваемый платежной системой                                                                                        |
| project\_reference\_id<mark style="color:red;">\*</mark> | String  | Номер заказа на стороне проекта                                                                                                               |
| encrypted\_pan<mark style="color:red;">\*</mark>         | String  | [Зашифрованные данные карты](/platezhnyi-shlyuz/platezhi-bez-formy-oplaty/shifrovanie-platezhnoi-karty)                                       |
| user\_phone                                              | String  | Номер телефона пользователя                                                                                                                   |
| user\_email                                              | String  | Почта пользователя                                                                                                                            |
| additional\_data                                         | Object  | [Дополнительные параметры](/platezhnyi-shlyuz/dopolnitelnye-parametry)                                                                        |

#### Header

| Name                                            | Type   | Description                                                                                      |
| ----------------------------------------------- | ------ | ------------------------------------------------------------------------------------------------ |
| Authorization<mark style="color:red;">\*</mark> | String | Bearer  Авторотационный хэш (см [Формирование подписи](/platezhnyi-shlyuz/formirovanie-podpisi)) |
| X-Accees-Key                                    | String | Буквенно-цифровая строка для доступа к API                                                       |

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

```json
{
    "status": true,
    "message": "Success",
    "result": {
        "transaction_id": 139271,
        "transaction_status_code": "success",
        "acquirer_code": "jusan"
    }
}
```

{% endtab %}

{% tab title="500: Internal Server Error Пример ответа с ошибкой" %}

```json
{
    "status": false,
    "status_code": 5000,
    "message": "transaction already exists",
    "result": {}
}
```

{% endtab %}
{% endtabs %}

{% code lineNumbers="true" fullWidth="true" %}

```bash
curl --location 'https://prapi.tarlanpayments.kz/transaction/api/v1/system/pay-out' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer token1' \
--header 'X-Accees-Key: 7e6c7a61-298d-4e09-9f50-cd7c4fc5ab35' \
--data-raw '{
    "amount": 10,
    "project_client_id": "systemPayOutTest",
    "description": "System PayOut Test",
    "user_phone": "+77777777777",
    "callback_url": "https://website.com/31e680d7",
    "project_reference_id": "systemPayOutTest002",
    "merchant_id": 999,
    "project_id": 00,
    "user_email": "mail@mail.com",
    "encrypted_pan": "ZW5jcnlwdGVkX3Bhbg=="
}'
```

{% endcode %}


# Вывод денежных средств по мобильному номеру

Платеж реализующий вывод денежных средств

## Создание транзакции для вывода по средств по мобильному номеру

<mark style="color:green;">`POST`</mark> <https://prapi.tarlanpayments.kz/transaction/api/v1/primal/payout/phone>

<mark style="color:green;">`POST`</mark> <https://sandboxapi.tarlanpayments.kz/transaction/api/v1/primal/payout/phone>

#### Request Body

| Name                                                     | Type    | Description                                                                                                                                   |
| -------------------------------------------------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| phone\_number<mark style="color:red;">\*</mark>          | String  | Номер мобильного телефона для вывода средств                                                                                                  |
| callback\_url                                            | String  | URL проекта для оправки коллбэка со статусом транзакции (см [Отправка callback](/platezhnyi-shlyuz/webhook-platezhnoi-sistemy/status-oplaty)) |
| description<mark style="color:red;">\*</mark>            | String  | Описание платежа (50 символов)                                                                                                                |
| merchant\_id<mark style="color:red;">\*</mark>           | Integer | Идентификатор мерчанта присваиваемый платежной системой                                                                                       |
| project\_client\_id                                      | String  | Идентификатор клиента на стороне проекта                                                                                                      |
| project\_id<mark style="color:red;">\*</mark>            | Integer | Идентификатор проекта присваиваемый платежной системой                                                                                        |
| project\_reference\_id<mark style="color:red;">\*</mark> | String  | Номер заказа на стороне проекта                                                                                                               |
| user\_email                                              | String  | Почта пользователя                                                                                                                            |

#### Header

| Name                                            | Type   | Description                                                                                      |
| ----------------------------------------------- | ------ | ------------------------------------------------------------------------------------------------ |
| Authorization<mark style="color:red;">\*</mark> | String | Bearer  Авторотационный хэш (см [Формирование подписи](/platezhnyi-shlyuz/formirovanie-podpisi)) |

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

```json
{
    "status": true,
    "message": "Success",
    "result": {
        "transaction_id": 139271,
        "issuer_name": "Bank",
        "recipient_name": "John Doe",
        "card_type": "Visa",
    }
}
```

{% endtab %}

{% tab title="500: Internal Server Error Пример ответа с ошибкой" %}

```json
{
    "status": false,
    "status_code": 5000,
    "message": "transaction already exists",
    "result": {}
}
```

{% endtab %}
{% endtabs %}

{% code lineNumbers="true" fullWidth="true" %}

```bash
curl --location 'https://prapi.tarlanpayments.kz/phone/api/v1/primal/payout/phone' \
--header 'accept: application/json' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer 123' \
--data-raw '{
    "phone_number": "77777777777",
    "callback_url": "string",
    "user_email": "122@1212.kz",
    "project_reference_id": "1213",
    "amount": 10,
    "project_id": 99,
    "merchant_id": 99,
    "description": "test payout for visa+",
    "project_client_id": "99"
}'
```

{% endcode %}

## Проведение транзакции для вывода по средств по мобильному номеру

<mark style="color:green;">`POST`</mark> <https://prapi.tarlanpayments.kz/transaction/api/v1/payout/phone>

<mark style="color:green;">`POST`</mark> <https://sandboxapi.tarlanpayments.kz/transaction/api/v1/payout/phone>

#### Request Body

| Name                                              | Type   | Description                                                                                                               |
| ------------------------------------------------- | ------ | ------------------------------------------------------------------------------------------------------------------------- |
| transaction\_id<mark style="color:red;">\*</mark> | String | Идентификатор транзакции полученный в методе [создания ](#sozdanie-tranzakcii-dlya-vyvoda-po-sredstv-po-mobilnomu-nomeru) |

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

```json
{
    "status": true,
    "message": "Success",
    "result": {
        "transaction_id": 139271,
        "transaction_status_code": "success",
        "acquirer_code": "jusan"
    }
}
```

{% endtab %}

{% tab title="500: Internal Server Error Пример ответа с ошибкой" %}

```json
{
    "status": false,
    "status_code": 5000,
    "message": "transaction already exists",
    "result": {}
}
```

{% endtab %}
{% endtabs %}

{% code lineNumbers="true" fullWidth="true" %}

```bash
curl --location 'https://prapi.tarlanpayments.kz/phone/api/v1/payout/phone' \
--header 'accept: application/json' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer 1222' \
--data '{
    "transaction_id": 139271
}'
```

{% endcode %}


# Шифрование платежной карты

В целях обеспечения безопасности данные платежной карты шифруются с использованием RSA PKCS1

Для шифрования  необходимо:

1. Запрос  GET [https://prapi.tarlanpayments.kz/card/api/v1/encryption/public-key](https://prapi.test-tarlanpayments.kz/card/api/v1/encryption/public-key) \
   Запрос  GET [https://sandboxapi.tarlanpayments.kz/card/api/v1/encryption/public-key](https://prapi.test-tarlanpayments.kz/card/api/v1/encryption/public-key) \
   для получения publick\_key с помощью которого шифруются данные карт используя алгоритм RSA PKCS1
2. Формируем JSON.\
   Для ***приема*** денежных средств необходимы все данные карты:\
   `{"pan":"4049121234345656","exp_month":"04","exp_year":"26","cvc":"123","full_name":"Test test"}`\
   Для ***вывод*** денежных средств необходимы только pan карты:\
   `{"pan":"4049121234345656", "full_name":"Test test"}`
3. Шифруем получившийся объект используя алгоритм RSA PKCS1 и публичный ключ&#x20;
4. Получившийся шифр кодируем в base64&#x20;

Пример ответа GET <https://prapi.test-tarlanpayments.kz/card/api/v1/encryption/public-key>

{% code lineNumbers="true" %}

```json
{
  "status": true,
  "message": "Success",
  "result": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxTl2VCVIQ3R6WWexWfEt\n80+mwQLOwVRSsmmoFZhYnuCgtdthJlb4CJ+LTup19ttHdU0h43r3W4urNDWWFuxf\nlKsIuuztP4Zc44TV4gG7YkHmz+iP90JrYzhE4yMaMYv0jTJ1lXBGTHk+Sfoa2nGg\nIdB/onVGfX27W7yjv62yZ/7V/GZljxP/8V3x/KRm/i05B4hsSE3DWw2AX+dOtvSj\n/JYXu713nGh4lsj9/CABT/GHkwY33e14YwXAS4P7f/ixGdcFudKU1QxIorFqOK0W\nDURmfnnoBuL1ailkHWb8LIu7FXUEbKi0QpmKsV5UnFWNuIQKtE/Mt+P6UJ/oGtdc\nHQIDAQAB\n-----END PUBLIC KEY-----"
}
```

{% endcode %}

{% tabs %}
{% tab title="PHP" %}
{% code lineNumbers="true" %}

```php
<?php
function encryptCard($pan) {
    $panData = json_encode(['pan' => $pan]);

    // Получаем публичный ключ
    $response = file_get_contents('https://prapi.tarlanpayments.kz/card/api/v1/encryption/public-key');
    if ($response === FALSE) {
        throw new Exception('Can not get public key');
    }

    $responseJson = json_decode($response, true);
    if (!isset($responseJson['result'])) {
        throw new Exception('Invalid response format');
    }

    $publicKeyPem = $responseJson['result'];

    // Декодируем публичный ключ из формата PEM
    $publicKey = openssl_pkey_get_public($publicKeyPem);
    if ($publicKey === FALSE) {
        throw new Exception('Failed to parse public key');
    }

    // Шифруем данные с использованием публичного ключа
    $encryptedCard = '';
    if (!openssl_public_encrypt($panData, $encryptedCard, $publicKey)) {
        throw new Exception('Failed to encrypt data');
    }

    // Возвращаем зашифрованную строку в формате base64
    return base64_encode($encryptedCard);
}

try {
    $pan = '4049121234345656'; // Пример PAN, который можно заменить на любой другой
    $encryptedCard = encryptCard($pan);
    echo "Encrypted Card: " . $encryptedCard . PHP_EOL;
} catch (Exception $e) {
    echo "Error: " . $e->getMessage() . PHP_EOL;
}
?>
```

{% endcode %}
{% endtab %}

{% tab title="Python3" %}
{% code lineNumbers="true" %}

```python
import requests
import json
import base64
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5 as Cipher_PKCS1_v1_5
from Crypto.Random import get_random_bytes

def encrypt_card(pan):
    pan_data = json.dumps({'pan': pan}).encode('utf-8')

    # Получаем публичный ключ
    response = requests.get('https://prapi.tarlanpayments.kz/card/api/v1/encryption/public-key')
    if response.status_code != 200:
        raise Exception('Can not get public key')
    
    response_json = response.json()
    if 'result' not in response_json:
        raise Exception('Invalid response format')

    public_key_pem = response_json['result']

    # Декодируем публичный ключ из формата PEM
    public_key = RSA.import_key(public_key_pem)

    # Шифруем данные с использованием публичного ключа
    cipher = Cipher_PKCS1_v1_5.new(public_key)
    encrypted_card = cipher.encrypt(pan_data)

    # Возвращаем зашифрованную строку в формате base64
    return base64.b64encode(encrypted_card).decode('utf-8')

try:
    pan = '4049121234345656' # Пример PAN, который можно заменить на любой другой
    encrypted_card = encrypt_card(pan)
    print("Encrypted Card:", encrypted_card)
except Exception as e:
    print("Error:", str(e))
```

{% endcode %}
{% endtab %}

{% tab title="Golang" %}
{% code lineNumbers="true" %}

```go
package main

import (
	"crypto/rand"
	"crypto/rsa"
	"crypto/x509"
	"encoding/base64"
	"encoding/json"
	"encoding/pem"
	"errors"
	"fmt"
	"io"
	"net/http"
)

func EncryptCard(pan string) (string, error) {
	panData := struct {
		Pan string `json:"pan"`
	}{
		Pan: pan,
	}

	response := struct {
		PublicKey string `json:"result"`
	}{}

	notSortedJson, err := json.Marshal(panData)
	if err != nil {
		return "", err
	}

	publicKeyResp, err := http.Get("https://prapi.tarlanpayments.kz/card/api/v1/encryption/public-key")
	if err != nil {
		return "", err
	}
	defer publicKeyResp.Body.Close()

	if publicKeyResp.StatusCode != http.StatusOK {
		return "", errors.New("can not get public key")
	}

	readAll, err := io.ReadAll(publicKeyResp.Body)
	if err != nil {
		return "", err
	}

	err = json.Unmarshal(readAll, &response)
	if err != nil {
		return "", err
	}

	block, _ := pem.Decode([]byte(response.PublicKey))
	if block == nil || block.Type != "PUBLIC KEY" {
		return "", fmt.Errorf("failed to parse PEM block containing the public key")
	}

	pub, err := x509.ParsePKIXPublicKey(block.Bytes)
	if err != nil {
		return "", fmt.Errorf("failed to parse public key: %v", err)
	}

	rsaPub, ok := pub.(*rsa.PublicKey)
	if !ok {
		return "", fmt.Errorf("not an RSA public key")
	}

	encryptedCard, err := rsa.EncryptPKCS1v15(rand.Reader, rsaPub, notSortedJson)
	if err != nil {
		return "", err
	}

	return base64.StdEncoding.EncodeToString(encryptedCard), nil
}

func main() {
	pan := "4049121234345656" // Пример PAN, который можно заменить на любой другой
	encryptedCard, err := EncryptCard(pan)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	fmt.Println("Encrypted Card:", encryptedCard)
}
```

{% endcode %}
{% endtab %}

{% tab title="1C" %}

```bsl
Процедура ТестированиеEncryptCard()
    // Пример PAN для тестирования
    PAN = "4049121234345656";
    
    // Вызов функции шифрования
    Попытка
        ЗашифрованнаяКарта = EncryptCard(PAN);
        Сообщить("Зашифрованная карта: " + ЗашифрованнаяКарта);
    Исключение
        Сообщить("Ошибка: " + ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

Процедура EncryptCard(PAN)
    // Данные карты
    ДанныеКарты = Новый Структура;
    ДанныеКарты.Вставить("pan", PAN);

    // Преобразование данных карты в JSON
    JSONСтрока = ПреобразованиеВJSON(ДанныеКарты);

    // Получение публичного ключа
    Запрос = Новый HTTPЗапрос("https://prapi.tarlanpayments.kz/card/api/v1/encryption/public-key");
    HTTPСоединение = Новый HTTPСоединение("prapi.tarlanpayments.kz");
    Ответ = HTTPСоединение.Получить(Запрос);

    Если Ответ.КодСостояния <> 200 Тогда
        Сообщить("Ошибка получения публичного ключа: " + Ответ.КодСостояния);
        Возврат "";
    КонецЕсли;

    // Чтение тела ответа
    ТелоОтвета = Ответ.ПолучитьТелоКакСтроку();
    Декодер = Новый JSONДекодер;
    ОтветJSON = Декодер.ПрочитатьJSON(ТелоОтвета);

    ПубличныйКлючСтрока = ОтветJSON.result;

    // Декодирование PEM и извлечение публичного ключа
    ПубличныйКлючБайты = КодировкаBase64.СтрокаВБайты(ПубличныйКлючСтрока);
    ПубличныйКлючPEM = ПолучитьPEM(ПубличныйКлючБайты);

    // Шифрование данных карты
    ЗашифрованнаяКарта = ШифрованиеRSA(ПубличныйКлючPEM, JSONСтрока);

    // Кодирование зашифрованных данных в Base64
    ЗашифрованнаяКартаBase64 = КодировкаBase64.СтрокаИзБайтов(ЗашифрованнаяКарта);

    Возврат ЗашифрованнаяКартаBase64;
КонецПроцедуры

Функция ПреобразованиеВJSON(Данные)
    JSONЗапись = Новый ЗаписьJSON;
    JSONЗапись.УстановитьСтроку();
    JSONЗапись.ЗаписатьЗначение(Данные);
    Возврат JSONЗапись.Закрыть();
КонецФункции

Функция ПолучитьPEM(ПубличныйКлючБайты)
    ОткрытыйКлюч = Новый ОткрытыйКлючШифрования;
    ОткрытыйКлюч.Установить(ПубличныйКлючБайты);
    Возврат ОткрытыйКлюч;
КонецФункции

Функция ШифрованиеRSA(ОткрытыйКлюч, Данные)
    Результат = Новый Массив;
    Для Каждого Байт Из ОткрытыйКлюч.Шифровать(Данные, "RSA/ECB/PKCS1Padding") Цикл
        Результат.Добавить(Байт);
    КонецЦикла;
    Возврат Результат;
КонецФункции
```

{% endtab %}
{% endtabs %}


# Вспомогательные методы

Методы для оптимизации корректировки процесса оплаты

{% content-ref url="/pages/99YRVWP5mG9I9XMni1Ol" %}
[Проверка статуса транзакции](/platezhnyi-shlyuz/vspomogatelnye-metody/proverka-statusa-tranzakcii)
{% endcontent-ref %}

{% content-ref url="/pages/9gGuP8FIAkLieWm0soPd" %}
[Получение списка карт](/platezhnyi-shlyuz/vspomogatelnye-metody/poluchenie-spiska-kart)
{% endcontent-ref %}

{% content-ref url="/pages/o7X3T9L7UzUu5oY8tYwE" %}
[Возврат платежа](/platezhnyi-shlyuz/vspomogatelnye-metody/vozvrat-platezha)
{% endcontent-ref %}


# Удаление привязанной карты

## Удаление привязанной карты пользователя

<mark style="color:red;">`DELETE`</mark> `https://prapi.tarlanpayments.kz/card/api/v1/system/client/card`

#### Headers

| Name                                            | Type   | Description                                                                                      |
| ----------------------------------------------- | ------ | ------------------------------------------------------------------------------------------------ |
| Authorization<mark style="color:red;">\*</mark> | String | Bearer  Авторотационный хэш (см [Формирование подписи](/platezhnyi-shlyuz/formirovanie-podpisi)) |

#### Request Body

| Name                                           | Type    | Description                     |
| ---------------------------------------------- | ------- | ------------------------------- |
| project\_id<mark style="color:red;">\*</mark>  | Integer | Идентификатор проекта           |
| card\_token<mark style="color:red;">\*</mark>  | String  | Токен карты в платежной системе |
| merchant\_id<mark style="color:red;">\*</mark> | Integer | Идентификатор мерчанта          |

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

```json
{
    "status": true,
    "message": "Success",
    "result": "success"
}
```

{% endtab %}

{% tab title="500: Internal Server Error Пример ответа с ошибкой" %}

```json
{
    "status": false,
    "status_code": 5406,
    "message": "invalid project secret",
    "result": {}
}
```

{% endtab %}
{% endtabs %}

{% code fullWidth="true" %}

```bash
curl --location --request DELETE 'https://prapi.tarlanpayments.kz/card/api/v1/system/client/card/pay-in' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer auth_tokem' \
--data '{
    "project_id": 3,
    "encrypted_card_id": "Qwerty12345",
    "merchant_id": 1
}'
```

{% endcode %}


# Проверка статуса транзакции

Для получения состояния транзакции есть возможность сделать запрос по идентификатору проекта (project\_id), информация о статусе хранится в поле [result.transaction\_status.code](/platezhnyi-shlyuz/statusy-tranzakcii).

## Запрос на получение статуса транзакции

<mark style="color:blue;">`GET`</mark> `https://prapi.tarlanpayments.kz/transaction/api/v1/system/transaction/status`

#### Query Parameters

| Name                                                     | Type    | Description                                             |
| -------------------------------------------------------- | ------- | ------------------------------------------------------- |
| project\_reference\_id<mark style="color:red;">\*</mark> | String  | Номер заказа на стороне проекта                         |
| merchant\_id<mark style="color:red;">\*</mark>           | Integer | Идентификатор мерчанта присваиваемый платежной системой |
| project\_id<mark style="color:red;">\*</mark>            | Integer | Идентификатор проекта присваиваемый платежной системой  |
| type<mark style="color:red;">\*</mark>                   | String  | [Тип транзакции](/platezhnyi-shlyuz/tipy-tranzakcii)    |

#### Headers

| Name                                            | Type   | Description                                                                                      |
| ----------------------------------------------- | ------ | ------------------------------------------------------------------------------------------------ |
| Authorization<mark style="color:red;">\*</mark> | String | Bearer  Авторотационный хэш (см [Формирование подписи](/platezhnyi-shlyuz/formirovanie-podpisi)) |

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

```json
{
  "status": true,
  "message": "Success",
  "result": {
    "finished_at": "2024-01-02T01:00:00.819045Z",
    "created_at": "2024-01-01T01:00:00.163609Z",
    "acquirer_code": "jusan",
    "acquirer_name": "Jusan Bank",
    "project_id": 99,
    "merchant_id": 999,
    "project_reference_id": "systemPayOutTest002",
    "project_client_id": "systemPayOutClient123",
    "transaction_type": {
      "code": "out",
      "name": "Вывод"
    },
    "id": 139271,
    "amount": 10,
    "description": "System PayOut Desc",
    "user_phone": "+77777777777",
    "user_email": "mail@mail.com",
    "masked_pan": "",
    "transaction_status": {
      "code": "success",
      "name": "Транзакция прошла успешно"
    },
    "refunds" : [] // fields: amount, date.
  }
}
```

{% endcode %}
{% endtab %}

{% tab title="500: Internal Server Error Пример ответа с ошибкой" %}

```json
{
    "status": false,
    "status_code": 5103,
    "message": "transaction not found",
    "result": {}
}
```

{% endtab %}
{% endtabs %}

```bash
curl -X GET "https://prapi.tarlanpayments.kz/transaction/api/v1/system/transaction/status?merchant_id=284&project_id=81&project_reference_id=systemPayOutTest002&type=out" -H "accept: application/json" -H "Authorization: 3f37e1bc02ebe3b4b38612dea390c237de2a9e55c7083fe16bd32cc28662af4a"
```


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

## Запрос на получения списка сохраненных карт

<mark style="color:blue;">`GET`</mark> `https://prapi.tarlanpayments.kz/transaction/api/v1/system/client/cards`

#### Query Parameters

| Name                                                  | Type    | Description                                             |
| ----------------------------------------------------- | ------- | ------------------------------------------------------- |
| merchant\_id<mark style="color:red;">\*</mark>        | Integer | Идентификатор мерчанта присваиваемый платежной системой |
| project\_client\_id<mark style="color:red;">\*</mark> | String  | Идентификатор клиента на стороне проекта                |
| project\_id<mark style="color:red;">\*</mark>         | Integer | Идентификатор проекта присваиваемый платежной системой  |

#### Headers

| Name          | Type   | Description                                                                                      |
| ------------- | ------ | ------------------------------------------------------------------------------------------------ |
| Authorization | String | Bearer  Авторотационный хэш (см [Формирование подписи](/platezhnyi-shlyuz/formirovanie-podpisi)) |

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

```json
{
    "status": true,
    "message": "Success",
    "result": [
        {
            "card_token": "",
            "masked_pan": "0000-00XXXXXX-0000"
        },
        {
            "card_token": "",
            "masked_pan": "0000-00XXXXXX-0000"
        },
        {
            "card_token": "",
            "masked_pan": "0000-00XXXXXX-0000"
        }
    ]
}
```

{% endtab %}

{% tab title="500: Internal Server Error Пример ответа с ошибкой" %}

```json
{
    "status": false,
    "status_code": 1021,
    "message": "request validation error",
    "result": {}
}
```

{% endtab %}
{% endtabs %}

{% code overflow="wrap" lineNumbers="true" fullWidth="true" %}

```bash
curl --location 'https://prapi.tarlanpayments.kz/transaction/api/v1/system/client/cards?merchant_id=999&project_id=999&project_client_id=999' \
--header 'Authorization: Bearer sign' \
--data ''
```

{% endcode %}


# Возврат платежа

<mark style="color:green;">`POST`</mark> `https://prapi.tarlanpayments.kz/refund/api/v1/system/refund/partial`

#### Headers

| Name                                            | Type   | Description                                                                                      |
| ----------------------------------------------- | ------ | ------------------------------------------------------------------------------------------------ |
| Authorization<mark style="color:red;">\*</mark> | String | Bearer  Авторотационный хэш (см [Формирование подписи](/platezhnyi-shlyuz/formirovanie-podpisi)) |

#### Request Body

| Name                                              | Type    | Description                                  |
| ------------------------------------------------- | ------- | -------------------------------------------- |
| amount<mark style="color:red;">\*</mark>          | Integer | Сумма возврата                               |
| transaction\_id<mark style="color:red;">\*</mark> | Integer | Идентификатор транзакции в платежной системе |

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

```json
{
    "status": true,
    "message": "Success",
    "result": "success"
}
```

{% endtab %}

{% tab title="500: Internal Server Error Пример ответа с ошибкой" %}

```json
{
    "status": false,
    "status_code": 5103,
    "message": "transaction not found",
    "result": {}
}
```

{% endtab %}
{% endtabs %}

```bash
curl --location 'prapi.tarlanpayments.kz/refund/api/v1/system/refund/partial' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer sign' \
--data '{
    "amount": 10,
    "transaction_id": "refund"
}'
```


# Расчет верхней комиссии

<mark style="color:blue;">`GET`</mark> `https://prapi.tarlanpayments.kz/commission/api/v1/system/project/upper/commission`

#### Query Parameters

| Name                                                      | Type    | Description                                             |
| --------------------------------------------------------- | ------- | ------------------------------------------------------- |
| project\_id<mark style="color:red;">\*</mark>             | Integer | Идентификатор проекта присваиваемый платежной системой  |
| merchant\_id<mark style="color:red;">\*</mark>            | Integer | Идентификатор мерчанта присваиваемый платежной системой |
| transaction\_type\_code<mark style="color:red;">\*</mark> | String  | [Тип транзакции](/platezhnyi-shlyuz/tipy-tranzakcii)    |
| transaction\_amount<mark style="color:red;">\*</mark>     | Float   | Сумма транзакции                                        |

#### Headers

| Name                                            | Type   | Description                                                                                      |
| ----------------------------------------------- | ------ | ------------------------------------------------------------------------------------------------ |
| Authorization<mark style="color:red;">\*</mark> | String | Bearer  Авторотационный хэш (см [Формирование подписи](/platezhnyi-shlyuz/formirovanie-podpisi)) |

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

```json
{
    "status": true,
    "message": "Success",
    "result": {
        "total_commission_amount": 999.00
    }
}
```

{% endtab %}

{% tab title="500: Internal Server Error Пример ответа с ошибкой" %}

```json
{
    "status": false,
    "status_code": 5102,
    "message": "commission not found",
    "result": {}
}
```

{% endtab %}
{% endtabs %}

{% code fullWidth="true" %}

```bash
curl --location 'https://prapi.tarlanpayments.kz/comission/api/v1/system/project/upper/commission?merchant_id=999&project_id=999&transaction_amount=1000.00&transaction_type_code=in' \
--header 'Authorization: Bearer sign' \
--data ''
```

{% endcode %}


# Подтверждение списания средств

Метод подтверждения списания заблокированных средств пользователя.

{% hint style="info" %}
Данный метод можно использовать только при [двухстадийном платеже](/platezhnyi-shlyuz/welcom/process-dvukhstadiinogo-platezha).
{% endhint %}

<mark style="color:green;">`POST`</mark> `https://prapi.tarlanpayments.kz/transaction/api/v1/system/two-stage/charge`

#### Headers

| Name                                            | Type   | Description                                                                                      |
| ----------------------------------------------- | ------ | ------------------------------------------------------------------------------------------------ |
| Authorization<mark style="color:red;">\*</mark> | String | Bearer  Авторотационный хэш (см [Формирование подписи](/platezhnyi-shlyuz/formirovanie-podpisi)) |

#### Request Body

| Name                                              | Type    | Description                                                      |
| ------------------------------------------------- | ------- | ---------------------------------------------------------------- |
| transaction\_id<mark style="color:red;">\*</mark> | Integer | Идентификатор транзакции, по которой необходимо сделать списание |
| amount<mark style="color:red;">\*</mark>          | Float   | Сумма транзакции                                                 |

{% tabs %}
{% tab title="200: OK " %}

```json
{
    "status": true,
    "message": "Success",
    "result": "success"
}

```

{% endtab %}

{% tab title="500: Internal Server Error " %}

```json
{
    "status": false,
    "status_code": 5406,
    "message": "invalid project secret",
    "result": {}
}
```

{% endtab %}
{% endtabs %}

{% code fullWidth="true" %}

```bash
curl --location 'https://prapi.stage-tarlanpayments.kz/transaction/api/v1/system/two-stage/charge' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer sign' \
--data '{
  "transaction_id": 999,
  "amount": 100
}'

```

{% endcode %}


# Отмена списания средств

Метод полной или частичной отмены блокировки заблокированных средств пользователя.

{% hint style="info" %}
Данный метод можно использовать только при [двухстадийном платеже](/platezhnyi-shlyuz/welcom/process-dvukhstadiinogo-platezha).
{% endhint %}

<mark style="color:green;">`POST`</mark> `https://prapi.tarlanpayments.kz/transaction/api/v1/system/two-stage/cancel`

#### Headers

| Name                                            | Type   | Description                                                                                      |
| ----------------------------------------------- | ------ | ------------------------------------------------------------------------------------------------ |
| Authorization<mark style="color:red;">\*</mark> | String | Bearer  Авторотационный хэш (см [Формирование подписи](/platezhnyi-shlyuz/formirovanie-podpisi)) |

#### Request Body

| Name                                              | Type    | Description                                                   |
| ------------------------------------------------- | ------- | ------------------------------------------------------------- |
| transaction\_id<mark style="color:red;">\*</mark> | Integer | Идентификатор транзакции по которой необходимо сделать отмену |
| amount<mark style="color:red;">\*</mark>          | Float   | Сумма отмены                                                  |
| description<mark style="color:red;">\*</mark>     | String  | Описание причины отмены                                       |
| user\_email<mark style="color:red;">\*</mark>     | String  | Пользователь, совершивший отмену транзакции                   |

{% tabs %}
{% tab title="200: OK " %}

```json
{
    "status": true,
    "message": "Success",
    "result": "success"
}

```

{% endtab %}

{% tab title="500: Internal Server Error " %}

```json
{
    "status": false,
    "status_code": 5406,
    "message": "invalid project secret",
    "result": {}
}
```

{% endtab %}
{% endtabs %}

{% code fullWidth="true" %}

```bash
curl --location 'https://prapi.stage-tarlanpayments.kz/transaction/api/v1/system/two-stage/cancel' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer sign' \
--data '{
  "transaction_id": 999,
  "amount": 100,
  "description": "test",
  "user_email": "a.ivanov@test.com"
}'

```

{% endcode %}


# Создание платежного поручения

Метод для создания платежного поручения в разрезе одного дня

<mark style="color:green;">`POST`</mark> `https://prapi.tarlanpayments.kz/payorder/api/v1/order`

#### Headers

| Name                                            | Type   | Description                                                                                      |
| ----------------------------------------------- | ------ | ------------------------------------------------------------------------------------------------ |
| Authorization<mark style="color:red;">\*</mark> | String | Bearer  Авторотационный хэш (см [Формирование подписи](/platezhnyi-shlyuz/formirovanie-podpisi)) |

#### Request Body

| Name                                                               | Type    | Description                                                                                                                               |
| ------------------------------------------------------------------ | ------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
| payment\_order\_id<mark style="color:red;">\*</mark>               | String  | Идентификатор поручение на стороне мерчанта                                                                                               |
| payment\_order\_date<mark style="color:red;">\*</mark>             | Date    | <p>Дата  платежного поручение </p><p>в формате 2025-06-30</p>                                                                             |
| merchant\_id<mark style="color:red;">\*</mark>                     | String  | Идентификатор мерчанта                                                                                                                    |
| project\_id<mark style="color:red;">\*</mark>                      | Integer | Идентификатор проекта                                                                                                                     |
| transfers <mark style="color:red;">\*</mark>                       | Array   | Cписок трансферов                                                                                                                         |
| transfers.name                                                     | String  | Наименование субмерчанта                                                                                                                  |
| transfers.bin<mark style="color:red;">\*</mark>                    | String  | БИН/ИИН субмерчанта                                                                                                                       |
| transfers.transfer\_id<mark style="color:red;">\*</mark>           | String  | Идентификатор трансфера на стороне мерчанта                                                                                               |
| transfers.description                                              | String  | Описание трансфера                                                                                                                        |
| transfers.amount<mark style="color:red;">\*</mark>                 | Float   | Сумма трансфера                                                                                                                           |
| transfers.beneficiary\_code<mark style="color:red;">\*</mark>      | String  | КБЕ                                                                                                                                       |
| transfers.payment\_purpose\_code<mark style="color:red;">\*</mark> | String  | Код назначения платежа                                                                                                                    |
| transfers.recipient\_account<mark style="color:red;">\*</mark>     | String  | Счет получателя                                                                                                                           |
| transfers.is\_legal<mark style="color:red;">\*</mark>              | Boolean | <p>Флаг, указывающий, является ли субъект юридическим лицом</p><p><br>Значения:<br>true — юридическое лицо<br>false — физическое лицо</p> |

{% tabs %}
{% tab title="200: OK " %}

```json
{
    "status": true,
    "message": "Success",
    "result": "success"
}
```

{% endtab %}

{% tab title="500: Internal Server Error " %}

```json
{
    "status": false,
    "status_code": 5406,
    "message": "invalid project secret",
    "result": {}
}
```

{% endtab %}
{% endtabs %}

{% code fullWidth="true" %}

```bash
curl --location 'https://prapi.tarlanpayments.kz/payorder/api/v1/order' \
--header 'Authorization: Bearer 123' \
--header 'Content-Type: application/json' \
--data '{
  "project_id": 99,
  "transfers": [
    {
      "name": "string",
      "bin": "11011000999",
      "transfer_id": "transfer_id",
      "description": "string",
      "amount": 150,
      "beneficiary_code": "13",
      "payment_purpose_code": "123",
      "recipient_account": "KZ111011111000011111",
      "is_legal": true
    }
  ],
  "merchant_id": 1,
  "payment_order_date": "2025-06-30",
  "payment_order_id": "payment_order_id"
}'
```

{% endcode %}


# Webhook платежной системы


# Статус оплаты

Метод предназначен для оповещения системы проекта о статусе платежа.

### Backoff Policy

Для увеличения гарантий получения ответа используются BackOff-политики при выполнении запросов:

* InitialInterval = 500 \* time.Millisecond, интервалы между повторными запросами
* RandomizationFactor = 0.5,  Разброс запроса по времени между повторами&#x20;
* MaxInterval = 60 \* time.Second, Максимальное время между повторами&#x20;
* MaxElapsedTime = 10 \* time.Minute, время в течении которого будут выполнены попытки&#x20;

#### Callback платежной системой после каждой операции

После завершения оплаты, платежная система делает запрос в проект партнера для передачи состояния платежа. Запрос делается на адрес указанный в поле `callback_url` при инициации платежа.

При получении http статуса отличного от 200 транзакция будут выполнены BackOff политики

## Отправка callback-a проект партнера

<mark style="color:green;">`POST`</mark> `callback_url`&#x20;

#### Headers

| Name                                            | Type   | Description                                                                                      |
| ----------------------------------------------- | ------ | ------------------------------------------------------------------------------------------------ |
| Authorization<mark style="color:red;">\*</mark> | String | Bearer  Авторотационный хэш (см [Формирование подписи](/platezhnyi-shlyuz/formirovanie-podpisi)) |

#### Request Body

| Name                                                     | Type    | Description                                                                           |
| -------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------- |
| created\_at<mark style="color:red;">\*</mark>            | String  | Дата создания транзакции                                                              |
| transaction\_id<mark style="color:red;">\*</mark>        | Integer | Идентификатор транзакции на стороне платежной системы                                 |
| acquirer\_code<mark style="color:red;">\*</mark>         | String  | Идентификатор банка                                                                   |
| project\_reference\_id<mark style="color:red;">\*</mark> | String  | Идентификатор транзакции на стороне проекта                                           |
| project\_сlient\_id<mark style="color:red;">\*</mark>    | String  | Идентификатор пользователя на стороне проекта                                         |
| status\_code<mark style="color:red;">\*</mark>           | String  | [Статус транзакции](/platezhnyi-shlyuz/statusy-tranzakcii)                            |
| type\_code<mark style="color:red;">\*</mark>             | String  | [Тип транзакции](/platezhnyi-shlyuz/tipy-tranzakcii)                                  |
| amount<mark style="color:red;">\*</mark>                 | Float   | Сумма транзакции                                                                      |
| description<mark style="color:red;">\*</mark>            | String  | Описание                                                                              |
| finished\_at<mark style="color:red;">\*</mark>           | String  | Дата завершения транзакции                                                            |
| project\_id<mark style="color:red;">\*</mark>            | Integer | Идентификатор проекта                                                                 |
| merchant\_id<mark style="color:red;">\*</mark>           | Integer | Идентификатор мерчанта                                                                |
| additional\_data                                         | Object  | Дополнительные поля                                                                   |
| card\_token                                              | String  | Токен карты в платежной системе                                                       |
| masked\_pan                                              | String  | Маскированная карта платежа                                                           |
| bank\_code                                               | String  | [Код ошибки](/platezhnyi-shlyuz/kody-oshibok) передается в случае ошибки в транзакции |
| bank\_message                                            | String  | Описание ошибки                                                                       |
| ips                                                      | String  | МПС система (visa/mastercard...)                                                      |
| issuer                                                   | String  | Эмитент карты                                                                         |

<pre class="language-json"><code class="lang-json">{
  "created_at": "2023-12-25T16:04:26.611025Z",
  "finished_at": "2023-12-25T16:05:47.672271Z",
  "transaction_id": 999,
  "acquirer_code": "jusan",
  "project_id": 999,
  "merchant_id": 999,
  "project_reference_id": "121adsf",
  "project_client_id": "12dfsd",
  "card_token": "qkRCjlJrAmbL7RMIqeS1OHGYLJpEbf7toQo/2zk+/8zCyaiQ",
  "masked_pan": "0000-00XXXXXX-0000",
  "year": "24",
  "month": "12",
  "ips": "<a data-footnote-ref href="#user-content-fn-1">VISA</a>",
  "issuer": "JSC ALLIANCE BANK",
  "status_code": "success",
  "type_code": "in",
  "amount": 100,
  "description": "Оплата заказа",
  "additional_data": {}
}
</code></pre>

[^1]:


# Готовность проведения оплаты

Метод предназначен для подтверждение оплаты заказа на стороне проекта.&#x20;

Системой отправляется запрос на confirm\_url проекта и ожидает ответ с обязательными параметрами: `id`, `status`, `message`, `is_payble`.

Метод будет отработан если параметр `confirm_url` был передан при инициации платежа.

### Backoff Policy

Для увеличения гарантий получения ответа используются BackOff политики при выполнении запросов:

* InitialInterval = 500 \* time.Millisecond, интервалы между повторными запросами
* RandomizationFactor = 0.5,  Разброс запроса по времени между повторами&#x20;
* MaxInterval = 60 \* time.Second, Максимальное время между повторами&#x20;
* MaxElapsedTime = 10 \* time.Minute, время в течении которого будут выполнены попытки&#x20;

<mark style="color:blue;">`GET`</mark> `https://merchant-website/confirm`

#### Query Parameters

| Name                                                     | Type   | Description                                          |
| -------------------------------------------------------- | ------ | ---------------------------------------------------- |
| type<mark style="color:red;">\*</mark>                   | string | [Тип транзакции](/platezhnyi-shlyuz/tipy-tranzakcii) |
| project\_reference\_id<mark style="color:red;">\*</mark> | string | Номер заказа на стороне проекта                      |

#### Headers

| Name          | Type   | Description                                                                                      |
| ------------- | ------ | ------------------------------------------------------------------------------------------------ |
| Authorization | String | Bearer  Авторотационный хэш (см [Формирование подписи](/platezhnyi-shlyuz/formirovanie-podpisi)) |

{% tabs %}
{% tab title="200: OK Пример ответа проекта. Все поля обязательны." %}

```json
{
    "id": "121abc", // Идентификатор транзакции на стороне проекта 
    "status": "success", // Статус заказа на стороне проекта
    "message": "order desciption", // Текстовое сопровождение ответа
    "is_payble" : true // Разрешение на проведение платежа
}
```

{% endtab %}
{% endtabs %}

&#x20;В зависимости от значения параметра `is_payble` системой принимается решение о проведении платежа:

* `true` - Проект разрешает проведение платежа
* `false` - Проект отказывает в проведении платежа


# Smart Pay

1. Google pay


# Google pay

Google Pay — это система онлайн-платежей, которая позволяет совершать покупки в приложении и на веб-сайте. Система позволяет пользователям совершать платежи онлайн из Интернета, а также с помощью телефонов, планшетов и часов Android.

Прежде чем интегрироваться с Tarlan Payments, Вам нужно ознакомится с документацией.\
[Виды интеграции и официальная документация Google.](https://developers.google.com/pay/api)&#x20;

Поддерживаемый тип интеграции для сайтов - Web.

Для данной интеграции вам необходимо ознакомиться со следующими документами:

* [Документация Google Pay для сайтов](https://developers.google.com/pay/api/web/overview)
* [Контрольный список интеграции Google Pay для сайтов](https://developers.google.com/pay/api/web/guides/test-and-deploy/integration-checklist)
* [Правила фирменного оформления Google Pay для сайтов](https://developers.google.com/pay/api/web/guides/brand-guidelines)

Для работы с Google Pay Вам необходимо зарегистрироваться в [Google Pay & Wallet Console](https://pay.google.com/business/console) и получить идентификатор продавца Google. Все продавцы обязаны соблюдать [правила допустимого использования](https://payments.developers.google.com/terms/aup) и [Условия использования](https://payments.developers.google.com/terms/sellertos) Google Pay API.

Для параметров:

**gateway** необходимо указывать значение - tarlanpayments;

**gatewayMerchantId** необходимо указывать - идентификатор продавца Google;&#x20;

Поддерживаемые методы аутентификации: PAN\_ONLY и CRYPTOGRAM\_3DS.&#x20;

Поддерживаемые платёжные системы Visa и Master Card.

В передаче платежного адреса нет необходимости.

Полученный от Google платежный токен необходимо передавать в поле token в формате string. Передавать его нужно в том же виде, в котором вы его получили от Google. Остальные параметры описаны ниже.


# CMS


# WordPress

[GitHub](https://github.com/tarlanpay/tarlan-woocommerce)

* Виджет
* Выбор дизайна виджета
* Выбор локализации виджета
* Уведомления&#x20;
* Apple Pay и Google Pay
* WordPress любая версия
* WooCommerce любая версия
* WooCommerce Subscriptions 2.5.3 и выше


# Bitrix

[GitHub](https://github.com/tarlanpay/tarlan-bitrix)

Возможности:

* Виджет
* Настройка виджета
* Локализация
* Уведомления
* Совместимость с Бизнесом


# Tilda

Подключение платежного шлюза Tarlan Payments при создании интернет-магазина в Tilda

Для подключения вам необходимо:

1. Пройти все [этапы имплементации](/#etapy-implementacii)

Вы получите:

* Идентификатор проекта мерчанта (merchant\_id:project\_id)
* Ключ (project\_key)

2. Перейдите в Tilda → Настройки сайта → Платежные системы <br>

   <figure><img src="/files/zkGrrXD4lRltErDpQ0ED" alt=""><figcaption></figcaption></figure>
3. Выбираем "Универсальная платежная система"<br>

   <figure><img src="/files/0yFroBrUDdGvqIiHKWf9" alt=""><figcaption></figcaption></figure>
4. В выпадющем списке выбираем [TarlanPayments](https://tarlanpayments.kz/)
5. Введите данные полученные от <support@tarlanpayments.kz> в поля\
   &#x20;"ЛОГИН" :  merchant\_id:project\_id \
   &#x20;"СЕКРЕТ ДЛЯ ПОДПИСИ ЗАКАЗА" : project\_key<br>

   <figure><img src="/files/XfLGXQ11HUSpThXuVAap" alt=""><figcaption></figcaption></figure>
6. Поле "ЗАГОЛОВОК" редактируем на свое усмотрение\
   ![](/files/VGT0m7uuHaJGMORlGiMK)

*Если подключено несколько платежных систем, то они автоматически появятся в вариантах оплаты при покупке товара.*


# Сводка изменений

<table data-full-width="true"><thead><tr><th width="128">Версия</th><th>Описание</th></tr></thead><tbody><tr><td><strong>1.3.0</strong> от 15.05.24</td><td><ol><li>Добавлена поддержка AGWS в лк</li></ol></td></tr><tr><td><strong>1.2.6</strong> от 17.04.24</td><td><ol><li>Возможность изменения цветовой палитры платежной формы в ЛК</li><li>Отправка <a data-mention href="/pages/vyIBCRLFzmwCJDsm0ETA">/pages/vyIBCRLFzmwCJDsm0ETA</a> в webhook-e <a data-mention href="/pages/J8upgdcouuqeSf3VAeOb">/pages/J8upgdcouuqeSf3VAeOb</a></li></ol></td></tr><tr><td><strong>1.2.5</strong> от 03.04.24</td><td><ol><li>Добавлена возможность блокировки пользователя</li><li>Интеграция с <a data-mention href="/pages/t0cRX2KtffWCgWk5RP85">/pages/t0cRX2KtffWCgWk5RP85</a></li><li>Плагин для работы в <a data-mention href="/pages/xaRNePE3KXfKtE3O9kQf">/pages/xaRNePE3KXfKtE3O9kQf</a></li></ol></td></tr><tr><td><strong>1.2.4</strong> от 20.03.24</td><td><ol><li>Возможность добавлять пользователей в ЛК </li><li>Добавлена возможность создания ссылки на транзакцию через ЛК </li><li>Причина отказа банка выведена в детализацию транзакции в ЛК</li><li>Добавлены логи запроса в банк </li></ol></td></tr><tr><td><strong>1.2.3</strong> от 6.03.24</td><td><ol><li>Добавлена возможность редиректа по таймеру на url мерчанта на странице чека</li><li>Добавлена возможность выводить описание в платежную страницу </li></ol></td></tr><tr><td><strong>1.2.2</strong> от 21.02.24</td><td><ol><li>Оптимизирована работа шифрования и улучшена криптостойкость </li><li>Добавлена настройка планирование рассылки отчетов в ЛК мерчанта</li></ol></td></tr><tr><td><strong>1.2.1</strong> от 07.02.24</td><td><ol><li>Добавлена возможность предзаполнить карту на платежной формы при их наличии у пользователя</li><li>Добавлен выбор стилей платежной формы по умолчании при отсутвии настроек мерчанта</li><li>Оптимизирована отрисовка платежной страницы</li><li>Добалено логирование действий пользователя</li></ol></td></tr><tr><td><strong>1.2.0</strong> от 24.01.24</td><td><ol><li>Возможность создания <a href="/pages/o3frR4ZE24bc03azMAQ1">двухстадийного способа</a> оплаты<br>Методы для управления <a href="/pages/krug2ggJGqrhRwaRdR5q">списанием</a> и <a href="/pages/FO0BfT4IH7WQylfoTAY6">отменой</a> заблокированных средств  </li><li>Добавлено поле project_order_id являющееся идентификатором заказа</li></ol></td></tr><tr><td><strong>1.1.2</strong> от 21.11.23</td><td>Добавлены коды ошибок коды <a href="/pages/NabOIjsudi6LZteJxIS7">ошибок провайдера</a>.</td></tr><tr><td><strong>1.1.1</strong> от 01.11.23</td><td><ol><li>Получение email, phone перенесено на платежную страницу, обязательность регулируется в ЛК мерчанта.</li><li>Исправлена ошибка <a href="/pages/fE7FqYueiNYcUQ0VOqB5">подписи </a>с использованием поля <a href="/pages/xDNK8ax14TEhzeK9tcCb">additional_data</a>.</li></ol></td></tr><tr><td><strong>1.1.0</strong> от 19.10.23</td><td><ol><li><strong>Возврат Платежа</strong></li></ol><p><em>Раздел:</em><br>API <a href="/pages/o7X3T9L7UzUu5oY8tYwE">Возврата платежа</a></p><ol start="2"><li><strong>Привязка Карты</strong>: Пользователи могут привязывать свои карты для быстрых и безопасных транзакций двумя способами:<br>- на платежном виджете<br>- через back-to-back  решение</li></ol><p><em>Раздел:</em><br>API <a href="/pages/fBnyoEnqMmkUDKS8DxSK">Привязки карты пользователя</a> </p><ol start="3"><li><strong>Прием и Вывод Средств с Сохраненной Карты Пользователя:</strong> Мы предоставляем удобный способ приема и вывода денег, используя сохраненные карты.</li></ol><p><em>Разделы:</em></p><p>API <a href="/pages/ckuD2hfrCTOXtL9Ssqtm#platyozh-po-sokhranyonnoi-karte">Приёма по сохраненной карте</a><br>API <a href="/pages/W0l0HAktw86BHDcPZEUJ#vyvod-sredstv-sokhranyonnoi-karte">Вывода по сохраненной карте</a></p><p></p><ol start="4"><li><strong>Метод вызова сохраненных карт:</strong></li></ol><p>Возможность получения токена карты:<br>- в статусе транзакции<br>- через  Webhook<br><em>Разделы:</em><br>API <a href="/pages/9gGuP8FIAkLieWm0soPd">Вызова сохраненных карт</a></p><p></p><ol start="5"><li><strong>Google Pay:</strong> Теперь поддерживается Google Pay для удобных и быстрых онлайн-платежей.</li></ol><p><em>Разделы:</em><br>API для <a href="/pages/7v9XzQK8oP3RHaWKYQNP">Google Pay</a></p><ol start="6"><li><strong>Интеграция через iframe:</strong> Мы предоставляем возможность интеграции с нашим приложением через iframe для улучшенного пользовательского опыта.</li></ol><p><em>Раздел:</em><br>Возможность интеграции через <a href="/pages/J6mah1ZpCsK64PcIzl2G">iframe</a></p><ol start="7"><li><strong>Интеграция через Tilda Publishing:</strong> Теперь вы можете интегрировать наше приложение с Tilda Publishing для создания великолепных лендингов и интерактивных страниц.</li></ol><p><em>Раздел:</em></p><p>Возможность интеграции через <a href="/pages/LXN29TeCDCZW87GrXoEU">Tilda Publishing</a></p><ol start="8"><li><strong>Изменения в формировании подписи:</strong> Мы внесли улучшения в процесс формирования подписей, обеспечивая более высокий уровень безопасности.</li></ol><p><em>Раздел:</em><br>Изменения в <a href="/pages/fE7FqYueiNYcUQ0VOqB5">формировании подпис</a></p></td></tr><tr><td><strong>1.0.0</strong> от 01.08.23</td><td><ol><li><strong>Приём и вывод денежных средств:</strong></li></ol><p>Теперь вы можете принимать и выводить деньги через наше приложение, независимо от вашей роли или цели.<br>Мы предоставляем полную интеграцию для управления финансами<br><br><em>Разделы:</em><br>API <a href="/pages/ckuD2hfrCTOXtL9Ssqtm">Создание платежа на приём средств</a><br>API <a href="/pages/BC0TUGFLPDnb9FAYBrUE">Создание платежа на вывод средств</a></p><ol start="2"><li><strong>Формирование Цифровой Подписи:</strong></li></ol><p>Добавлена возможность создания цифровой подписи для всех финансовых операций, обеспечивающая дополнительную безопасность транзакций.<br><em>Раздел:</em><br>API <a href="/pages/BC0TUGFLPDnb9FAYBrUE">Формирование подписи</a></p><ol start="3"><li><strong>Отправка Call-Back-ов:</strong></li></ol><p>Теперь система автоматически отправляет уведомления платежной организации после успешных транзакций, улучшая процесс обработки платежей.<br><em>Раздел:</em><br>API <a href="https://app.gitbook.com/o/gxK1VbNmJ8bcGc8xM5wD/s/dkkz4EKtpaWVPlq7ZwsC/~/changes/36/spravochnik-metodov-api/otpravka-callback-ov-platezhnoi-organizaciei">Отправка call-back-ов</a><br></p></td></tr></tbody></table>


# Коды состояния аккаунта

| Код состояния | Описание                       |
| ------------- | ------------------------------ |
| 0             | Аккаунт не может быть пополнен |
| 1             | Аккаунт может быть пополнен    |
| 2             | Аккаунт не верифицирован       |


# Статусы транзакции

| Код статуса | Сообщение                              | Описание                                                            | Финальность                                           |
| ----------- | -------------------------------------- | ------------------------------------------------------------------- | ----------------------------------------------------- |
| 1           | Transaction created                    | Транзакция создана(промежуточная)                                   | Нет                                                   |
| 2           | Transaction successfully processed     | Транзакция успешно проведена                                        | Да                                                    |
| 3           | Transaction was canceled by user       | Транзакция отменена пользователем                                   | Да                                                    |
| 4           | Transaction was failed                 | Транзакция завершена неуспешно                                      | Да                                                    |
| 5           | Transaction holded by service provider | Транзакция проводится на стороне поставщика услуг                   | Нет                                                   |
| 6           | Transaction finished with error        | Транзакция завершена с ошибкой                                      | Необходимо дополнительно запрашивать статус вручную\* |
| 7           | Транзакция находится в обработке       | Транзакция находится в обработке, будет завершена в течении времени | Нет                                                   |

**\*Транзакции со статус кодом 6 нужно запрашивать дополнительно у технической поддержки. Почта технической поддержки -&#x20;*****<support@tarlanpayments.kz>***


# Коды ошибок

## Ожидаемые ошибки

**Ожидаемые ошибки** — это ошибки, которые всегда возвращаются с кодом статуса HTTP 200 OK. Эти ошибки указывают на то, что **запрос** был успешно обработан, даже если результат привел к ошибке. Стандартный формат ответа JSON для ожидаемых ошибок указан ниже:

```json
{
    "status": true,
    "status_code": 0,
    "message": "Success",
    "result": {
        "error_code": 1042,
        "message": "duplicate external id",
        "data": null,
    }
}
```

Детали ошибки  находятся в параметре `result` в полях `error_code` и `message`.

| Code | Text message                 | Description                                               | HTTP Status |
| ---- | ---------------------------- | --------------------------------------------------------- | ----------- |
| 0    | Success                      | Запрос успешно обработан                                  | 200         |
| 8301 | Unexpected db error          | Неопознанная ошибка при обработке ресурса                 | 200         |
| 1407 | Cache: item not found        | Запрашиваемый ресурс не найден                            | 200         |
| 1041 | Order not found              | Платеж с таким идентификатором не найден                  | 200         |
| 1042 | duplicate external id        | Повторное проведение платежа с одинаковым идентификатором | 200         |
| 9718 | provider not found           | Запрашиваемый поставщик не найден                         | 200         |
| 8015 | account doesn't exist        | Запрашиваемый баланс не найден                            | 200         |
| 9724 | showcase not found           | Запрашиваемая витрина не найдена                          | 200         |
| 9721 | showcase service not found   | Запрашиваемая услуга витрины не найдена                   | 200         |
| 5103 | transaction not found        | Запрашиваемая транзакция не найдена                       | 200         |
| 5413 | transaction already finished | Запрашиваемая транзакция финализирована                   | 200         |
| 8008 | project doesn't exist        | Запрашиваемый проект не найден                            | 200         |
| 1410 | not enough balance           | Недостаточно средств на балансе витрины                   | 200         |
| 9902 | parking doesn't exists       | Parking doesn't exists                                    | 200         |
| 9726 | project limit not found      | Ошибка на стороне платежной организации                   | 200         |
| 2012 | project commission not found | Ошибка на стороне платежной организации                   | 200         |
| 1600 | amount limit exceeded        | Сумма транзакции выходит за допустимые пределы проекта    | 200         |

## Неожидаемые ошибки

**Неожидаемые ошибки** — это ошибки, которые возвращаются с кодом HTTP, указывающим на сбой (например, 400 или 500). Эти ошибки сигнализируют о том, что запрос не был выполнен из-за таких проблем, как ошибки валидации, проблемы аутентификации или системные ошибки. Стандартный формат ответа JSON для неожиданных ошибок указан ниже:

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

Поля`status_code` и`message` предоставляют основную информацию об ошибке.

<table><thead><tr><th>Code</th><th>Text message</th><th>Description</th><th width="149">HTTP Status</th></tr></thead><tbody><tr><td>500</td><td>Internal Server Error</td><td>Неопознанна ошибка сервера</td><td>500</td></tr><tr><td>1014</td><td>Invalid signature</td><td>Неправильно сформулированная подпись</td><td>400</td></tr><tr><td>1021</td><td>request validation error</td><td>Неправильное тело запроса</td><td>400</td></tr><tr><td>1404</td><td>Invalid action request</td><td>Не передано значение поля</td><td>400</td></tr><tr><td>5629</td><td>empty service code</td><td>не передано значение service_code</td><td>400</td></tr><tr><td>5610</td><td>invalid project code</td><td>не передано значение project, либо неверное значение</td><td>400</td></tr><tr><td>1301</td><td>login is not verified</td><td>не передано значение username</td><td>400</td></tr><tr><td>999999</td><td>Unknown error</td><td>Непредвиденная ошибка</td><td>500</td></tr></tbody></table>


# Причина отклонения операции

**Причина отклонения операции** описывает обстоятельства или условия, из-за которых  операция не был успешно завершен. Это может включать ошибки пользователя (например, недостаточно средств), проблемы с верификацией или ограничения на стороне платежной системы или банка.

Структура поля:

```json
"fail_reason": {
    "code": 100,
    "message": "Unknown reason, clarification required"
}
```

Причина отклонения платежа, передаются как доп. параметры в следующих методах:

* [Callback платежной системы ](/agws/callback-platezhnoi-sistemy)

```json
{
    "project": "Testing",
    "service_code": "70958",
    "external_id": "proident",
    "status_code": "4",
    "status_message": "Transaction was failed",
    "amount": 100.82,
    "datetime": "2022-12-01T15:45:00Z",
    "username": "enim",
    "fail_reason": {
        "code": 100,
        "message": "Unknown reason, clarification required"
    }
}
```

* [Проверка статуса пополнения](/agws/proverka-statusa-popolneniya)

```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",
            "fail_reason": {
                "code": 100,
                "message": "Unknown reason, clarification required"
            }
            "service_code": "201106",
            "external_id": "200001",
        }
}
```

* [Проверка состояния аккаунта](/agws/proverka-sostoyaniya-akkaunta)

```json
 {
    "status": true,
    "status_code": 0,
    "message": "Success",
    "result": {
        "error_code": 0,
        "message": "This account is inactive",
        "account_status": 0,
        "fail_reason": {
            "code": 100,
            "message": "Unknown reason, clarification required"
        },
        "info": {
            "parking": {
                "in_date": "2024-08-02T12:24:07+05:00",
                "left_free_time_minutes": 0,
                "sum": 118,
                "current_balance": -1
            }
        }
    }
}
```

* [Проведение платежа](/agws/provedenie-platezha), передаются при статусе [<mark style="color:blue;">Transaction was failed</mark>](/agws/statusy-tranzakcii)

```json
{
    "status": true,
    "status_code": 0,
    "message": "Success",
    "result": {
        "error_code": 0,
        "message": "",
        "data": {
            "status_code": "4",
            "status_message": "Transaction was failed",
            "username": "12345",
            "amount": 1000,
            "datetime": "2024-01-01T00:00:00",
            "project": "project",
            "service_code": "service",
            "external_id": "200001",
            "fail_reason": {
                "code": 100,
                "message": "Unknown reason, clarification required"
        },
        }
    }
}
```

* [Подтверждение списания средств](/agws/podtverzhdenie-spisaniya-sredstv), передаются при статусе [<mark style="color:blue;">Transaction was failed</mark>](/agws/statusy-tranzakcii)

```json
{
    "status": true,
    "status_code": 0,
    "message": "Success",
    "result": {
        "is_success": true,
        "transaction_status_id": "4",
        "external_id": "200001",
        "message": "",
        "otp_status": false,
        "fail_reason": {
            "code": 402,
            "message": "Incorrect confirmation code"
        }
    }
}
```

<table data-full-width="true"><thead><tr><th>code</th><th width="286">message</th><th>Описание</th></tr></thead><tbody><tr><td>100</td><td>Unknown reason, clarification required</td><td>Неизвестная причина, необходимо уточнение</td></tr><tr><td>101</td><td>Error on the service provider side</td><td>Ошибка на стороне поставщика услуг</td></tr><tr><td>102</td><td>Request validation error</td><td>Ошибка валидации запроса</td></tr><tr><td>103</td><td>A payment with the specified ID already exists in the system</td><td>платеж с указанным идентификатором уже присутствует в системе</td></tr><tr><td>104</td><td>Transaction with the specified ID is not found in the system</td><td>транзакция с указанным идентификатором отсутствует в системе</td></tr><tr><td>105</td><td>Authorization error</td><td>Ошибка авторизации</td></tr><tr><td>106</td><td>Verification via the provider's server is unavailable. You can make a payment if you are confident in the parameters</td><td>Проверка через сервер поставщика недоступна</td></tr><tr><td>107</td><td>Transaction failed by timeout</td><td>Операция была отклонена по истечению времени жизни</td></tr><tr><td>200</td><td>Insufficient balance</td><td>Недостаточно баланса</td></tr><tr><td>201</td><td>Invalid ID format</td><td>Неверный формат идентификатора</td></tr><tr><td>202</td><td>Unverified account</td><td>Неверифицированный аккаунт</td></tr><tr><td>203</td><td>Phone number not available for top-up</td><td>Номер телефона, недоступный для пополнения</td></tr><tr><td>204</td><td>Operation limit exceeded for a user with simplified identification</td><td>Превышение лимита по операции для упрощенно идентифицированного пользователя</td></tr><tr><td>205</td><td>Operation limit exceeded for an identified user</td><td>Превышение лимита по операции для идентифицированного пользователя</td></tr><tr><td>206</td><td>Operation limit exceeded for an unidentified user</td><td>Превышение лимита по операции для не идентифицированного пользователя</td></tr><tr><td>207</td><td>Invoices are not yet generated. The provider may generate new month invoices during a period when they cannot be obtained.</td><td>Инвойсы ещё не сформированы</td></tr><tr><td>300</td><td>The payment amount is too large</td><td>Слишком большое значение суммы платежа</td></tr><tr><td>301</td><td>Limit exceeded</td><td>Превышение лимита</td></tr><tr><td>302</td><td>Incorrect payment amount</td><td>Некорректная сумма платежа</td></tr><tr><td>303</td><td>The payment amount is less than the minimum value</td><td>Сумма платежа меньше установленного значения</td></tr><tr><td>304</td><td>Amount out of acceptable range</td><td>Сумма вне допустимого диапазона</td></tr><tr><td>400</td><td>Receiving two confirmation requests for the same operation with a minimal interval</td><td>Получение 2 запросов на подтверждение одной операции с минимальным интервалом</td></tr><tr><td>401</td><td>Transaction lifespan expired</td><td>Истек срок жизни транзакции</td></tr><tr><td>402</td><td>Incorrect confirmation code</td><td>Неверный код подтверждения</td></tr><tr><td>403</td><td>The service has already been paid</td><td>Услуга уже была оплачена</td></tr><tr><td>404</td><td>The specified zone does not exist</td><td>Указанная зона не существует</td></tr><tr><td>405</td><td>The specified zone is inactive</td><td>Указанная зона не активна</td></tr><tr><td>406</td><td>A parameter required for payment is missing</td><td>Пропущен параметр для оплаты</td></tr><tr><td>407</td><td>Exceeded the number of confirmation code attempts</td><td>Превышено количество попыток ввода кода подтверждения</td></tr></tbody></table>


# Время жизни транзакции

Каждая транзакция имеет параметр "время жизни" означающий временной промежуток в рамках которого система будет дожидаться подтверждения транзакции. Если по истечению данного срока транзакция не была подтверждена - она будет автоматически переведена в статус [Transaction was failed ](/agws/statusy-tranzakcii)и в случае если был указан параметр сallback\_url в [Проведение платежа](/agws/provedenie-platezha) будет отправлен [callback](/agws/callback-platezhnoi-sistemy) с указанием причины в поле [fail\_reason](/agws/prichina-otkloneniya-operacii).

Финализации подлежат только транзакции находящие в статусе  [Transaction created](/agws/statusy-tranzakcii)

Параметр "время жизни" устанавливается индивидуально для мерчанта при заведении его услуги в системе. &#x20;


# Формирование подписи

Запросы для взаимодействия с сервисом подписываются с использованием алгоритма SHA256.

Подпись формируется отдельно для каждого запроса.

Для формирования подписи, выполните следующие шаги:

1. **Тело запроса сортируется по алфавиту и кодируется в BASE64.**
2. **Конкатенируем кодированное тело запроса и secret\_key(предоставляется отдельно)**
3. **Используя хэш функцию SHA256 хэшируем полученный результат конкатенации**
4. **Добавляем подпись в заголовках запроса X-Signature**

{% hint style="warning" %}
В формировании подписи не учавствуют ключи имеющие вложенную структуру:

* info
  {% endhint %}

Поля запроса заполненные как <mark style="color:green;">**""**</mark> не участвуют в формировании подписи./

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

```python
import json
import base64
import hashlib
#Тело запроса меняется в зависимости от запроса

request_data = {
  "agent": "tarlan",
  "project": "mobile",
  "service_code": "101",
}
#Для примера взяли secret 12345
secret = "12345"

sorted_data = json.dumps(
      request_data,
      sort_keys=True,
      ensure_ascii=False,
      separators=(',', ':'),
  )


base64_encoded_data = base64.b64encode(sorted_data.encode()).decode()

data_to_sign = base64_encoded_data + secret

sha256_hash = hashlib.sha256(data_to_sign.encode()).hexdigest()

print("Sign:",sha256_hash)
```

{% endtab %}

{% tab title="Golang" %}

```go
package main

import (
  "crypto/sha256"
  "encoding/base64"
  "encoding/json"
  "fmt"
) 
//Тело запроса меняется в зависимости от запроса

type Request struct {
  Agent       string `json:"agent"`
  Project     string `json:"project"`
  ServiceCode string `json:"service_code"`
}
//Для примера secret 12345
const secret = "12345"

func main() {
  request := Request{
      Agent:       "tarlan",
      Project:     "mobile",
      ServiceCode: "101",
  }

  notSortedJson, err := json.Marshal(&request)
  if err != nil {
      panic(err)
  }

  var notSortedMap map[string]interface{}

  if err = json.Unmarshal(notSortedJson, &notSortedMap); err != nil {
      panic(err)
  }

  sortedJson, err := json.Marshal(&notSortedMap)
  if err != nil {
      panic(err)
  }

  signData := base64.StdEncoding.EncodeToString(sortedJson)

  sign := sha256.Sum256([]byte(signData + secret))
fmt.Printf("Sign: %x", sign)
}
```

{% endtab %}
{% endtabs %}


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

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

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

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

## Проверка статуса аккаунта по username

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

**Headers**

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

**Body**

<table><thead><tr><th width="199">Name</th><th width="128">Type</th><th>Description</th></tr></thead><tbody><tr><td>username<mark style="color:red;">*</mark></td><td>String</td><td>Идентификатор пользователя</td></tr><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>info</td><td>Object</td><td><a href="#dopolnitelnyi-parametry-info">Дополнительные параметры </a>зависящие от категории услуг</td></tr></tbody></table>

```json
{
    "username": "1234AAA05",
    "agent": "agent1",
    "project": "project1",
    "service_code": "123",
    "info": {
        "parking": {
            "in_date": "2024-08-02T12:24:07+05:00",
            "left_free_time_minutes": 0,
            "sum": 118,
            "current_balance": -1,
            "zone": "1223-123",
            "duration":1,
            "coordinates": {
                "latitude": 123.12,
                "longitude": 123.0212
            },
            "phone": "77077777777"
        }
    }
}
```

**Response**

<table><thead><tr><th width="225">Name</th><th width="127">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>Integer</td><td>Код ошибки</td></tr><tr><td>-message</td><td>String</td><td>Описание ошибки</td></tr><tr><td>-account_status</td><td>Integer</td><td>Состояние аккаунта. Подробнее см. <a href="/pages/YUloDDPFkkik12mFC87G">в справочнике состояния аккаунта</a></td></tr><tr><td>-amount</td><td>Float</td><td>Фиксированная сумма платежа</td></tr><tr><td>-upper_commission</td><td>Float</td><td>Верхняя коммиссия</td></tr><tr><td>-fail_reason</td><td>Object</td><td><a href="/pages/aDAr4103dYpfrCk9sdYO">Причина</a> неуспеха проведения платежа</td></tr><tr><td>-info</td><td>Object</td><td><a href="#dopolnitelnyi-parametry-info">Дополнительные параметры </a>зависящие от категории услуг</td></tr></tbody></table>

## Дополнительные параметры (info)

В теле ответа приходят дополнительные параметры зависящие от категории услуги, тип услуги записывается как  ключ в объекте info <br>

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

<pre class="language-json"><code class="lang-json"><strong>"info": {
</strong>    "parking": {
        "in_date": "2024-08-02T12:24:07+05:00",
        "left_free_time_minutes": 0,
        "sum": 118,
        "current_balance": -1,
        "zone":"1223-123",
        "coordinates": {
            "latitude":123.12,
            "longitude":123.0212
        },
        "duration":1,
        "phone":"77077777777"
    }
}
</code></pre>

<table><thead><tr><th width="287">param</th><th>type</th><th>Desc</th></tr></thead><tbody><tr><td>in_date</td><td>timestamp</td><td>Время начала парковки</td></tr><tr><td>left_free_time_minutes</td><td>Float</td><td>Кол-во оставшихся минут на выезд</td></tr><tr><td>sum</td><td>Float</td><td>Стоимость парковки</td></tr><tr><td>current_balance</td><td>Float</td><td>Текущий баланс</td></tr><tr><td>zone </td><td>string</td><td>Зона парковки</td></tr><tr><td>coordinates</td><td>object</td><td>Объект с координатами</td></tr><tr><td>├latitude</td><td>float64</td><td>Широта</td></tr><tr><td>├longitude</td><td>float64</td><td>Долгота</td></tr><tr><td>duration</td><td>uint</td><td>Длительность в секундах</td></tr><tr><td>phone</td><td>string</td><td>Номер телефона</td></tr></tbody></table>
{% endtab %}

{% tab title="finance" %}

<pre class="language-json"><code class="lang-json"><strong>"info": {
</strong>    "finance": {
        "phone": "7777777777",
        "credit_days": 10,
        "contracts": [
            {
                "contract_id":"123456789",
                "contract_name":"Contract name",
                "contract_date": "03.01.2025 12:59:59",
                "client": "John Doe",
                "amount": 12.12,
                "total_amount": 12.12,
                "min": 1.23,
                "max": 12.12
            },
            {
                "contract_id":"987654321",
                "contract_name":"Name Contract",
                "contract_date": "17.02.2025 23:23:39",
                "client": "Doe John",
                "amount": 1292.64,
                "total_amount": 1292.64,
                "min": 100.21,
                "max": 1292.64
            }
        ]
    }
}

</code></pre>

<table><thead><tr><th width="287">param</th><th>type</th><th>Desc</th></tr></thead><tbody><tr><td>phone</td><td>string</td><td>Номер телефона</td></tr><tr><td>credit_days</td><td>uint</td><td>Количество дней для продления кредита</td></tr><tr><td>contracts</td><td>array</td><td>Массив контрактов</td></tr><tr><td>├contract_id</td><td>string</td><td>ID договора</td></tr><tr><td>├contract_name</td><td>string</td><td>Название контракта</td></tr><tr><td>├contract_date</td><td>string</td><td>Дата контракта</td></tr><tr><td>├client</td><td>string</td><td>Имя клиента</td></tr><tr><td>├amount</td><td>float</td><td>Сумма ежемесячного погашения</td></tr><tr><td>├total_amount</td><td>float</td><td>Остаток суммы по кредиту</td></tr><tr><td>├min</td><td>float</td><td>Минимальная сумма погашения</td></tr><tr><td>├max</td><td>float</td><td>Максимальная сумма погашения</td></tr></tbody></table>
{% endtab %}

{% tab title="utilities" %}

<pre class="language-json"><code class="lang-json"><strong>"info": {
</strong>    "utilities": {
        "customer": {
            "address": "г.Алматы, ул. Пушкина д. 10008 кв. 111112"
        },
        "invoice": {
            "invoice_id": "89878766212421",
            "period_date": "2025-01",
            "formed_date": "2025-01-11 21:39:00",
            "expire_date": "2025-01-21"
        },
        "service": [
<strong>            {
</strong>                "fix_sum": 1234.32,
                "service_id": "1123",
                "service_name": "Service Name",
                "measure": "тг/кВт.сағ.",
                "fix_count": 0,
                "prev_count": 500,
                "last_count": 570,
                "debt_sum": 0,
                "debt_info": "",
                "prev_count_date": "2024-12-31",
                "last_count_date": "2025-01-25",
                "sum": 0,
                "pay_sum": 0,
                "is_counter_service": true
            },
            {
                "fix_sum": 1234.32,
                "service_id": "1123",
                "service_name": "Service Name",
                "measure": "тг/кВт.сағ.",
                "fix_count": 0,
                "prev_count": 500,
                "last_count": 570,
                "debt_sum": 0,
                "debt_info": "",
                "prev_count_date": "2024-12-31",
                "last_count_date": "2025-01-25",
                "sum": 0,
                "pay_sum": 0,
                "is_counter_service": false
            }                
        ]
    }
}
</code></pre>

<table><thead><tr><th width="287">param</th><th width="161">type</th><th>Desc</th></tr></thead><tbody><tr><td>customer</td><td>object</td><td>Объяект с информацией о клиенте</td></tr><tr><td>├address</td><td>string</td><td>Адрес клиента</td></tr><tr><td>invoice</td><td>object</td><td>Объект с данными о счете</td></tr><tr><td>├invoice_id</td><td>string</td><td>Уникальный идентификатор счета</td></tr><tr><td>├period_date</td><td>string</td><td>Период счета</td></tr><tr><td>├formed_date</td><td>string</td><td>Дата формирования счета</td></tr><tr><td>├expire_date</td><td>string</td><td>Дата окончания срока оплаты</td></tr><tr><td>service</td><td>array</td><td>Массив сервисов</td></tr><tr><td>├fix_sum</td><td>float</td><td>Фиксированная сумма к оплате</td></tr><tr><td>├service_id</td><td>string</td><td>Идентификатор услуги</td></tr><tr><td>├service_name</td><td>string</td><td>Название сервиса</td></tr><tr><td>├measure</td><td>string</td><td>Единица измерения услуги</td></tr><tr><td>├fix_count</td><td>float</td><td>Фиксированное показание счетчика</td></tr><tr><td>├prev_count</td><td>float</td><td>Предыдущие показания счетчика</td></tr><tr><td>├last_count</td><td>float</td><td>Последние показания счетчика</td></tr><tr><td>├debt_sum</td><td>float</td><td>Сумма задолженности</td></tr><tr><td>├debt_info</td><td>string</td><td>Информация о задолженности</td></tr><tr><td>├prev_count_date</td><td>string</td><td>Дата предыдущих показаний</td></tr><tr><td>├last_count_date</td><td>string</td><td>Дата текущих показаний</td></tr><tr><td>├sum</td><td>float</td><td>Общая сумма</td></tr><tr><td>├pay_sum</td><td>float</td><td>Сумма которую платит клиент</td></tr><tr><td>├is_counter_service</td><td>bool</td><td>Является ли услуга счетчиком (<code>true</code> – да, <code>false</code> – нет)</td></tr></tbody></table>
{% endtab %}

{% tab title="confirmation" %}

```json
"info": {
    "confirmation": {
        "code": "967056",
        "expiration_date": "2025-09-09T13:22:18Z" //Дата и Время в стандарте RFC 3339
    }
}
```

{% endtab %}
{% endtabs %}

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

```json
{
  "status": true,
  "message": "Success",
  "status_code": 0,
  "result": {
    "error_code": 0,
    "message": "This account is active",
    "account_status": 1,
    "info": {
      "parking": {
        "in_date": "2025-01-06T16:32:00Z",
        "left_free_time_minutes": 0,
        "sum": 1137,
        "current_balance": -1,
        "coordinates": {
          "latitude": 0,
          "longitude": 0
        },
        "zone": "",
        "duration": 0,
        "phone": ""
      }
    },
    "fail_reason": {},
    "amount": 1138,
    "upper_commission": 122
  }
}
```

{% endtab %}

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

```json
{
    "status": true,
    "status_code": 0,
    "message": "Success",
    "result":{
        "error_code" : 0,
        "message": "This account is inactive",
        "account_status": 0,
        "additional_data": {},
        "fail_reason": {
            "code": 100,
            "message": "Unknown reason, clarification required"
        }
    }
}
```

{% endtab %}
{% endtabs %}

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

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

```json
{
    "status": false,
    "status_code": 1407,
    "message": "Cache: item not found",
    "result": {}
}
```

{% endtab %}

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

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

{% endtab %}
{% endtabs %}

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

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

```json
{
    "status": true,
    "status_code": 0,
    "message": "Success",
    "result": {
        "error_code": 1407,
        "message": "Cache: item not found",
        "data": null,
    }
}
```

{% endtab %}

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

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

{% endtab %}
{% endtabs %}

Проверка аккаунта

{% tabs %}
{% tab title="Golang" %}
{% code fullWidth="true" %}

```go
package main

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

const (
	// agent - код витрины на стороне Tarlan
	agent = "agent"
	// serviceCode - идентификатор услуги витрины
	serviceCode = "service"
	// project - код проекта на стороне Tarlan
	project = "project"
	// requestURL - URL для отправки запроса
	requestURL = "https://agwsapi.tarlanpayments.kz/showcase-gateway/api/v1/user/check"
	// secretKey - secret проекта
	secretKey = "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      int      `json:"error_code"`
	Message        string   `json:"message"`
	AccountStatus  uint64   `json:"account_status"`
}

// 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
	}
	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 {
	message = response.Result.Message + " " + body.UserName
	} else {
	message = response.Message
	}
	}
	if resp.StatusCode != http.StatusOK {
	message = response.Message
	}

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

func main() {
	// login пользователя
	var login string = "login"

	// requestBody тело запроса
	requestBody := Body{
		Agent:       agent,
		UserName:    login,
		Project:     project,
		ServiseCode: serviceCode,
	}

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

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

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

```

{% endcode %}
{% endtab %}
{% endtabs %}


# Проведение платежа

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

**Headers**

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

**Body**

<table><thead><tr><th width="185">Name</th><th width="92">Type</th><th width="488">Description</th></tr></thead><tbody><tr><td>username<mark style="color:red;">*</mark></td><td>String</td><td>Идентификатор пользователя</td></tr><tr><td>amount<mark style="color:red;">*</mark></td><td>Float</td><td>Сумма транзакции</td></tr><tr><td>agent<mark style="color:red;">*</mark></td><td>String</td><td>Код витрины в системе Tarlan</td></tr><tr><td>project<mark style="color:red;">*</mark></td><td>String</td><td>Код Проекта присваиваемый Tarlan-ом</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><tr><td>datetime<mark style="color:red;">*</mark></td><td>String</td><td>Время инициации платежа в системе витрины. Формат ISO 8601 Current Timestamp</td></tr><tr><td>callback_url</td><td>String</td><td>URL на который будет отправлен <a href="/pages/cbUK7pLBFETklwz1F7Dg">callback запрос</a></td></tr></tbody></table>

**Response**

<table><thead><tr><th width="193">Параметры</th><th width="128">Формат</th><th>Описание</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>--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><tr><td>--fail_reason</td><td>Object</td><td><a href="/pages/aDAr4103dYpfrCk9sdYO">Причина</a> неуспеха проведения платежа</td></tr><tr><td>---code</td><td>Int</td><td>Код причины отклонения операции</td></tr><tr><td>---message</td><td>String</td><td>Описание причины отклонения операции</td></tr><tr><td>--info</td><td>Object</td><td><a href="/pages/DiqirW97TwXzdfaGMlF7#confirmation">Дополнительные параметры </a>зависящие от категории услуг</td></tr></tbody></table>

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

<pre class="language-json"><code class="lang-json"><strong>{
</strong>    "status": true,
    "message": "Success",
    "status_code": 0,
    "result": {
        "error_code": 0,
        "message": "",
        "data": {
            "external_id": "111111111111111",
            "project": "project-1",
            "service_code": "service_code1",
            "username": "415304197",
            "amount": 9.56,
            "datetime": "2025-01-01T01:01:01+05:00",
            "status_code": "2",
            "status_message": "Transaction successfully processed"
        },
        "fail_reason": {},
        "info": {
            "confirmation": {
                "code": "967056",
                "expiration_date": "2025-09-09T13:22:18Z"
            }
        }
    }
}
</code></pre>

{% endtab %}

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

```json
{
    "status": true,
    "message": "Success",
    "status_code": 0,
    "result": {
        "error_code": 0,
        "message": "",
        "data": {
            "external_id": "111111111111111",
            "project": "project-1",
            "service_code": "service_code1",
            "username": "415304197",
            "amount": 9.56,
            "datetime": "1747393302",
            "status_code": "1",
            "status_message": "Transaction created"
        },
        "fail_reason": {},
        "info": {
            "confirmation": {
                "code": "967056",
                "expiration_date": "2025-09-09T13:22:18Z"
            }
        }
    }
}

```

{% endtab %}

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

```json
{
    "status": true,
    "status_code": 0,
    "message": "Success",
    "result" : {
        "error_code" : 1042,
        "message": "Duplicate external_id",
        "data": null,
        "additional_data":null
    }
}
```

{% 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"
	// requestURL - URL для отправки запроса
	requestURL = "https://agwsapi.tarlanpayments.kz/showcase-gateway/api/v1/action/cash-in"
	// secretKey - secret проекта
	secretKey = "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 {
	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"`
	CallBackUrl string  'json:"callback_url,omitempty"`
}

// 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
}

// MakeCashIn отправляет POST-запрос и обрабатывает ответ
func MakeCashIn(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
	}
	}
	if resp.StatusCode != http.StatusOK {
	message = response.Message
	}

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

func main() {
	var (
		// login - логин пользователя
		login string = "login"
		// externalID - номер заказа
		externalID string = "reference"
		// amount - сумма платежа
		amount float64 = 10.01
	)
	// Тело запроса
	requestBody := Body{
		UserName:    login,
		Agent:       agent,
		Project:     project,
		ServiseCode: serviceCode,
		Amount:      amount,
		ExternalID:  externalID,
		DateTime:    time.Now().Format(time.RFC3339),
	}

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

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

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

	}
}

```

{% endtab %}
{% endtabs %}


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

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

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

Нажмите [здесь](#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) |

**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 %}


# Проверка остатка баланса на счету

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

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

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

**Headers**

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

**Body**

| Name                                    | Type   | Description                  |
| --------------------------------------- | ------ | ---------------------------- |
| agent<mark style="color:red;">\*</mark> | String | Код витрины в системе Tarlan |

**Response**

<table><thead><tr><th width="181">Name</th><th width="132">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>-showcase_code</td><td>String</td><td>Код витрины в системе Tarlan</td></tr><tr><td>-balance</td><td>float</td><td>Текущий баланс</td></tr></tbody></table>

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

```json
{
    "status": true,
    "status_code": 0,
    "message": "Success",
    "result": {
        "showcase_code": "daw",
        "balance": 0
    }
}
```

{% endtab %}
{% endtabs %}

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

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

```json
{
    "status": false,
    "status_code": 8015,
    "message": "account doesn't exist",
    "result": {}
}
```

{% endtab %}

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

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

{% endtab %}
{% endtabs %}

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

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

```json
{
    "status": true,
    "status_code": 0,
    "message": "Success",
    "result": {
        "error_code": 8015,
        "message": "account doesn't exist",
        "data": null
    }
}
```

{% endtab %}

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

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

{% endtab %}
{% endtabs %}

Проверка баланса&#x20;

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

```go
package main

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

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

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

type Result struct {
	ShowcaseCode string  `json:"showcase_code"`
	Message      string  `json:"message"`
	Balance      float64 `json:"balance"`
}

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

// 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
}

// CheckBalance отправляет POST-запрос и обрабатывает ответ
func CheckBalance(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 {
	balance := strconv.FormatFloat(response.Result.Balance, 'f', -1, 64)
	message = "Showcase " + response.Result.ShowcaseCode + " balance is " + balance
	} else {
	message = response.Result.Message
	}
	} else {
	message = response.Message
	}

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

func main() {

	// URL Запроса
	RequestURL := url
	// Secret Проекта
	SecretKey := secret
	// Тело запроса
	requestBody := Body{
		Agent: agent,
	}

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

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

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

	}

}

```

{% endtab %}
{% endtabs %}


# Подтверждение списания средств

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

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

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

Для некоторых услуг необходимо подтверждать списание используя дополнительные атрибуты например отп-код.

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

**Headers**

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

**Body**

<table><thead><tr><th width="176">Name</th><th width="147">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>confirm_code</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="224">Name</th><th width="132">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>-is_success</td><td>String</td><td>Флаг успешности платежа</td></tr><tr><td>-transaction_status_id</td><td>String</td><td><a href="/pages/fL4gFQoVNVG3X7VhUUMw">Статус транзакции </a></td></tr><tr><td>-fail_reason</td><td>Object</td><td>Поле содержащее <a href="/pages/aDAr4103dYpfrCk9sdYO">причину неуспеха</a></td></tr><tr><td>-external_id</td><td>String</td><td>Идентификатор платежа на стороне витрины</td></tr><tr><td>-otp_status</td><td>bool</td><td>Флаг успешности проверки otp</td></tr></tbody></table>

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

```json
{
    "status": true,
    "status_code": 0,
    "message": "Success",
    "result": {
        "is_success": true,
        "transaction_status_id": "4",
        "external_id": "200001",
        "message": "",
        "otp_status": false,
        "fail_reason": {
            "code": 402,
            "message": "Incorrect confirmation code"
        }
    }
}
```

{% endtab %}
{% endtabs %}

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

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

```json
{
    "status": false,
    "status_code": 1041,
    "message": "Order not found",
    "result": {}
}
```

{% endtab %}

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

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

{% endtab %}
{% endtabs %}

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

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

```json
{
    "status": true,
    "status_code": 0,
    "message": "Success",
    "result": {
        "error_code": 1041,
        "message": "Order not found",
        "data": null
    }
}
```

{% endtab %}

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

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

{% endtab %}
{% endtabs %}

```bash
curl --location 'https://agwsapi.tarlanpayments.kz/showcase-gateway/api/v1/action/confirm/invoice' \ 
--header 'Content-Type: application/json' \ 
--data '{ 
    "agent": "test_agent",
    "confirm_code": "104000", 
    "external_id": "externa312" 
}'
```


# Создание ссылки на оплату

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

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

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

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

**Headers**

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

**Body**

<table><thead><tr><th width="177">Name</th><th width="129">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>username<mark style="color:red;">*</mark></td><td>String</td><td>Идентификатор пользователя</td></tr><tr><td>amount<mark style="color:red;">*</mark></td><td>Integer</td><td>Сумма транзакции</td></tr><tr><td>service<mark style="color:red;">*</mark></td><td>String</td><td>Название услуги</td></tr><tr><td>return_url</td><td>String</td><td>Ссылка для перехода после оплаты </td></tr><tr><td>refer_host<mark style="color:red;">*</mark></td><td>String</td><td>Домен с которого производится оплата</td></tr></tbody></table>

**Response**

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

```json
{
    "status": true,
    "message": "Success",
    "status_code": 0,
    "result": {
        "code": 0,
        "redirect_url": "https://kaspi.kz/pay/quickpayment?quick_pay_id=Betssonkzad1e50a5-6afd-481e-8e14-37487734ed292517:52:00",
        "message": "Успешно обработано",
        "qr_code_image": ""
    }
}
```

{% endtab %}
{% endtabs %}

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

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

```json
{
    "status": false,
    "status_code": 9718,
    "message": "provider not found",
    "result": {}
}
```

{% endtab %}

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

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

{% endtab %}
{% endtabs %}

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

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

```json
{
    "status": true,
    "status_code": 0,
    "message": "Success",
    "result": {
        "error_code": 1881,
        "code": -1,
        "message": "provider doesn't exists",
        "redirect_url": "",
        "qr_code_image": ""
    }
}
```

{% endtab %}

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

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

{% endtab %}
{% endtabs %}

```bash
curl --location 'https://agwsapi.tarlanpayments.kz/showcase-gateway/api/v1/action/link' \
--header 'X-Signature: qfqer1231' \
--header 'Content-Type: application/json' \
--data '{
    "agent": "test1",
    "user_id": "e41e6e7b-a0b9-46cf-ac10-bb8333fd6391",
    "amount": 10000,
    "service": "service1",
    "return_url": "https://www.youresite.com/",
    "refer_host": "site.kz"
}'
```


# Информация по услугам

Получение дополнительной информации о услуге

#### Получение дополнительной информации о услуге

<mark style="color:green;">`GET`</mark> `https://agwsapi.tarlanpayments.kz/showcase-gateway/api/v1/info/service/{service_group}`

#### Получение дополнительной информации о пользователях

<mark style="color:green;">`GET`</mark> `https://agwsapi.tarlanpayments.kz/showcase-gateway/api/v1/info/user/{service_group}`

**Headers**

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

**Path params**

<table><thead><tr><th width="161">Name</th><th width="129">Type</th><th>Description</th></tr></thead><tbody><tr><td>service_group<mark style="color:red;">*</mark></td><td>String</td><td>Группа услуг (Влияет на тело ответа в API)</td></tr></tbody></table>

**Query params**

<table><thead><tr><th width="161">Name</th><th width="129">Type</th><th>Description</th></tr></thead><tbody><tr><td>service_code<mark style="color:red;">*</mark></td><td>String</td><td>Название услуги</td></tr><tr><td>project<mark style="color:red;">*</mark></td><td>String</td><td>Код Проекта присваиваемый Tarlan-ом</td></tr><tr><td>agent<mark style="color:red;">*</mark></td><td>String</td><td>Код витрины в системе Tarlanpayments</td></tr></tbody></table>

**Response** [информации о услуге](#poluchenie-dopolnitelnoi-informacii-o-usluge)

{% tabs %}
{% tab title="200: OK service\_group=parking" %}

<pre class="language-json"><code class="lang-json"><strong>{
</strong>    "status": true,
    "message": "Success",
    "status_code": 0,
    "result": {
        "error_code": 0,
        "message": "success",
        "data": [
            {
                "location": [
                    {
                        "lat": 10.0,
                        "lon": 10.0
                    }
                ],
                "center": {
                    "lat": 10.0,
                    "lon": 10.0
                },
                "description": "",
                "type": "",
                "amount": 10.0,
                "name": "",
                "id": "",
                "date": "2024-10-21T08:43:33Z", // Формат ISO 8601 Current Timestamp
                "active": true
            }
        ]
    }
}
</code></pre>

{% endtab %}

{% tab title="200 OK: Не может быть пополнен" %}

```json
{
    "status": true,
    "message": "Success",
    "status_code": 0,
    "result": {
        "error_code" : 1041,
        "message": "Order not found",
        "data": null,
        "additional_data": null
    }
}
```

{% endtab %}

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

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

{% endtab %}
{% endtabs %}

**Response** [информации о пользователях](#poluchenie-dopolnitelnoi-informacii-o-polzovatelyakh)

{% tabs %}
{% tab title="200: OK service\_group=parking" %}

```json
{
    "status": true,
    "message": "Success",
    "status_code": 0,
    "result": {
        "error_code": 5202,
        "message": "success",
        "data": [
            {
                "id": "123",
                "username": "123@gmail.com",
                "amount": 10.0,
                "date": "2024-10-21T08:43:33Z" //Формат ISO 8601 Current Timestamp
            }
        ]
    }
}
```

{% endtab %}
{% endtabs %}


# Получение информации о юзере

Проверка состояния аккаунта и получение информации о юзере

<mark style="color:green;">`GET`</mark>`https://agwsapi.tarlanpayments.kz/showcase-gateway/api/v1/service/{service_group}/users/{login}`

**Headers**

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

**Path params**

<table><thead><tr><th width="161">Name</th><th width="129">Type</th><th>Description</th></tr></thead><tbody><tr><td>service_group<mark style="color:red;">*</mark></td><td>String</td><td>Группа услуг (Влияет на тело ответа в API)</td></tr><tr><td>login<mark style="color:red;">*</mark></td><td>String </td><td>Идентификатор пользователя</td></tr></tbody></table>

**Query params**

<table><thead><tr><th width="161">Name</th><th width="129">Type</th><th>Description</th></tr></thead><tbody><tr><td>service_code<mark style="color:red;">*</mark></td><td>String</td><td>Название услуги</td></tr><tr><td>project<mark style="color:red;">*</mark></td><td>String</td><td>Код Проекта присваиваемый Tarlan-ом</td></tr><tr><td>agent<mark style="color:red;">*</mark></td><td>String</td><td>Код витрины в системе Tarlan</td></tr><tr><td>identifier</td><td>String</td><td>Дополнительный параметр, передаваемый в зависимости от услуги</td></tr></tbody></table>

**Response**

{% tabs %}
{% tab title="200: OK Успешный ответ" %}

```json
{
    "status": true,
    "message": "Success",
    "status_code": 0,
    "result": {
        "error_code": 0,
        "message": "This account is active",
        "account_status": 1,
        "invoice": [
            {
                "amount": 100.5,
                "min_amount": 10.0,
                "contract_name": "test",
                "contract_number": "12345",
                "fio": "Иванов Иван"
            },
        ]
    }
}
```

{% endtab %}

{% tab title="200: OK Неуспешный ответ" %}

```json
{
    "status": true,
    "message": "Success",
    "status_code": 0,
    "result": {
        "error_code": 0,
        "message": "This account is inactive",
        "account_status": 0,
        "invoice": null,
        "additional_data": {
            "error_message": ""
        }
    }
}
```

{% endtab %}

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

```json
{
    "status": true,
    "message": "Success",
    "status_code": 0,
    "result": {
        "error_code": 9718,
        "message": "provider not found",
        "account_status": 0,
        "invoice": null,
        "additional_data": null
    }
}
```

{% endtab %}

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

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

{% endtab %}
{% endtabs %}


# Callback платежной системы

Метод предназначен для оповещения системы проекта о статусе платежа.

### Backoff Policy

Для увеличения гарантий получения ответа используются BackOff-политики при выполнении запросов:

* интервалы между повторными запросами = 500 Millisecond
* Разброс запроса по времени между повторами  = 0.5
* Максимальное время между повторами  = 60 Second
* Время в течении которого будут выполнены попытки  = 10 Minute

#### Callback платежной системой после каждой операции

После завершения оплаты, платежная система делает запрос в проект партнера для передачи состояния платежа. Запрос делается на адрес указанный в поле `callback_url` при [проведении платежа.](/agws/provedenie-platezha)

При получении http статуса отличного от 200  будут выполнены BackOff политики

## Отправка callback-a

<mark style="color:green;">`POST`</mark>`https://merchant-website/result`

#### Headers

| Name                                            | Type   | Description                                                                         |
| ----------------------------------------------- | ------ | ----------------------------------------------------------------------------------- |
| Authorization<mark style="color:red;">\*</mark> | String | Bearer  Авторотационный хэш (см [Формирование подписи](/agws/formirovanie-podpisi)) |

#### Request Body

<table><thead><tr><th width="193">Name</th><th width="111">Type</th><th>Description</th></tr></thead><tbody><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>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><tr><td>fail_reason</td><td>Object</td><td>Поле содержащее <a href="/pages/aDAr4103dYpfrCk9sdYO">причину неуспеха</a></td></tr><tr><td>-code</td><td>Int</td><td>Код причины отклонения операции</td></tr><tr><td>-message</td><td>String</td><td>Описание причины отклонения операции</td></tr></tbody></table>

```json
{
    "project": "Testing",
    "service_code": "70958",
    "external_id": "proident",
    "status_code": "4",
    "status_message": "Transaction was failed",
    "amount": 100.82,
    "datetime": "fugiat sed",
    "username": "enim culpa eiusmod laborum",
    "fail_reason": {
        "code": 6132012,
        "message": "nulla Ut eu dolore"
    }
}
```


# Получение фискального чека

Метод получения фискального номера и чека по идентифиакатору платежа

<mark style="color:green;">`GET`</mark>`https://agwsapi.tarlanpayments.kz/fiscalization/api/v1/payment/fiscalization/order`&#x20;

### Headers

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

### Query Params

<table><thead><tr><th width="267">Key</th><th>Description</th></tr></thead><tbody><tr><td>provider_order_id</td><td>Идентификатор платежа на стороне поставщика услуг</td></tr><tr><td>provider_code</td><td>Код поставщика услуг</td></tr><tr><td>provider_service_code</td><td>Код услуги поставщика услуг</td></tr></tbody></table>

### Response body parameters

<table><thead><tr><th width="196">Name</th><th width="130">Type</th><th>Description</th></tr></thead><tbody><tr><td>status</td><td>boolean</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>-fiscal_number</td><td>string</td><td>Фискальный признак чека</td></tr><tr><td>-fiscal_check_url</td><td>string</td><td>Ссылка для отображения фискального чека</td></tr></tbody></table>

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

```json
{
    "status": true,
    "message": "Success",
    "result": {
        "fiscal_number": "123456789123",
        "fiscal_check_url": "https://link.kz"
    }
}
```

{% endcode %}
{% endtab %}

{% tab title="400: Bad Request Пример ответа с ошибкой" %}

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

{% endtab %}
{% endtabs %}

```bash
curl --location 'https://agwsapi.tarlanpayments.kz/fiscalization/api/v1/payment/fiscalization/order?provider_order_id=pr10010&provider_code=code&provider_service_code=service_code'
--header 'X-Signature: 3eec10e27f3b9ee198d2edfbf7ff7bce431940d88ed4201assadzxczxczxasd'
```


# Расчет верхней комиссии

Метод для расчета верхней комиссии без фактического списания средств

<mark style="color:yellow;">`POST`</mark>`https://agwsapi.tarlanpayments.kz/showcase-gateway/api/v1/calculate/upper/commission`&#x20;

### Headers

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

### Request body parameters

<table><thead><tr><th width="188">Name</th><th width="146">Type</th><th>Description</th></tr></thead><tbody><tr><td>agent</td><td>string</td><td>Код витрины в системе Tarlanpayments</td></tr><tr><td>project</td><td>string</td><td>Код Проекта в системе Tarlanpayments</td></tr><tr><td>service_code</td><td>string</td><td>Идентификатор услуги в системе Tarlanpayments</td></tr><tr><td>amount</td><td>float64</td><td>Сумма для которой необходимо расчитать верхнюю комиссию</td></tr></tbody></table>

### Response body parameters

<table><thead><tr><th width="227">Name</th><th width="172">Type</th><th>Descriotion</th></tr></thead><tbody><tr><td>status</td><td>boolean</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>-amount</td><td>float64</td><td>Сумма для которой необходимо было расчитать верхнюю комиссию</td></tr><tr><td>-amount_with_commission</td><td>float64</td><td><p>Итоговая сумма с верхней комиссией</p><p>(amount + commission)</p></td></tr><tr><td>-commission</td><td>float64</td><td>Сумма верхней комиссией</td></tr></tbody></table>

### Response examples

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

```json
{
    "status": true,
    "message": "Success",
    "status_code": 0,
    "result": {
        "amount": 10.4,
        "amount_with_commission": 11.84,
        "commission": 1.44
    }
}
```

{% endtab %}

{% tab title="400: Bad Request Пример ответа с ошибкой" %}

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

{% endtab %}
{% endtabs %}

```bash
curl --location 'https://agwsapi.tarlanpayments.kz/showcase-gateway/api/v1/calculate/upper/commission' \
--header 'X-Signature: 7ff51c9f26c287e42fa37537df719974e297a751c4e2eba26d7622sgwgf225543sa' \
--header 'Content-Type: application/json' \
--data '{
    "agent":"agent",
    "project":"project",
    "service_code":"service",
    "amount": 10.42
}'
```


# Жалпы ақпарат

**Төлем шлюзі** мен сіздің қосымшаңыз немесе веб-сайтыңыз арасындағы интеграцияны қамтамасыз ететін бағдарламалық шешім болып табылады. Бұл құжат төлем шлюзімен өзара іс-қимыл жасау үшін қажетті әдістердің егжей-тегжейлерін сипаттайды.

***

### Терминдер мен қысқартулар

&#x20;**API: Application Programming Interface** — Application Programming Interface – сыртқы бағдарламалық өнімдерде пайдалану үшін қосымшамен (жүйемен) ұсынылатын дайын әдістердің жиынтығы.

**REST: Representational State Transfer** — желідегі үлестірілген қосымша компоненттерінің өзара іс-қимылының архитектуралық стилі.

**JSON: JavaScript Object Notation** — RFC 7159 JavaScript негізделген деректер алмасудың мәтіндік форматы.

**3DS: 3-D Secure** — интернет арқылы төлем операцияларын жасау кезінде банк картасын ұстаушыны сәйкестендіру үшін пайдаланылатын карточкалық деректерді қорғау хаттамасы. Tarlan Payments хаттаманың 3DS 1.0 нұсқасын да, 3DS 2.0 нұсқасын да қолдайды.

**ТСП, Мерчант** — Жүйемен жұмыс істейтін сауда-сервистік кәсіпорын.

**Проект (Жоба)—** әріптестің (мерчанттың) еншілес мәні. Мерчантқа заңды тұлғаларды, терминалдарды, сондай-ақ есептерді ажыратуға мүмкіндік береді.

**Мерчант(серіктес)** – қызметтерді жүзеге асыру, тауарларды сату және т.б. үшін ақшалай қаражат алуға мүмкіндігі бар заңды тұлға. Сондай-ақ жобалардың біріктіруші мәні болып табылады.

**Құпия кілт** – Жобаны сәйкестендіру үшін пайдаланылатын оны авторландыруға арналған символдық жол.

**Төлем токені** – Акцептісіз төлемдер үшін картаның деректері бойынша жасалған символ жолы.

***

### Имплементациялау кезеңдері

1. Қосылуға өтінімді [tarlanpayments.kz ](https://tarlanpayments.kz/)сайтында қалдырыңыз

*Өтінімді өңдегеннен кейін Қолдау қызметінің менеджері сіздермен қосылудың ықтимал нұсқаларын талқылайды, қажетті құжаттарды сұрайды, банктермен бірігу процесін, шартты, терминалды құруды іске қосады.*

2. Жеке кабинетке рұқсаттама алыңыз.\
   *Төлемдерді қабылдау хаттамасына қосылған кезде сіз мерчанттың бірегей сәйкестендіргішін және Жеке кабинетке рұқсаттама аласыз. Қол жеткізу параметрлері тіркелу кезінде көрсетілген e-mail-ге жіберіледі.*
3. API-ге рұқсаттама кілтін шығарыңыз.

   *API-ге рұқсаттама кілті API-мен өзара әрекеттесу үшін пайдаланылады. Аккаунт-менеджерден API кілтін алыңыз.*
4. Өзара әрекеттестікті тестілеңіз.\
   *Қосылғанда сіздің сәйкестендіргішіңіз тестілік режимде болады. Осы режимде сіз операцияларды банк картасынан қаражатты есептен шығармай жүргізе аласыз.*

Сіздің тарапыңыздағы интеграция аяқталған кезде, біз сіздің project\_id сәйкестендіргішіңізді өндірістік режимге ауыстырамыз.

**Назар аударыңыз!** Өндірістік режимде қаражатты картадан нақты есептен шығару орындалады.

### Кері байланыс

Сұрақтар мен ұсыныстарды мына мекенжайға жіберуге болады:

&#x20;[support@tarlanpayments.kz](mailto:support@onevision.kz)

Сондай-ақ, [ресми сайттағы](https://tarlanpayments.kz/) «Байланыстар» бөлімінде көрсетілген деректемелер бойынша


# Төлемді жүргізу құрылымы

#### Төлем жүргізу қадамдары

1. Әріптес Клиенті Мерчант жобасында төлем жасауға сұрау салады
2. Жоба транзакцияны жасауға сұрау жібереді
3. Жоба төлем бетінің URL-ін алады
4. Жоба клиентті төлем бетіне қайта бағыттайды
5. Клиент карта деректерін енгізіп, «Төлеу» батырмасын басады
6. Төлем жүйесі сұрау алады, егер транзакцияны құру кезінде confirm\_url параметрі көрсетілсе, төлем жүйесі Мерчант жобасына сұрау салады
7. Жоба confirm\_url параметрінде көрсетілген мекенжай бойынша жауап береді. Егер жоба «200»-ден ерекшеленетін http-кодпен жауап берсе, транзакция үзіледі
8. Төлем жүйесі банкке сауал жібереді
9. Төлем жүйесі банктен транзакция мәртебесі көрсетілген жауап алады
10. Төлем жүйесі төлем бетінде чекті шығарады
11. Төлем жүйесі жобаға транзакция мәртебесін callback\_url параметрінде көрсетілген мекенжайға жібереді

#### Төлемді жүргізудің UML диаграммасы&#x20;

<img src="/files/QR0i73MAuNbsjJzFFKf5" alt="" class="gitbook-drawing">


# Екі сатылы төлем жүргізу құрылымы

#### Төлем жүргізу қадамдары

1. Әріптес Клиенті Is\_hold = true параметрін көрсете отырып, Мерчант жобасында төлем жасауға сұрау салады
2. Жоба транзакцияны жасауға сұрау жібереді
3. Жоба төлем бетінің URL-ін алады
4. Жоба клиентті төлем бетіне қайта бағыттайды
5. Клиент карта деректерін енгізіп, «Төлеу» батырмасын басады
6. Төлем жүйесі сұрау алады, егер транзакцияны құру кезінде confirm\_url параметрі көрсетілсе, төлем жүйесі Мерчант жобасына сұрау салады
7. Жоба confirm\_url параметрінде көрсетілген мекенжай бойынша жауап береді. Егер жоба «200»-ден ерекшеленетін http-кодпен жауап берсе, транзакция үзіледі
8. Төлем жүйесі қаражатты бұғаттауға банкке сұрау жібереді
9. Төлем жүйесі банктен транзакция мәртебесі көрсетілген жауап алады
10. Төлем жүйесі төлем бетінде чекті шығарады
11. Төлем жүйесі жобаға транзакция мәртебесін callback\_url параметрінде көрсетілген мекенжайға жібереді
12. Мерчант жобасы API немесе ЖК қолдана отырып, қаражатты есепті шығарады немесе қаражатты бұғаттаудан бас тартады
13. Төлем жүйесі қаражатты есептен шығаруға немесе бұғаттаудан бас тарту үшін банкке сұрау жібереді

{% hint style="warning" %}
Белгілі бір уақыт өткеннен кейін қолма-қол ақшаны автоматты түрде есептен шығару жүзеге асырылады, осы кезеңді орнату ЖК-те жүзеге асырылады және 3-тен 13 күнге дейін болуы мүмкін
{% endhint %}

{% hint style="info" %}
Барлық бұғатталған қаражатты есептен шығару немесе жою **қол жетімді**
{% endhint %}

#### UML-төлем жүргізу диаграммасы

<img src="/files/QR0i73MAuNbsjJzFFKf5" alt="" class="gitbook-drawing">


# Операциялардың түрлері

**Қабылдау (pay in)** – Банк карталарын пайдалана отырып, Интернет арқылы жасалған тауарлар/қызметтерге ақы төлеу операциясы. Төлем кезінде ақша қаражаты төлем картасын ұстаушының шотынан Серіктестің пайдасына аударылады.

**Шығару (pay out)** – Шығару кезінде ақша қаражаты Серіктестің шотынан Серіктес клиентінің карточкалық шотына аударылады

**Қайтару (refund)** – Ақша қаражатын қайтару. Ақша қаражатын табысты қабылдағаннан кейін ғана қолжетімді.

***

**Екі сатылы төлем (pay in)** – Қосымша растауды талап ететін банк карталарын пайдалана отырып, Интернет арқылы жасалған тауарларға/қызметтерге ақы төлеу жөніндегі операция. Екі сатылы жұмыс тетігі банк картасының төлем қабілеттілігін тексеру (авторландыру) және ақша алу (қаржылық растау) процесін бөлуге мүмкіндік береді. Екі сатылы төлемнің бірінші сатысында картаны ұстаушының шотындағы қаражатты бұғаттау, ал екінші сатыда есептен шығару жүргізіледі

* **Есептен шығару** – Ақша қаражатын авторландырылғаннан кейін екі сатылы төлем кезінде ғана қолжетімді операция. Бұғатталған соманы толық және ішінара есептен шығаруға болады.
* **Жою** – Ақша қаражатын авторландырылғаннан кейін екі сатылы төлем кезінде ғана қолжетімді операция. Бұғатталған соманы толық және ішінара есептен шығаруға болады.

***

**Картаны байластыру (card link)** – Ақша қаражатын банк картасынан тiркелген есептен шығару (pay in) және одан әрi ақша қаражатын картаға қайтару (refund) кезiндегi операция.

**Акцептсіз қабылдау (one click pay in)** – Карточкалық деректерді енгізбей және 3DS аутентификациясыз төлем жүйесінде сақталған картаны пайдалана отырып ақша қаражатын қабылдау операциясы

**Акцептсіз шығару (one click pay out)** – Карточкалық деректерді енгізбей төлем жүйесінде сақталған картаны пайдалана отырып, ақша қаражатын шығару операциясы.


# 3D-Secure

**3-D Secure** – пайдаланушының екі факторлы аутентификациясы үшін онлайн-кредиттік және дебеттік карталардың қосымша қауіпсіздік деңгейі ретінде пайдаланылатын хаттама.

Мақсаты – ұстаушының түпнұсқалығын тексеру және картаны рұқсатсыз пайдаланудан қорғау.

**Бұл қалай жұмыс істейді:** картаның иесі картаның деректемелерін көрсетеді, одан әрі эмитенттің сайты ашылады, онда ұстаушыға құпиясөзді немесе құпия кодты енгізу ұсынылады.

Көп жағдайда код СМС-хабарламада жіберіледі. Егер код дұрыс көрсетілсе, төлем жүргізіледі. Егер жоқ болса, қабылданбайды.


# PCI DSS

PCI DSS – Visa және Mastercard төлем карталары индустриясында қабылданған ақпараттық қауіпсіздік стандарты. Карталарды төлеуге қабылдайтын барлық компаниялар стандарттың талаптарын сақтауға міндетті. Кейбір компаниялар өздерінің сәйкестігін растауы қажет.

***Қауіпсіздік стандарттарын сақтау***

Осы стандарт бағдарланған негізгі қағидат төлем карталарына байланысты деректерге қол жеткізуді барынша шектеуге ұмтылу болып табылады.

Ең жақсы шешім мұндай деректерді өңдеуден мүлдем аулақ болу және оның орнына төлемдерді қабылдау үшін сертификатталған провайдерлерге жүгіну деп есептеледі. Бұл іс жүзінде біз карта нөмірлерін сұрамауымыз керек және бермеуіміз керек дегенді білдіреді. Егер клиент картаның нөмірін, мысалы, төлем проблемасымен қоңырау шалу кезінде хабарлауға тырысса, біздің міндетіміз – бұл әрекетті дереу тоқтатып, неге мұндай деректерді қабылдай алмайтынымызды түсіндіру.

Егер деректер электрондық пошта арқылы немесе мессенджерлер арқылы келіп түссе, біз оларды жойып, карта деректерін жіберу қаупі туралы жіберушіге ескертуіміз керек.

Қорғалатын деректер деп біз мыналарды түсінеміз:

* Картаның толық нөмірі
* CVV2/CVC2 коды (картаның артқы жағында орналасқан үш сан).
* Карта иелерінің аттары
* Қолданылу мерзімі

Картаның бүркемеленген нөмірлері (алғашқы 6 және соңғы 4 сан) стандарт талаптарына сәйкес осындай қатаң қорғауды талап етпейді және ақылға қонымды шектерде пайдаланылуы мүмкін.

Tarlan Payments жыл сайын осы сертификаттаудан өтеді және PCI DSS-тің барлық талаптарына сәйкес келеді

<div align="left"><figure><img src="/files/x47gZEK8LfZioEznQVFe" alt=""><figcaption></figcaption></figure></div>


# Транзакция түрлері

<table data-full-width="true"><thead><tr><th width="205" align="center">код</th><th align="center">сипаты</th></tr></thead><tbody><tr><td align="center">in</td><td align="center">Пайдаланушының картасынан қаражатты есептен шығару</td></tr><tr><td align="center">out</td><td align="center">Жоба шотынан пайдаланушының картасына ақша қаражатын шығару</td></tr><tr><td align="center">one_click_pay_in</td><td align="center">Пайдаланушының сақталған картасы бойынша қаражатты есептен шығару</td></tr><tr><td align="center">one_click_pay_out</td><td align="center">Жоба шотынан сақталған пайдаланушы картасына қаражатты шығару</td></tr><tr><td align="center">refund</td><td align="center">Ақша қаражатын қайтару</td></tr><tr><td align="center">google_pay</td><td align="center">Google Pay технологиясының құралдары бойынша төлем</td></tr><tr><td align="center">apple_pay</td><td align="center">Apple Pay технологиясының құралдары бойынша төлем</td></tr><tr><td align="center">card_link</td><td align="center">Төлем жүйесінде пайдаланушының картасын байластыру (акцептсіз төлемдер үшін пайдаланылады)</td></tr></tbody></table>


# Жүйе жауаптарының құрылымы

Әрбір сұраудың жауабында: `status`, `status_code`, `message`, `result` өрістері бар.

Сұрауды сәтті өңдегенде, жауапта `status` параметрі әрқашан `true`-ге тең, ал  `status_code`  `0`-ге тең.

Басқа жағдайларда, `status_code` өрісі сұраудың дұрыс өңделмеу себебін көрсетеді.

|   Өріс атауы  | Деректер типі |                  Сипаты                  |
| :-----------: | :-----------: | :--------------------------------------: |
|    `status`   |     `bool`    | Өріс сұраудың сәтті өңделгенін көрсетеді |
| `status_code` |   `integer`   |                 Қате коды                |
|   `message`   |    `string`   |       Қате кодының мәтіндік сипаты       |
|    `result`   |    `object`   |        Сұралған ресурстың нәтижесі       |


# Қате кодтары

<table data-full-width="true"><thead><tr><th align="center">Қате коды</th><th align="center">Мәтіндік қолдау</th><th align="center">Сипаты</th><th align="center">HTTP status</th></tr></thead><tbody><tr><td align="center">1021</td><td align="center">request validation error</td><td align="center">Сұраныс өрісін тексеру қатесі</td><td align="center">400</td></tr><tr><td align="center">5102</td><td align="center">undefined transaction type</td><td align="center">Анықталмаған транзакция түрі</td><td align="center">404</td></tr><tr><td align="center">8301</td><td align="center">unexpected db error</td><td align="center">Ресурсты өңдеу кезінде анықталмаған қате</td><td align="center">500</td></tr><tr><td align="center">5400</td><td align="center">couldn't receive project data</td><td align="center">Жоба деректерін алу кезінде қате орын алды</td><td align="center">500</td></tr><tr><td align="center">5406</td><td align="center">invalid project secret</td><td align="center">Дұрыс емес хэш қалыптастыруы</td><td align="center">400</td></tr><tr><td align="center">8008</td><td align="center">project doesn't exist</td><td align="center">Жоба табылмады</td><td align="center">404</td></tr><tr><td align="center">5000</td><td align="center">transaction already exists</td><td align="center">Транзакция әлдеқашан жасалған</td><td align="center">400</td></tr><tr><td align="center">5101</td><td align="center">undefined transaction status</td><td align="center">Белгісіз транзакция күйі</td><td align="center">404</td></tr><tr><td align="center">5107</td><td align="center">transaction limit doesn't exist</td><td align="center">Транзакция шектеулері орнатылмаған</td><td align="center">404</td></tr><tr><td align="center">5006</td><td align="center">transaction amount limit is over</td><td align="center">Транзакция сомасы шегінен асып кетті</td><td align="center">400</td></tr><tr><td align="center">5003</td><td align="center">an error occurred while creating transaction</td><td align="center">Транзакция жасау кезінде қате орын алды</td><td align="center">500</td></tr><tr><td align="center">5202</td><td align="center">request failed</td><td align="center">Жобаға сұрау жіберу кезінде қате</td><td align="center">500</td></tr><tr><td align="center">1022</td><td align="center">couldn't parse response body</td><td align="center">Получен некорректный ответ</td><td align="center">500</td></tr><tr><td align="center">5205</td><td align="center">unavailable project server</td><td align="center">Не доступен сервер мерчанта при проведении <a href="/pages/BzTqzCAAzNMownRWaLfz">запроса на подтверждение транзакции</a></td><td align="center">500</td></tr><tr><td align="center">3108</td><td align="center">card doesn't exist </td><td align="center">Карта не найдена </td><td align="center">500</td></tr><tr><td align="center">3010</td><td align="center">inoperable transaction status for this method</td><td align="center">Статус транзакции не позволяет сделать повторный возврат</td><td align="center">400</td></tr></tbody></table>

**Провайдердің қате кодтары**

Төлемді қабылдамау себебін сипаттайтын қателер[ failed ](/az/t-lem-shlyuzi/tranzakciyalar-m-rtebeleri)күйімен жіберіледі Бұл қателер қосымша ретінде жіберіледі. параметрлері:

* Төлем күйі туралы [Webhook](broken://pages/J8upgdcouuqeSf3VAeOb)
* Транзакция күйінің сұрауында
* Транзакция күйінің сұрауында
* Төлем беті жоқ «One click» арқылы

<table data-full-width="true"><thead><tr><th>Қате коды</th><th>Мәтіндік қолдау</th><th>Сипаты</th></tr></thead><tbody><tr><td>100</td><td>undefined error</td><td>Анықталмаған қате</td></tr><tr><td>101</td><td>3DS authentication failed</td><td>3DSecure тексеру мүмкін болмады</td></tr><tr><td>102</td><td>invalid card</td><td>Жарамсыз карта</td></tr><tr><td>103</td><td>exceeds amount limit</td><td>Сома лимитінен асып кетті</td></tr><tr><td>104</td><td>exceeds transaction frequency limit</td><td>Транзакциялар жиілігінің шегінен асып кетті</td></tr><tr><td>105</td><td>transaction declined by an issuer</td><td>Транзакцияны эмитент банк қабылдамады</td></tr><tr><td>106</td><td>transaction declined by an acquirer</td><td>Транзакцияны эквайер банк қабылдамады</td></tr><tr><td>107</td><td>unavailable issuer</td><td>Эмитент банк қолжетімді емес</td></tr><tr><td>108</td><td>unavailable acquirer</td><td>Эквайер-банк қолжетімді емес</td></tr><tr><td>109</td><td>payment is forbidden for the merchant</td><td>Сатушыға төлем жасауға тыйым салынады</td></tr><tr><td>110</td><td>stolen card</td><td>Карта ұрланған</td></tr><tr><td>111</td><td>blocked card</td><td>Карта бұғатталған</td></tr><tr><td>112</td><td>non existent card</td><td>Карта жоқ</td></tr><tr><td>113</td><td>lost card</td><td>Карта жоғалған</td></tr><tr><td>114</td><td>card has expired</td><td>Картаның жарамдылық мерзімі аяқталды</td></tr><tr><td>115</td><td>incorrect CVV/CVC</td><td>CVV/CVC дұрыс емес</td></tr><tr><td>116</td><td>incorrect card number</td><td>Картаның нөмірі дұрыс емес</td></tr><tr><td>117</td><td>incorrect card expiration date</td><td>Картаның қолданыс мерзімі дұрыс емес</td></tr><tr><td>118</td><td>insufficient funds</td><td>Қаражат жеткіліксіз</td></tr><tr><td>119</td><td>suspicious client</td><td>Күдікті клиент</td></tr><tr><td>120</td><td>user did not pay</td><td>Пайдаланушы төлем жасамады</td></tr><tr><td>121</td><td>invalid threeD secure parameters</td><td>Жарамсыз 3D Secure параметрлері</td></tr><tr><td>122</td><td>Declined. Matches the Anti-Fraud Center list. Please contact [source_organization].</td><td>Қабылданбады. Ақпарат Алаяқтықты бақылау орталығының тізіміне сәйкес келеді. [source_organization] компаниясына хабарласыңыз.</td></tr></tbody></table>


# Транзакциялар мәртебелері

|        код        |                  атауы                 |                                                         сипаты                                                        |
| :---------------: | :------------------------------------: | :-------------------------------------------------------------------------------------------------------------------: |
|        new        |           Транзакция жасалды           |                                          Транзакцияны құру кезіндегі мәртебе                                          |
|     processed     |          Жұмыстағы транзакция          |                Пайдаланушы «Төлеу» батырмасын басты. Транзакция валидацияның барлық кезеңдерінен өтті.                |
|  threeds\_waiting | Транзакция 3ds серверінен жауап күтуде |                                               3D-Secure тексеруді күтуде                                              |
| threeds\_received |  Транзакция 3ds серверінен жауап алды  |                                              3DS серверінен жауап алынды                                              |
|       failed      |         Транзакция сәтсіз өтті         |                             Транзакция жүргізу кезінде эквайер банкі тарапынан болған қате                            |
|       refund      |          Транзакция қайтарылды         |                                    Пайдаланушы картасына ақшалай қаражат қайтарылды                                   |
|      canceled     |         Транзакция болдырылмады        |                                    Екі сатылы төлем кезінде транзакцияны болдырмау                                    |
|       retry       |    Транзакция қайталау мәртебесінде    |                     Қайта төлем жасау әрекеті. Пайдаланушы тарапынан енгізу қатесі болған жағдайда                    |
|      success      |          Транзакция сәтті өтті         | Ақша қаражаты пайдаланушының картасынан алынды (Қабылдау). Ақша қаражаты пайдаланушының картасына шығарылды (Шығару). |
|       holded      |      Транзакция күту мәртебесінде      |                                             Эквайер банкінен жауап күтуде                                             |
|  refund\_waiting  | Транзакция қайтаруды күту мәртебесінде |                          Қаражатты қайтару процесі іске қосылды. Транзакция қайтаруды күтуде.                         |
|     authorized    |       Транзакция авторландырылды       |                              Қаражат бұғатталды. Екі сатылы төлем кезінде пайдаланылады.                              |
|       error       |    Транзакция кезінде қате орын алды   |                                               Транзакция кезіндегі қате                                               |


# Қолтаңбаны қалыптастыру

Төлем жүйесімен өзара іс-қимыл жасау үшін сұрау салуларға SHA256 алгоритмін пайдалана отырып қол қойылады.

Қолтаңбаны қалыптастыру үшін:

1. POST сауал жағдайында requestData сауалының денесі әліпби бойынша сұрыпталады және BASE64-те кодталады.
2. GET сауал жағдайында, Query params-ты JSON-ға түрлендіреміз. <https://prapi.tarlanpayments.kz/transaction/api/v1/system/client/cards?merchant\\_id=123\\&project\\_id=124\\&project\\_client\\_id=999> В: { "merchant\_id" : 123, "project\_client\_id" : "999", "project\_id" : 124} Түрлендіргеннен кейін әліпби бойынша сұрыптаймыз және BASE64-те кодтаймыз.
3. Сауалдың (base64EncodedData) кодталған денесін және secret (мерчантқа төлем ұйымы береді) байланыстырамыз
4. SHA256 хеш-функциясын пайдалана отырып, алынған нәтижені хэштейміз (dataToSign)
5. Қолтаңбаны сауалының тақырыбына қосамыз Authorization: Bearer sign

{% hint style="warning" %}
**"" бос жол мәні бар өрістерді қоспағанда, бүкіл сұрау мәтіні қолтаңбаға қосылады.**
{% endhint %}

{% hint style="warning" %}
**Additional\_data өрісі қолтаңбаны қалыптастыруға қатыспайды**
{% endhint %}

{% code lineNumbers="true" %}

```bash
curl --location 'https://prapi.tarlanpayments.kz/transaction/...' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer ff1a38a78ccca1b313ae172307e49112066ec2f5a1dfa2a76110104da3012896'
--data-raw '{}'
```

{% endcode %}

{% tabs %}
{% tab title="PHP" %}
{% code lineNumbers="true" %}

```php
<?php

$requestData = [
    "project_client_id" => "9999",
    "merchant_id" => 1,
    "project_id" => 1,
    "additional_data" => ["key" => "This should be excluded"]
];

$secret = "12345";

// Remove the "additional_data" field from the request data
unset($requestData["additional_data"]);

// Sort the request data by keys in alphabetical order
ksort($requestData);

// Encode the sorted request data to JSON
$sortedJson = json_encode($requestData, JSON_UNESCAPED_SLASHES);

// Encode the sorted JSON to base64
$base64EncodedData = base64_encode($sortedJson);

// Concatenate the base64-encoded data with the secret
$dataToSign = $base64EncodedData . $secret;

// Hash the result to SHA-256
$sha256Hash = hash("sha256", $dataToSign);

echo $sha256Hash;
```

{% endcode %}
{% endtab %}

{% tab title="Python3" %}
{% code lineNumbers="true" %}

```python
import json
import base64
import hashlib

request_data = {
    "project_client_id": "9999",
    "merchant_id": 1,
    "project_id": 1,
    "additional_data": {"key":"This should be excluded"}
}

secret = "12345"

# Remove the "additional_data" field from the request data
if "additional_data" in request_data:
    del request_data["additional_data"]

# Sort the request data by keys in alphabetical order
sorted_data = json.dumps(
        request_data,
        sort_keys=True,
        ensure_ascii=False,
        separators=(',', ':'),
    )

# Encode the sorted JSON to base64
base64_encoded_data = base64.b64encode(sorted_data.encode()).decode()

# Concatenate the base64-encoded data with the secret
data_to_sign = base64_encoded_data + secret

# Hash the result to SHA-256
sha256_hash = hashlib.sha256(data_to_sign.encode()).hexdigest()

print(sha256_hash)
```

{% endcode %}
{% endtab %}

{% tab title="Golang" %}

<pre class="language-go" data-line-numbers><code class="lang-go">package main

import (
	"crypto/sha256"
	"encoding/base64"
	"encoding/json"
	"fmt"
)  // Тело берется из создания <a data-footnote-ref href="#user-content-fn-1">транзакции </a>

type Request struct {
	ProjectClientID string `json:"project_client_id"`
	MerchantId      uint64 `json:"merchant_id"`
	ProjectId       uint64 `json:"project_id"`
	AdditionalData  map[string]string `json:"additional_data"`
}

const secret = "12345"

func main() {
	request := Request{
		ProjectClientID: "9999",
		MerchantId:      1,
		ProjectId:       1,
		AdditionalData: map[string]string{
			"key": "This should be excluded",
		},
	}

	notSortedJson, err := json.Marshal(&#x26;request)
	if err != nil {
		panic(err)
	}

	var notSorteddMap map[string]interface{}

	
	if err = json.Unmarshal(notSortedJson, &#x26;notSorteddMap); err != nil {
		panic(err)
	}

	delete(notSortedMap, "additional_data")
	
	sortedJson, err := json.Marshal(&#x26;notSorteddMap)
	if err != nil {
		panic(err)
	}

	signData := base64.StdEncoding.EncodeToString(sortedJson)
	
	sign := sha256.Sum256([]byte(signData + secret))

	fmt.Printf("%x", sign)

}
</code></pre>

{% endtab %}

{% tab title="Dart" %}

```dart
const paymentSecretKey = "123";

String hashedSecretKey({
  required Map<String, dynamic> requestData,
}) {
  // Sort the request data by keys in alphabetical order
  List<MapEntry<String, dynamic>> sortedEntries = requestData.entries.toList()
    ..sort((a, b) => a.key.compareTo(b.key));
  Map<String, dynamic> sortedData = Map.fromEntries(sortedEntries);

  // Sort the request data by keys in alphabetical order
  String encodedData = json.encode(sortedData);

  // Encode the sorted JSON to base64
  String base64EncodedData = base64.encode(Utf8Encoder().convert(encodedData));

  // Concatenate the base64-encoded data with the secret
  String dataToSign = base64EncodedData + paymentSecretKey;

  // Hash the result to SHA-256
  Digest sha256Hash = sha256.convert(Utf8Encoder().convert(dataToSign));

  final result = sha256Hash.toString();
  log('auth token $result');

  return result;
}
```

{% endtab %}
{% endtabs %}

[^1]: [https://app.gitbook.com/o/gxK1VbNmJ8bcGc8xM5wD/s/dkkz4EKtpaWVPlq7ZwsC/\~/changes/61/spravochnik-metodov-api/vzaimodeistvie-s-formoi-oplaty](broken://pages/rssHNRC5ER4AUkwJxprp)


# Қосымша параметрлер

Төлем нысанымен өзара іс-қимыл кезінде additional\_data өрісі беріледі. Бұл өрісте төлем жүйесінде сақталатын және мерчантқа webhook-e-де төлем мәртебесі бар және транзакция мәртебесін сұрауда берілетін серпінді өлшем параметрлері бар.

{% hint style="warning" %}
**Additional\_data өрісі қолтаңбаны қалыптастыруға қатыспайды**
{% endhint %}


# Төлем нысанымен өзара іс-қимыл

Жүйенің төлем бетін пайдалана отырып транзакция құру

{% content-ref url="/pages/yacNAg6We8EcA7SXesJF" %}
[Ақша қаражатын қабылдауға бастамашылық жасау](/az/t-lem-shlyuzi/t-lem-nysanymen-zara-is-imyl/a-sha-arazhatyn-abyldau-a-bastamashyly-zhasau)
{% endcontent-ref %}

{% content-ref url="/pages/DuZft7hhZBasPvfyyNyU" %}
[Ақша қаражатын шығаруға бастамашылық жасау](/az/t-lem-shlyuzi/t-lem-nysanymen-zara-is-imyl/a-sha-arazhatyn-shy-aru-a-bastamashyly-zhasau)
{% endcontent-ref %}

{% content-ref url="/pages/SBB6MXqU0rDlsNLq2NWQ" %}
[Картаны байластыру](/az/t-lem-shlyuzi/t-lem-nysanymen-zara-is-imyl/kartany-bailastyru)
{% endcontent-ref %}


# Ақша қаражатын қабылдауға бастамашылық жасау

## Сақталған картасыз төлем

## Қабылдауға транзакция құру

<mark style="color:green;">`POST`</mark> `https://prapi.tarlanpayments.kz/transaction/api/v1/transaction/primal/pay-in`

#### Headers

| Name                                            | Type   | Description                                                                                               |
| ----------------------------------------------- | ------ | --------------------------------------------------------------------------------------------------------- |
| Authorization<mark style="color:red;">\*</mark> | String | Bearer  Авторотациялық хэш ([Қолтаңбаны қалыптастыруға ](/az/t-lem-shlyuzi/olta-bany-alyptastyru)қараңыз) |

#### Request Body

| Name                                                     | Type    | Description                                                                                                                                            |
| -------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
| amount<mark style="color:red;">\*</mark>                 | Float   | Төлем сомасы                                                                                                                                           |
| project\_client\_id                                      | String  | Жоба жағындағы клиент сәйкестендіргіші                                                                                                                 |
| callback\_url                                            | String  | Транзакция мәртебесімен коллбэкті түзету үшін жобаның URL-і (Сallback жіберуді қараңыз)                                                                |
| failure\_redirect\_url<mark style="color:red;">\*</mark> | String  | Сәтсіз төлемнен кейін пайдаланушының редиректісі орындалатын жоба беті. Егер параметр берілмесе, редирект `success_redirect_url`-де орындалатын болады |
| merchant\_id<mark style="color:red;">\*</mark>           | Integer | Төлем жүйесі беретін мерчант сәйкестендіргішіх                                                                                                         |
| project\_id<mark style="color:red;">\*</mark>            | Integer | <p>Төлем жүйесі беретін жобаның сәйкестендіргіші</p><p></p>                                                                                            |
| project\_reference\_id<mark style="color:red;">\*</mark> | String  | Жоба жағындағы тапсырыс нөмірі                                                                                                                         |
| success\_redirect\_url<mark style="color:red;">\*</mark> | String  | Сәтті төлегеннен кейін пайдаланушының редиректісі орындалатын жоба беті                                                                                |
| shipment                                                 | String  | Жеткізу мекенжайы                                                                                                                                      |
| confirm\_url                                             | String  | Төлемді жүргізуді растау үшін Жобаның URL-і (Төлемді жүргізуді растауды қараңыз)                                                                       |
| description<mark style="color:red;">\*</mark>            | String  | Төлемнің сипаты                                                                                                                                        |
| additional\_data                                         | Object  | Қосымша параметрлер                                                                                                                                    |

{% tabs %}
{% tab title="200: OK Сәтті жауап үлгісі" %}

```json
{
    "status": true,
    "message": "Success",
    "result": "https://process.tarlanpayments.kz?hash=$2a$10$nhrUYWm9sDVYqCL4LKxn9ugrdC4Pszz5wGaUsDYYIqCGc8ZA4Vu0y&transaction_id=100474"
}

```

{% endtab %}

{% tab title="500: Internal Server Error Қатесі бар жауап үлгісі" %}

```json
{
    "status": false,
    "status_code": 5000,
    "message": "transaction already exists",
    "result": {}
}
```

{% endtab %}
{% endtabs %}

CURL сауалының мысалы:

{% code fullWidth="true" %}

```bash
curl --location 'https://prapi.tarlanpayments.kz/transaction/api/v1/transaction/primal/pay-in' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer sign' \
--data-raw '{
    "amount": 10,
    "callback_url": "https://test.site/callback_url",
    "confirm_url": "https://test.site/confirm_url",
    "description": "999",
    "failure_redirect_url": "https://www.test.com",
    "merchant_id": 9999,
    "project_client_id": "999",
    "project_id": 9999,
    "project_reference_id": "999",
    "shipment": "Tarlan ave, Payments str.",
    "success_redirect_url": "https://www.test.com",
    "additional_data": {
        "test1": "value1",
        "test2": 2
    }
}'
```

{% endcode %}

### Сақталған карта бойынша төлем

`project_client_id`  параметрін беру кезінде пайдаланушы төлем пішінінде картаны сақтау мүмкіндігіне ие болады. Картаны сақтау үшін пайдаланушы төлем пішініндегі «картаны сақтау» түймесін басып, осы карта арқылы сәтті төлем жасауы керек.

Сақталған картаны пайдаланып келесі төлемдер үшін `project_client_id` параметрін өту керек.

Сақталған картаны пайдалана отырып төлем жасаудың ерекшелігі төлем процесін айтарлықтай жылдамдатып, жеңілдететін 3DS пайдаланушы аутентификациясының болмауы болып табылады.


# Ақша қаражатын шығаруға бастамашылық жасау

### Сақталған картасыз қаражатты шығару

## Қаражатты алу үшін транзакция жасау

<mark style="color:green;">`POST`</mark> `https://prapi.tarlanpayments.kz/transaction/api/v1/transaction/primal/pay-out`

#### Headers

| Name                                            | Type   | Description                                                                                       |
| ----------------------------------------------- | ------ | ------------------------------------------------------------------------------------------------- |
| Authorization<mark style="color:red;">\*</mark> | String | Авторотациялық хэш ([Қолтаңбаны қалыптастыруға ](/az/t-lem-shlyuzi/olta-bany-alyptastyru)қараңыз) |

#### Request Body

| Name                                                     | Type    | Description                                                                                                                                            |
| -------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
| amount<mark style="color:red;">\*</mark>                 | Float   | Төлем сомасы                                                                                                                                           |
| project\_client\_id                                      | String  | Жоба жағындағы клиент сәйкестендіргіші                                                                                                                 |
| callback\_url                                            | String  | Транзакция мәртебесімен коллбэкті түзету үшін жобаның URL-і (Сallback жіберуді қараңыз)                                                                |
| failure\_redirect\_url                                   | String  | Сәтсіз төлемнен кейін пайдаланушының редиректісі орындалатын жоба беті. Егер параметр берілмесе, редирект `success_redirect_url`-де орындалатын болады |
| merchant\_id<mark style="color:red;">\*</mark>           | Integer | Төлем жүйесі беретін мерчант сәйкестендіргіші                                                                                                          |
| project\_id<mark style="color:red;">\*</mark>            | Integer | Төлем жүйесі беретін жобаның сәйкестендіргіші                                                                                                          |
| project\_reference\_id<mark style="color:red;">\*</mark> | String  | Жоба жағындағы тапсырыс нөмірі                                                                                                                         |
| success\_redirect\_url<mark style="color:red;">\*</mark> | String  | Сәтті төлегеннен кейін пайдаланушының редиректісі орындалатын жоба беті                                                                                |
| shipment                                                 | String  | Жеткізу мекенжайы                                                                                                                                      |
| confirm\_url                                             | String  | Төлемді жүргізуді растау үшін Жобаның URL-і (Төлемді жүргізуді растауды қараңыз)                                                                       |
| description<mark style="color:red;">\*</mark>            | String  | Төлемнің сипаты                                                                                                                                        |
| additional\_data                                         | Object  | Қосымша параметрлер                                                                                                                                    |

{% tabs %}
{% tab title="200: OK Сәтті жауап үлгісі" %}

<pre class="language-json"><code class="lang-json"><strong>{
</strong>    "status": true,
    "message": "Success",
    "result": "https://process-dev.tarlanpayments.kz?hash=$2a$10$nhrUYWm9sDVYqCL4LKxn9ugrdC4Pszz5wGaUsDYYIqCGc8ZA4Vu0y&#x26;transaction_id=100474"
}

</code></pre>

{% endtab %}

{% tab title="500: Internal Server Error Қатесі бар жауап үлгісі" %}

<pre class="language-json"><code class="lang-json"><strong>{
</strong>    "status": false,
    "status_code": 5000,
    "message": "transaction already exists",
    "result": {}
}
</code></pre>

{% endtab %}
{% endtabs %}

CURL сауалының мысалы:

{% code fullWidth="true" %}

```bash
curl --location 'https://prapi.tarlanpayments.kz/transaction/api/v1/transaction/primal/pay-out' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer sign' \
--data-raw '{
    "amount": 10,
    "callback_url": "https://test.site/callback_url",
    "confirm_url": "",
    "description": "999",
    "failure_redirect_url": "https://www.test.com",
    "merchant_id": 9999,
    "project_client_id": "999",
    "project_id": 9999,
    "project_reference_id": "999",
    "shipment": "",
    "success_redirect_url": "https://www.test.com",
    "additional_data": {
        "test1": "value1",
        "test2": 2
    }
}'
```

{% endcode %}

## Сақталған картаға ақшаны алу

`project_client_id` параметрін беру кезінде пайдаланушы төлем пішінінде картаны сақтау мүмкіндігіне ие болады. Картаны сақтау үшін пайдаланушы төлем нысанындағы «картаны сақтау» түймесін басып, осы картадан ақшаны сәтті алуы керек.

Сақталған картаны пайдаланып келесі төлемдер үшін `project_client_id` параметрін өту керек.


# Картаны байластыру

1. Project\_client\_id көрсете отырып, картаны байластыру үшін транзакция құру.
2. 10 теңгеге төлем жасалады.
3. Мерчант төлем бетіне қайта жібереді.
4. Төлем жүргізілгеннен кейін 10 теңге қайтарылады.

{% hint style="info" %}
Мерчант картасын байластыру нәтижесін пайдаланушының байластырылған карталарының тізімін алу әдісінен біле аласыз, Webhook қаражатты есептен шығарғаннан кейін жіберіледі. Келесі төлемдер кезінде пайдаланушыға бұрын байластырылған карталар қолжетімді болады.
{% endhint %}

## Картаны байластыру үшін транзакция құру.

<mark style="color:green;">`POST`</mark> `https://prapi.tarlanpayments.kz/transaction/api/v1/transaction/primal/card-link`

#### Headers

| Name                                            | Type   | Description                                                                                            |
| ----------------------------------------------- | ------ | ------------------------------------------------------------------------------------------------------ |
| Authorization<mark style="color:red;">\*</mark> | String | Bearer Авторотациялық хэш ([Қолтаңбаны қалыптасуына ](/az/t-lem-shlyuzi/olta-bany-alyptastyru)қараңыз) |

#### Request Body

| Name                                                     | Type    | Description                                                                                                                                            |
| -------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
| project\_id<mark style="color:red;">\*</mark>            | Integer | Төлем жүйесі беретін жобаның сәйкестендіргіші                                                                                                          |
| merchant\_id<mark style="color:red;">\*</mark>           | Integer | Төлем жүйесі беретін мерчант сәйкестендіргіші                                                                                                          |
| project\_client\_id<mark style="color:red;">\*</mark>    | String  | Жоба жағындағы клиент сәйкестендіргіші                                                                                                                 |
| success\_redirect\_url<mark style="color:red;">\*</mark> | String  | Сәтті төлегеннен кейін пайдаланушының редиректісі орындалатын жоба беті                                                                                |
| failure\_redirect\_url<mark style="color:red;">\*</mark> | String  | Сәтсіз төлемнен кейін пайдаланушының редиректісі орындалатын жоба беті. Егер параметр берілмесе, редирект success\_redirect\_url-де орындалатын болады |
| description<mark style="color:red;">\*</mark>            | String  | Төлемнің сипаты                                                                                                                                        |
| additional\_data                                         | Object  | Қосымша параметрлер                                                                                                                                    |
| callback\_url                                            | String  | Транзакция мәртебесімен коллбэкті түзету үшін жобаның URL-і (Сallback жіберуді қараңыз)                                                                |

{% tabs %}
{% tab title="200: OK Сәтті жауап үлгісі " %}

```json
{
    "status": true,
    "message": "Success",
    "result": "https://process.tarlanpayments.kz?hash=$2a$10$nhrUYWm9sDVYqCL4LKxn9ugrdC4Pszz5wGaUsDYYIqCGc8ZA4Vu0y&transaction_id=100474"
}
```

{% endtab %}

{% tab title="500: Internal Server Error Қатесі бар жауап үлгісі" %}

```json
{
    "status": false,
    "status_code": 5000,
    "message": "transaction already exists",
    "result": {}
}
```

{% endtab %}
{% endtabs %}

{% code fullWidth="true" %}

```bash
curl --location 'https://prapi.tarlanpayments.kz/transaction/api/v1/transaction/primal/card-link'  \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer sign' \
--data-raw '{
    "callback_url": "https://test.site/callback_url",
    "description": "desc",
    "failure_redirect_url": "https://www.test.com",
    "merchant_id": 2222,
    "project_client_id": "999",
    "project_id": 111,
    "success_redirect_url": "https://www.test.com",
    "additional_data": {
        "test": "value",
        "qwerty": "123"
    }
}'
```

{% endcode %}


# Iframe

Төлем нысанын енгізу сыртқы сайт пайдаланушыларына төлемдерді өз сайты арқылы жүзеге асыруға мүмкіндік береді. Құжаттама төлем нысанын жасау, төлем деректерін өңдеу және Iframe өлшемін баптау бойынша қадамдарды ұсынады.

Іframe өлшемін орнату үшін width және height төлсипаттарын өзіңіздің iframe-нің HTML-кодында орнатыңыз:

```html
<iframe src="СІЗДІҢ_ТӨЛЕМ_ФОРМАНЫҢ_URL" width="360" height="700" frameborder="0"></iframe>
```

Мұнда width (ені) 360 пиксель болып орнатылған, ал height (биіктігі) 700 пиксель болып орнатылған. Бұл мәндер сіздің қалауларыңызға және сыртқы сайт дизайнына сәйкес бапталуы мүмкін.


# Төлем нысанынсыз төлемдер


# One click

Платеж по сохраненной карте

## Сақталған карта бойынша төлем

<mark style="color:green;">`POST`</mark> `https://prapi.tarlanpayments.kz/transaction/api/v1/system/one-click/pay-in`

#### Request Body

| Name                                                     | Type    | Description                                                                                                                 |
| -------------------------------------------------------- | ------- | --------------------------------------------------------------------------------------------------------------------------- |
| amount<mark style="color:red;">\*</mark>                 | Float   | Төлем сомасы                                                                                                                |
| callback\_url                                            | String  | Транзакция мәртебесімен коллбэкті түзету үшін жобаның URL-і (Сallback жіберуді қараңыз)                                     |
| card\_token<mark style="color:red;">\*</mark>            | String  | Webhook-тeн, карталар тізімінде немесе транзакция мәртебесінде картаны байластырғаннан кейін алынған төлем жүйесінің токені |
| description<mark style="color:red;">\*</mark>            | String  | Төлем сипаттамасы (50 таңба)                                                                                                |
| merchant\_id<mark style="color:red;">\*</mark>           | Integer | Төлем жүйесі беретін мерчант сәйкестендіргіші                                                                               |
| project\_client\_id<mark style="color:red;">\*</mark>    | String  | Жоба жағындағы клиент сәйкестендіргіші                                                                                      |
| project\_id<mark style="color:red;">\*</mark>            | Integer | Төлем жүйесі беретін жобаның сәйкестендіргіші                                                                               |
| project\_reference\_id<mark style="color:red;">\*</mark> | String  | Жоба жағындағы тапсырыс нөмірі                                                                                              |
| additional\_data                                         | Object  | Қосымша параметрлер                                                                                                         |

{% tabs %}
{% tab title="200: OK Сәтті жауап үлгісі" %}

```json
{
    "status": true,
    "message": "Success",
    "result": {
        "transaction_id": 140001455,
        "transaction_status_code": "success",
        "bank_code":"101",
        "bank_message":"3DS authentication failed"
    }
}
```

{% endtab %}

{% tab title="500: Internal Server Error Қатесі бар жауап үлгісі" %}

```json
{
    "status": false,
    "status_code": 5000,
    "message": "transaction already exists",
    "result": {}
}
```

{% endtab %}
{% endtabs %}

{% code lineNumbers="true" fullWidth="true" %}

```bash
curl --location 'https://prapi.tarlanpayments.kz/transaction/api/v1/system/one-click/pay-in' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer 123gf4d260ab38694d10833asdf3030d9a1cc75df4c598b0wer3230680923b1da7' \
--data-raw '{
    "amount": 10,
    "callback_url": "",
    "card_token": "sdsd13123",
    "description": "test",
    "merchant_id": 9999,
    "project_client_id": "9999",
    "project_id": 9999,
    "project_reference_id": "9999"
}'
```

{% endcode %}


# Көмекші әдістер

Төлем процесін оңтайландыру әдістері

{% content-ref url="/pages/4MvvIbMZ9D1L9qAU6Gfx" %}
[Транзакциялар мәртебелері](/az/t-lem-shlyuzi/tranzakciyalar-m-rtebeleri)
{% endcontent-ref %}

{% content-ref url="/pages/HCYEWvnTB4n3Hpbp9k9p" %}
[Карталар тізімін алу](/az/t-lem-shlyuzi/k-mekshi-dister/kartalar-tizimin-alu)
{% endcontent-ref %}

{% content-ref url="/pages/2xL2uTgRZj8hpWPsuabM" %}
[Төлемді қайтару](/az/t-lem-shlyuzi/k-mekshi-dister/t-lemdi-aitaru)
{% endcontent-ref %}


# Байластырылған пайдаланушы картасын жою

## Байластырылған пайдаланушы картасын жою

<mark style="color:red;">`DELETE`</mark> `https://prapi.tarlanpayments.kz/card/api/v1/system/client/card/pay-in`

#### Headers

| Name                                            | Type   | Description                                                                                               |
| ----------------------------------------------- | ------ | --------------------------------------------------------------------------------------------------------- |
| Authorization<mark style="color:red;">\*</mark> | String | Bearer  Авторотациялық хэш ([Қолтаңбаны қалыптастыруға ](/az/t-lem-shlyuzi/olta-bany-alyptastyru)қараңыз) |

#### Request Body

| Name                                           | Type    | Description                                   |
| ---------------------------------------------- | ------- | --------------------------------------------- |
| project\_id<mark style="color:red;">\*</mark>  | Integer | Төлем жүйесі беретін жобаның сәйкестендіргіші |
| card\_token<mark style="color:red;">\*</mark>  | String  | Төлем жүйесіндегі карта токені                |
| merchant\_id<mark style="color:red;">\*</mark> | Integer | Төлем жүйесі беретін мерчант сәйкестендіргіші |

{% tabs %}
{% tab title="200: OK Сәтті жауап үлгісі" %}

```json
{
    "status": true,
    "message": "Success",
    "result": "success"
}
```

{% endtab %}

{% tab title="500: Internal Server Error Қатесі бар жауап үлгісі" %}

```json
{
    "status": false,
    "status_code": 5406,
    "message": "invalid project secret",
    "result": {}
}
```

{% endtab %}
{% endtabs %}

{% code fullWidth="true" %}

```bash
curl --location --request DELETE 'https://prapi.tarlanpayments.kz/card/api/v1/system/client/card/pay-in' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer auth_tokem' \
--data '{
    "project_id": 3,
    "encrypted_card_id": "Qwerty12345",
    "merchant_id": 1
}'
```

{% endcode %}


# Транзакция мәртебесін тексеру

Транзакция күйін алу үшін жоба идентификаторы (project\_id) арқылы сұрау жасауға болады, күй туралы ақпарат нәтиже transaction\_status.code өрісінде сақталады.

## Транзакция мәртебесін алуға сауал

<mark style="color:blue;">`GET`</mark> `https://prapi.tarlanpayments.kz/transaction/api/v1/system/transaction/status`

#### Query Parameters

| Name                                                     | Type    | Description                                   |
| -------------------------------------------------------- | ------- | --------------------------------------------- |
| project\_reference\_id<mark style="color:red;">\*</mark> | String  | Жоба жағындағы тапсырыс нөмірі                |
| merchant\_id<mark style="color:red;">\*</mark>           | Integer | Төлем жүйесі беретін мерчант сәйкестендіргіші |
| project\_id<mark style="color:red;">\*</mark>            | Integer | Төлем жүйесі беретін жобаның сәйкестендіргіші |
| type<mark style="color:red;">\*</mark>                   | String  | Транзакция типі                               |

#### Headers

| Name                                            | Type   | Description                                                                                               |
| ----------------------------------------------- | ------ | --------------------------------------------------------------------------------------------------------- |
| Authorization<mark style="color:red;">\*</mark> | String | Bearer  Авторотациялық хэш ([Қолтаңбаны қалыптастыруға ](/az/t-lem-shlyuzi/olta-bany-alyptastyru)қараңыз) |

{% tabs %}
{% tab title="500: Internal Server Error Қатесі бар жауап үлгісі" %}

```json
{
    "status": false,
    "status_code": 5103,
    "message": "transaction not found",
    "result": {}
}
```

{% endtab %}

{% tab title="200: OK Сәтті жауап үлгісі" %}

<pre class="language-json" data-overflow="wrap"><code class="lang-json">{
    "status": true,
    "message": "Success",
    "result": {
        "id": 99999,
        "amount": 10,
        "description": "test",
        "user_phone": "87757715130",
        "user_email": "test@inbox.ru",
        "card_token": "sdfasdf23",
        "masked_pan": "0000-00XXXXXX-0000",
        "bank_code": "0", <a data-footnote-ref href="#user-content-fn-1">Код ошибки</a>
        "bank_message": ""
        "additional_data": {
            "abc": "111",
            "lkk": "123"
        },
        "transaction_status": {
            "code": "success",
            "name": "Транзакция прошла успешно"
        },
        "bank_reference_id": "100885",
        "created_at": "2023-10-04T10:05:02.93843Z"
    },
    "transaction_type": {
      "code": "out",
      "name": "Вывод"
    },
    "refunds" : [] // fields: amount, date.
}
</code></pre>

{% endtab %}
{% endtabs %}

```bash
curl --location 'https://prapi.tarlanpayments.kz/transaction/api/v1/system/transaction/status?merchant_id=1&project_id=42&project_reference_id=sanch92116&type=in' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer sign'
```

[^1]: [Код ошибки](broken://pages/NabOIjsudi6LZteJxIS7) передается в случае ошибки в транзакции


# Карталар тізімін алу

## Сақталған карталар тізімін алуға сауал

<mark style="color:blue;">`GET`</mark> `https://prapi.tarlanpayments.kz/transaction/api/v1/system/client/cards`

#### Query Parameters

| Name                                                  | Type    | Description                                   |
| ----------------------------------------------------- | ------- | --------------------------------------------- |
| merchant\_id<mark style="color:red;">\*</mark>        | Integer | Төлем жүйесі беретін мерчант сәйкестендіргіші |
| project\_client\_id<mark style="color:red;">\*</mark> | String  | Жоба жағындағы клиент сәйкестендіргіші        |
| project\_id<mark style="color:red;">\*</mark>         | Integer | Төлем жүйесі беретін жобаның сәйкестендіргіші |

#### Headers

| Name          | Type   | Description                                                                                               |
| ------------- | ------ | --------------------------------------------------------------------------------------------------------- |
| Authorization | String | Bearer  Авторотациялық хэш ([Қолтаңбаны қалыптастыруға ](/az/t-lem-shlyuzi/olta-bany-alyptastyru)қараңыз) |

{% tabs %}
{% tab title="200: OK Сәтті жауап үлгісі" %}

```json
{
    "status": true,
    "message": "Success",
    "result": [
        {
            "card_token": "",
            "masked_pan": "0000-00XXXXXX-0000"
        },
        {
            "card_token": "",
            "masked_pan": "0000-00XXXXXX-0000"
        },
        {
            "card_token": "",
            "masked_pan": "0000-00XXXXXX-0000"
        }
    ]
}
```

{% endtab %}

{% tab title="500: Internal Server Error Қатесі бар жауап үлгісі" %}

```json
{
    "status": false,
    "status_code": 1021,
    "message": "request validation error",
    "result": {}
}
```

{% endtab %}
{% endtabs %}

{% code overflow="wrap" lineNumbers="true" fullWidth="true" %}

```bash
curl --location 'https://prapi.tarlanpayments.kz/transaction/api/v1/system/client/cards?merchant_id=999&project_id=999&project_client_id=999' \
--header 'Authorization: Bearer sign' \
--data ''
```

{% endcode %}


# Төлемді қайтару

<mark style="color:green;">`POST`</mark> `https://prapi.tarlanpayments.kz/refund/api/v1/system/refund/partial`

#### Headers

| Name                                            | Type   | Description                                                                                               |
| ----------------------------------------------- | ------ | --------------------------------------------------------------------------------------------------------- |
| Authorization<mark style="color:red;">\*</mark> | String | Bearer  Авторотациялық хэш ([Қолтаңбаны қалыптастыруға ](/az/t-lem-shlyuzi/olta-bany-alyptastyru)қараңыз) |

#### Request Body

| Name                                              | Type    | Description                                   |
| ------------------------------------------------- | ------- | --------------------------------------------- |
| amount<mark style="color:red;">\*</mark>          | Integer | Қайтару сомасы                                |
| transaction\_id<mark style="color:red;">\*</mark> | Integer | Төлем жүйесіндегі транзакция сәйкестендіргіші |

{% tabs %}
{% tab title="200: OK Сәтті жауап үлгісі" %}

```json
{
    "status": true,
    "message": "Success",
    "result": {
        "transaction_id": 999,
        "transaction_status_code": 999
    }
}
```

{% endtab %}

{% tab title="500: Internal Server Error Қатесі бар жауап үлгісі" %}

```json
{
    "status": false,
    "status_code": 5103,
    "message": "transaction not found",
    "result": {}
}
```

{% endtab %}
{% endtabs %}

```bash
curl --location 'prapi.tarlanpayments.kz/refund/api/v1/system/refund/partial' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer sign' \
--data '{
    "amount": 10,
    "transaction_id": "refund"
}'
```


# Жоғарғы комиссияның есебі

<mark style="color:blue;">`GET`</mark> `https://prapi.tarlanpayments.kz/commission/api/v1/system/project/upper/commission`

#### Query Parameters

| Name                                                      | Type    | Description                                   |
| --------------------------------------------------------- | ------- | --------------------------------------------- |
| project\_id<mark style="color:red;">\*</mark>             | Integer | Төлем жүйесі беретін жобаның сәйкестендіргіші |
| merchant\_id<mark style="color:red;">\*</mark>            | Integer | Төлем жүйесі беретін мерчант сәйкестендіргіші |
| transaction\_type\_code<mark style="color:red;">\*</mark> | String  | Транзакция типі                               |
| transaction\_amount<mark style="color:red;">\*</mark>     | Float   | Транзакция сомасы                             |

#### Headers

| Name                                            | Type   | Description                                                                                               |
| ----------------------------------------------- | ------ | --------------------------------------------------------------------------------------------------------- |
| Authorization<mark style="color:red;">\*</mark> | String | Bearer  Авторотациялық хэш ([Қолтаңбаны қалыптастыруға ](/az/t-lem-shlyuzi/olta-bany-alyptastyru)қараңыз) |

{% tabs %}
{% tab title="200: OK Сәтті жауап үлгісі" %}

```json
{
    "status": true,
    "message": "Success",
    "result": {
        "total_commission_amount": 999.00
    }
}
```

{% endtab %}

{% tab title="500: Internal Server Error Қатесі бар жауап үлгісі" %}

```json
{
    "status": false,
    "status_code": 5102,
    "message": "commission not found",
    "result": {}
}
```

{% endtab %}
{% endtabs %}

{% code fullWidth="true" %}

```bash
curl --location 'https://prapi.tarlanpayments.kz/comission/api/v1/system/project/upper/commission?merchant_id=999&project_id=999&transaction_amount=1000.00&transaction_type_code=in' \
--header 'Authorization: Bearer sign' \
--data ''
```

{% endcode %}


# Smart Pay

1. Google pay


# Google pay

Google Pay – қосымшада және веб-сайтта сатып алуға мүмкіндік беретін онлайн төлем жүйесі. Жүйе пайдаланушыларға интернеттен, сондай-ақ телефондар, планшеттер және Android сағаттарының көмегімен онлайн төлем жасауға мүмкіндік береді.

Tarlan Payments-пен біріктірмес бұрын, Сізге [құжаттамамен ](https://developers.google.com/pay/api)танысу керек.

Сайттар үшін aқолдау көрсетілетін интеграция типі – Web.

Осы интеграция үшін келесі құжаттармен танысуыңыз қажет:

* [Веб-сайттардың Google Pay құжаттамасы](https://developers.google.com/pay/api/web/overview?hl=ru)
* [Веб-сайттарға арналған Google Pay интеграциясының бақылау тізімі](https://developers.google.com/pay/api/web/guides/test-and-deploy/integration-checklist?hl=ru)
* [Веб-сайттарға арналған Google Pay брендингінің нұсқаулары](https://developers.google.com/pay/api/web/guides/brand-guidelines?hl=ru)

Google Pay қызметімен жұмыс істеу үшін сізге [Google Pay & Wallet ](https://pay.google.com/business/console/)консолінде тіркеліп, Google сатушы сәйкестендіргішін алу қажет. Барлық сатушылар Google Pay API рұқсат етілген [пайдалану нұсқаулары ](https://payments.developers.google.com/terms/aup)мен [пайдалану шарттарын](https://payments.developers.google.com/terms/sellertos) орындауға міндетті.

Параметрлер үшін:

gateway мәнін көрсету қажет – tarlanpayments;

gatewayMerchantId көрсету қажет - Google сатушысының сәйкестендіргіші;

Аутентификацияның қолдау көрсетілетін әдістері: PAN\_ONLY және CRYPTOGRAM\_3DS.

Қолдау көрсетілетін төлем жүйелері: Visa және Master Card.

Төлем мекенжайын берудің қажеті жоқ.

Google-дан алынған төлем токенін token өрісіне string форматында беру қажет. Оны Google-ден алған түрінде беру керек. Қалған параметрлер төменде сипатталған.


# Төлем жүйесінің Webhook


# Төлем мәртебесі

Әдіс жоба жүйесін төлем мәртебесі туралы хабардар етуге арналған.

### Backoff Policy

Жауап алу кепілдіктерін ұлғайту үшін BackOff-саясат сауалдарды орындау кезінде пайдаланылады:

* InitialInterval = 500 \* time.Millisecond, қайталама сұрау аралықтары
* RandomizationFactor = 0.5,  Қайталаушылар арасындағы уақыт бойынша сұрау салуды шашу
* MaxInterval = 60 \* time.Second, Қайталаулар арасындағы максималды уақыт
* MaxElapsedTime = 10 \* time.Minute, оның ішінде әрекеттер орындалатын уақыт

**Әрбір операциядан кейін төлем жүйесімен Callback**

Төлем аяқталғаннан кейін төлем жүйесі төлем жағдайын беру үшін әріптестің жобасына сауал жібереді. Сауал төлем бастамашылығы кезінде `callback_url` өрісінде көрсетілген мекенжайға жасалады.

200 транзакциядан ерекшеленетін http мәртебесін алу кезінде BackOff саясаты орындалады

## Серіктес жобасының callback-a жіберу

<mark style="color:green;">`POST`</mark> `callback_url`&#x20;

#### Headers

| Name                                            | Type   | Description                                                                                               |
| ----------------------------------------------- | ------ | --------------------------------------------------------------------------------------------------------- |
| Authorization<mark style="color:red;">\*</mark> | String | Bearer  Авторотациялық хэш ([Қолтаңбаны қалыптастыруға ](/az/t-lem-shlyuzi/olta-bany-alyptastyru)қараңыз) |

#### Request Body

| Name                                                     | Type    | Description                                              |
| -------------------------------------------------------- | ------- | -------------------------------------------------------- |
| created\_at<mark style="color:red;">\*</mark>            | String  | Транзакцияның жасалған күні                              |
| transaction\_id<mark style="color:red;">\*</mark>        | Integer | Төлем жүйесі жағындағы транзакция сәйкестендіргіші       |
| acquirer\_code<mark style="color:red;">\*</mark>         | String  | Банк сәйкестендіргіші                                    |
| project\_reference\_id<mark style="color:red;">\*</mark> | String  | Жоба жағындағы транзакция сәйкестендіргіші               |
| project\_сlient\_id<mark style="color:red;">\*</mark>    | String  | Жоба жағындағы пайдаланушы сәйкестендіргіші              |
| status\_code<mark style="color:red;">\*</mark>           | String  | Транзакция мәртебесі                                     |
| type\_code<mark style="color:red;">\*</mark>             | String  | Транзакция типі                                          |
| amount<mark style="color:red;">\*</mark>                 | Float   | Транзакция сомасы                                        |
| description<mark style="color:red;">\*</mark>            | String  | Сипаты                                                   |
| finished\_at<mark style="color:red;">\*</mark>           | String  | Транзакцияның аяқталу күні                               |
| project\_id<mark style="color:red;">\*</mark>            | Integer | Жоба сәйкестендіргіші                                    |
| merchant\_id<mark style="color:red;">\*</mark>           | Integer | Мерчант сәйкестендіргіші                                 |
| additional\_data                                         | Object  | Қосымша өрістер                                          |
| card\_token                                              | String  | Төлем жүйесіндегі карта токені                           |
| masked\_pan                                              | String  | Бүркемеленген төлем картасы                              |
| bank\_code                                               | String  | Транзакцияда қате болған жағдайда қате коды жіберіледі   |
| bank\_message                                            | String  | Қатені сипаттау                                          |
| issuer                                                   | String  | Карта эмитенті                                           |
| ips                                                      | String  | Халықаралық төлем жүйесі (B (Visa/Mastercard тағы басқа) |


# Ақы төлеуді жүргізуге әзірлік

Әдіс жоба жағынан тапсырысты төлеуді растауға арналған.

Жүйе жобаның confirm\_url-не іске қосуға сауал жібереді және мынадай міндетті параметрлері бар жауап күтеді: `id`, `status`, `message`, `is_payble`.

Егер `confirm_url`  параметрі төлем бастамашылығы кезінде берілсе, әдіс пысықталады.

### Backoff Policy

Жауап алу кепілдіктерін ұлғайту үшін сауалдарды орындау кезінде BackOff саясаттар пайдаланылады:

* InitialInterval = 500 \* time.Millisecond, қайталама сұрау аралықтары
* RandomizationFactor = 0.5,  қайталау арасындағы сұраныс уақытының таралуы
* MaxInterval = 60 \* time.Second, қайталау арасындағы максималды уақыт&#x20;
* MaxElapsedTime = 10 \* time.Minute, талпыныстар жасалатын уақыт

<mark style="color:blue;">`GET`</mark> `https://merchant-website/confirm`

#### Query Parameters

| Name                                                     | Type   | Description                    |
| -------------------------------------------------------- | ------ | ------------------------------ |
| type<mark style="color:red;">\*</mark>                   | string | Транзакция типі                |
| project\_reference\_id<mark style="color:red;">\*</mark> | string | Жоба жағындағы тапсырыс нөмірі |

#### Headers

| Name          | Type   | Description                                                                                               |
| ------------- | ------ | --------------------------------------------------------------------------------------------------------- |
| Authorization | String | Bearer  Авторотациялық хэш ([Қолтаңбаны қалыптастыруға ](/az/t-lem-shlyuzi/olta-bany-alyptastyru)қараңыз) |

{% tabs %}
{% tab title="200: OK Жоба жауабының мысалы. Барлық өрістер міндетті." %}

```json
{
    "id": "121abc", // Идентификатор транзакции на стороне проекта 
    "status": "success", // Статус заказа на стороне проекта
    "message": "order desciption", // Текстовое сопровождение ответа
    "is_payble" : true // Разрешение на проведение платежа
}
```

{% endtab %}
{% endtabs %}

`is_payble` параметрінің мәніне байланысты жүйе төлем жасау туралы шешім қабылдайды:

* `true` - Жоба төлемді жүргізуге рұқсат береді
* `false` - Жоба төлем жүргізуден бас тартады


# CMS


# Tilda Publishing

Tilda-да интернет-дүкен құру кезінде Tarlan Payments төлем шлюзін қосу

Қосылу үшін мыналар қажет:

1. Іске асырудың барлық кезеңдерінен өтіңіз

Сіз мынаны аласыз:

* Мерчант жобасының сәйкестендіргіші (merchant\_id:project\_id)
* Құпия кілт (Secret Key)

2. Tilda → Сайттың баптаулары → Төлем жүйелері → Tarlan Payments өтіңіз
3. "Мерчант жобасының сәйкестендіргіші" және "Құпия кілт" өрістеріне деректерді енгізіңіз
4. Валютаны таңдаңыз – Қазақстан теңгесі (KZT)

<figure><img src="/files/YLdgPiO8yUmOnIaS0DHy" alt=""><figcaption></figcaption></figure>

Төлем жүйесі қосылған.

*Егер бірнеше төлем жүйесі қосылған болса, онда олар тауар сатып алу кезінде төлем нұсқаларында автоматты түрде пайда болады.*


# Өзгерістер жиынтығы

<table data-full-width="true"><thead><tr><th width="128">Нұсқа</th><th>Сипаты</th></tr></thead><tbody><tr><td><strong>1.1.2</strong> от 21.11.23</td><td>Провайдердің <a href="/pages/ts2WDfm6ByjVs9FuDNIH">қате кодтары</a> қосылды</td></tr><tr><td><strong>1.1.1</strong> от 01.11.23</td><td><ol><li>Email, phone алу төлем бетіне көшірілді, міндеттілік мерчанттың ЖК-де реттеледі.</li><li> <a href="/pages/xDNK8ax14TEhzeK9tcCb">additional_data</a> өрісі арқылы қолтаңба қатесі түзетілді.</li></ol></td></tr><tr><td><strong>1.1.0</strong> от 19.10.23</td><td><ol><li><strong>Төлемді қайтару</strong></li></ol><p>Бөлім:<br>API <a href="/pages/2xL2uTgRZj8hpWPsuabM">Төлемді қайтару</a></p><ol start="2"><li><strong>Картаны Байластыру</strong></li></ol><p>Пайдаланушылар жылдам және қауіпсіз транзакциялар үшін өз карталарын екі жолмен байластыра алады:</p><ul><li>төлем виджетінде</li><li>back-to-back шешімі арқылы</li></ul><p>Бөлім:<br>API<a href="/pages/SBB6MXqU0rDlsNLq2NWQ"> Картаны Байластыру</a></p><ol start="3"><li><strong>Пайдаланушының Сақталған Картасынан Қаражатты Қабылдау және Шығару</strong>: Біз сақталған карталарды пайдалана отырып, ақшаны қабылдау мен шығарудың ыңғайлы тәсілін ұсынамыз.</li></ol><p>Бөлімдер:</p><p>API <a href="/pages/yacNAg6We8EcA7SXesJF#sa-tal-an-karta-boiynsha-t-lem">Қаражатты Қабылдау</a><br>API <a href="/pages/DuZft7hhZBasPvfyyNyU#sa-tal-an-karta-a-a-shany-alu">Қаражатты Шығару</a></p><p></p><ol start="4"><li><strong>Сақталған карталарды шақыру әдісі:</strong></li></ol><p>Карта токенін алу мүмкіндігі:</p><ul><li>транзакция мәртебесінде</li><li>Webhook арқылы</li></ul><p>Бөлімдер:<br>API Сақталған карталарды шақыру әдісі</p><p></p><ol start="5"><li>Google Pay: Енді ыңғайлы және жылдам онлайн-төлемдер үшін Google Pay қолдауға ие.</li></ol><p>Бөлімдер:<br>API <a href="/pages/7v9XzQK8oP3RHaWKYQNP">Google Pay</a></p><ol start="6"><li><strong>Iframe арқылы біріктіру:</strong> Біз жақсартылған пайдаланушылық тәжірибе үшін iframe арқылы өз қосымшамызбен біріктіру мүмкіндігін ұсынамыз.</li></ol><p>Бөлімдер:<br><a href="/pages/J6mah1ZpCsK64PcIzl2G">iframe</a> арқылы біріктіру мүмкіндігі</p><ol start="7"><li><strong>Tilda Publishing арқылы біріктіру:</strong> Енді сіз тамаша лендингтер мен интерактивті беттер жасау үшін біздің қосымшаны Tilda Publishing-пен біріктіре аласыз.</li></ol><p>Бөлімдер:</p><p><a href="/pages/D215PQuYVAxIPjhm6KKN">Tilda Publishing</a> арқылы біріктіру мүмкіндігі</p><ol start="8"><li><strong>Қолтаңбаны қалыптастырудағы өзгерістер:</strong> Біз қауіпсіздік деңгейінің жоғарылығын қамтамасыз ете отырып, қолтаңбаларды қалыптастыру процесіне жақсартулар енгіздік.</li></ol><p>Бөлімдер:<br><a href="/pages/3WfHYKpXKIAT6zwaUKQT">Қолтаңбаны қалыптастырудағы өзгерістер</a></p></td></tr><tr><td><strong>1.0.0</strong> от 01.08.23</td><td><ol><li><strong>Ақша қаражатын қабылдау және шығару:</strong></li></ol><p>Енді сіздің рөліңізге немесе мақсатыңызға қарамастан, біздің қосымша арқылы ақшаны қабылдай және шығара аласыз.<br><br>Бөлімдер:<br>API <a href="/pages/yacNAg6We8EcA7SXesJF">Ақша қаражатын қабылдау </a><br>API <a href="/pages/DuZft7hhZBasPvfyyNyU">Ақша қаражатын шығару</a></p><ol start="2"><li><strong>Цифрлық Қолтаңбаны қалыптастыру:</strong></li></ol><p>Транзакциялардың қосымша қауіпсіздігін қамтамасыз ететін барлық қаржылық операциялар үшін цифрлық қолтаңба жасау мүмкіндігі қосылды.</p><p><br>Бөлімдер:<br>API <a href="/pages/3WfHYKpXKIAT6zwaUKQT">Цифрлық Қолтаңбаны қалыптастыру</a></p><ol start="3"><li><strong>Call-Back-терді жіберу:</strong></li></ol><p>Енді жүйе төлемдерді өңдеу процесін жақсарта отырып, сәтті транзакциялардан кейін төлем ұйымына автоматты түрде хабарлама жібереді.</p><p><br>Бөлімдер:<br>API <a href="/pages/OHFrFSg3QLMK3JvOjTzc">Call-Back-терді жіберу</a><br></p></td></tr></tbody></table>


# Жүйе жауаптарының құрылымы

Әрбір сауалға жауапта: <mark style="color:green;">result</mark> өріс бар, онда: <mark style="color:green;">error\_code, message</mark> өрістері болады

Сауал сәтті өңделген кезде <mark style="color:green;">error\_code 0</mark>-ге тең болады.

Басқа жағдайларда <mark style="color:green;">error\_code</mark> өрісі сауалды дұрыс өңдемеу себебін және тиісті <mark style="color:green;">message</mark> көрсетеді.


# Қолтаңбаны қалыптастыру

Сервиспен өзара іс-қимыл жасау үшін сауалдарға SHA256 алгоритмін пайдалана отырып қол қойылады.

Қолтаңба әрбір сауал үшін жеке қалыптастырылады.

Қолтаңбаны қалыптастыру үшін келесі қадамдарды орындаңыз:

1. **Сауал денесі әліпби бойынша сұрыпталады және BASE64-те кодталады.**
2. **Сауалдың кодталған денесі мен secret\_key (жеке ұсынылады) тіркесімін жасаймыз**
3. **SHA256 хеш функциясын пайдалана отырып, алынған тіркесім нәтижесін хэштейміз**
4. **X-Signature сауалының тақырыптарына қолтаңбаны қосамыз**

<mark style="color:green;">""</mark> ретінде толтырылған сауал өрістері қолтаңбаны қалыптастыруға қатыспайды.


# Golang-та қолтаңбаны қалыптастыру мысалы:

```go
package main

import (
   "crypto/sha256"
   "encoding/base64"
   "encoding/json"
//Сауал денесі сауалға байланысты өзгереді

type Request struct {
   Agent       string `json:"agent"`
   Project     string `json:"project"`
   ServiceCode string `json:"service_code"`
}
//Мысал үшін secret 12345
const secret = "12345"

func main() {
   request := Request{
      Agent:       "tarlan",
      Project:     "mobile",
      ServiceCode: "101",
   }

   notSortedJson, err := json.Marshal(&request)
   if err != nil {
      panic(err)
   }

   var notSortedMap map[string]interface{}

   if err = json.Unmarshal(notSortedJson, &notSortedMap); err != nil {
      panic(err)
   }

   sortedJson, err := json.Marshal(&notSortedMap)
   if err != nil {
      panic(err)
   }

   signData := base64.StdEncoding.EncodeToString(sortedJson)

   sign := sha256.Sum256([]byte(signData + secret))

   fmt.Printf("Sign: %x", sign)
}
```


# python3-тегі қолтаңбаны қалыптастыру мысалы:

```go
import json
import base64
import hashlib
# Сауал денесі сауалға байланысты өзгереді

request_data = {
   "agent": "tarlan",
   "project": "mobile",
   "service_code": "101",
}
#Мысал үшін secret 12345 алынды
secret = "12345"

sorted_data = json.dumps(
       request_data,
       sort_keys=True,
       ensure_ascii=False,
       separators=(',', ':'),
   )


base64_encoded_data = base64.b64encode(sorted_data.encode()).decode()

data_to_sign = base64_encoded_data + secret

sha256_hash = hashlib.sha256(data_to_sign.encode()).hexdigest()

print("Sign:",sha256_hash)
```


# \[POST] /showcase-gateway/api/v1/test/check

Host: https\://agwsapi.dev-tarlanpayments.kz/

Аккаунт күйін тексеру

{% content-ref url="/spaces/dkkz4EKtpaWVPlq7ZwsC/pages/nqRkFjSFbXjz6VU8fsA2" %}
[Broken mention](broken://spaces/dkkz4EKtpaWVPlq7ZwsC/pages/nqRkFjSFbXjz6VU8fsA2)
{% endcontent-ref %}

{% content-ref url="/spaces/dkkz4EKtpaWVPlq7ZwsC/pages/Ocah8pk2xGzMMdt5yeaC" %}
[Broken mention](broken://spaces/dkkz4EKtpaWVPlq7ZwsC/pages/Ocah8pk2xGzMMdt5yeaC)
{% endcontent-ref %}


# Parameters

Parameters:

<table><thead><tr><th width="150">Параметрлер</th><th width="84">Формат</th><th>Сипаты</th><th>Міндеттілік</th></tr></thead><tbody><tr><td>username</td><td>String</td><td>Пайдаланушы сейкестендіргіші</td><td>Иә</td></tr><tr><td>agent</td><td>String</td><td>Tarlan жүйесіндегі витрина коды</td><td>Иә</td></tr><tr><td>project</td><td>String</td><td>Жобаның Tarlan берген коды</td><td>Иә</td></tr><tr><td>service_code</td><td>String</td><td>Витрина жағындағы қызмет сәйкестендіргіші</td><td>Иә</td></tr></tbody></table>

**Мысал:**

**Headers**\
Content-Type : *application/json*

X-Signature: *227e9c6513a43f71f4cb6acb3c73f26f3ea90f7e36305afc6d37f9923f12d8c8*

Body:

```go
{
    "username": "989898",
    "agent": "tarlan",
    "project": "mobile",
    "service_code": "201106"
}
```




---

[Next Page](/llms-full.txt/1)

