Руководство разработчика: Интеграция с Paynet

Платежная экосистема Узбекистана · Developer Portal
v3.4 · Июнь 2026

Руководство разработчика: Интеграция с Paynet (Developer Portal)

Добро пожаловать на портал разработчиков Paynet! Наша платформа — это агрегатор поставщиков услуг и мерчантов, предоставляющий удобные способы приема платежей.

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

1. Выбор типа интеграции

Как выбрать? (Decision Tree)

flowchart TD START["🤔 Как вы хотите\nпринимать платежи?"] --> Q1{"У вас есть свой\nAPI / ИТ-команда?"} Q1 -->|"❌ Нет"| UB["✅ Универсальный биллинг\n— Без разработки —\nPaynet всё делает сам"] Q1 -->|"✅ Да"| Q2{"Вы готовы реализовать\nAPI по стандарту Paynet?"} Q2 -->|"✅ Да"| UWS["⚙️ UWS Коннектор\n— Средняя сложность —\nВы реализуете JSON-RPC API"] Q2 -->|"❌ Нет, у нас свой API"| CUSTOM["🔧 Кастомный коннектор\n— Paynet адаптируется к вам —\nТребует бизнес-кейса"] style UB fill:#d1fae5,stroke:#1EB863,stroke-width:3px,color:#082E12 style UWS fill:#e0e7ff,stroke:#6366f1,stroke-width:2px,color:#1e1b4b style CUSTOM fill:#fef3c7,stroke:#f59e0b,stroke-width:2px,color:#78350f

Сравнение моделей

✅ Универсальный биллинг ⚙️ UWS Коннектор 🔧 Кастомный коннектор
Разработка ❌ Не требуется ✅ Нужна (JSON-RPC API) ❌ Не требуется (делает Paynet)
Описание Paynet сам собирает данные, принимает оплату и уведомляет мерчанта через Telegram-бот или Foyda. Вы реализуете API по стандарту Paynet (GetInformation, PerformTransaction и др.). Вы предоставляете свой существующий API, Paynet сам разрабатывает интеграцию.
Кому подходит Мерчантам без ИТ-команды и своего API. Компаниям с ИТ-инфраструктурой, готовым реализовать стандартизированный API. Крупным корпоративным клиентам с устоявшимся API.
Автоматизация Ручная (уведомления) Полная (API-to-API) Полная (API-to-API)

Что нужно от вас для каждой модели

✅ Универсальный биллинг — никакой разработки:

⚙️ UWS Коннектор — нужна реализация API:

[!NOTE] Что такое serviceId? serviceId — это статический внутренний идентификатор вашей услуги, который вы сами придумываете и передаете нам в документе "Порядок технического взаимодействия". Он НЕ является номером телефона или лицевым счетом клиента (эти данные передаются в массиве fields). Один партнер может предоставлять несколько услуг, и serviceId помогает Paynet понять, какую именно услугу оплачивает клиент.

⚠️ Это НЕ ваш вариант, если...

Модель НЕ подходит, если...
Универсальный биллинг Вам нужно автоматическое зачисление на баланс клиента, автоматическая отгрузка товара или интеграция с вашей ERP/CRM. В этом случае выбирайте UWS.
UWS Коннектор У вас нет ИТ-команды или сервера для размещения API. В этом случае выбирайте Универсальный биллинг.
Кастомный коннектор Вы стартап или малый бизнес без устоявшегося API и бизнес-объёмов. В этом случае выбирайте Универсальный биллинг или UWS.

2. Архитектура и процессы (Sequence Diagrams)

[!IMPORTANT] Архитектурная парадигма (Однонаправленность) Интеграция UWS работает по модели Push/Pull, где Paynet всегда выступает клиентом, а ваш биллинг — сервером. Вы не делаете запросов в сторону API Paynet. Все взаимодействия (включая проверки и отмены) инициируются исключительно со стороны серверов Paynet на ваш Endpoint.

Интеграция по UWS (Универсальный коннектор)

Основной сценарий успешного платежа:

sequenceDiagram autonumber actor Клиент participant Paynet as Paynet (ПАК) participant Партнер as Биллинг Партнера (UWS) Клиент->>Paynet: Ввод данных (ID абонента, сумма) Paynet->>Партнер: POST /uws (method: GetInformation) Партнер-->>Paynet: Данные абонента (ФИО, Баланс) Paynet-->>Клиент: Экран подтверждения Клиент->>Paynet: Подтверждение оплаты Paynet->>Партнер: POST /uws (method: PerformTransaction) Партнер-->>Paynet: Транзакция успешна (providerTrnId) Paynet-->>Клиент: Чек об оплате

Сценарий 1: Network Timeout (Таймаут сети):

sequenceDiagram autonumber participant Paynet as Paynet (ПАК) participant Партнер as Биллинг Партнера (UWS) Paynet->>Партнер: POST /uws (method: PerformTransaction) Note over Paynet, Партнер: Сетевой сбой или таймаут > 500мс Paynet--xПартнер: (Ответ не получен) Paynet->>Партнер: POST /uws (method: CheckTransaction) Партнер-->>Paynet: transactionState: 1 (Успешно) Note over Paynet: Paynet синхронизирует статус

Сценарий 2: Отмена транзакции (CancelTransaction):

sequenceDiagram autonumber participant Paynet as Paynet (ПАК) participant Партнер as Биллинг Партнера (UWS) Paynet->>Партнер: POST /uws (method: CancelTransaction) Note over Партнер: Решение об отмене — бизнес-логика партнера alt Партнер выполняет возврат Партнер-->>Paynet: transactionState: 2 (Отменена) else Клиент уже израсходовал средства Партнер-->>Paynet: Ошибка JSON-RPC 2.0 (77: Недостаточно средств для отмены) else Отчетный период закрыт (закрывающие документы сформированы) Партнер-->>Paynet: Ошибка JSON-RPC 2.0 (306: Время отмены истекло) else Транзакция не найдена Партнер-->>Paynet: Ошибка JSON-RPC 2.0 (203: Транзакция не найдена) end

Универсальный биллинг

Paynet обрабатывает всю логику самостоятельно и только уведомляет мерчанта.

sequenceDiagram autonumber actor Клиент participant Paynet as Paynet (ПАК / Foyda) participant Мерчант as Telegram-бот / Личный кабинет Клиент->>Paynet: Вводит данные в форму оплаты (настраиваемые поля) Paynet-->>Клиент: Проверка формата данных Клиент->>Paynet: Оплата услуги Paynet->>Paynet: Фиксация платежа в системе Paynet->>Мерчант: Уведомление об успешном платеже (Foyda / Telegram) Paynet-->>Клиент: Выдача чека

3. Требования к данным, Безопасность и Идемпотентность

3.1 Форматы данных и Валюта

[!WARNING] Ошибки в этих пунктах — самая частая причина отказов на этапе тестирования.

[!CAUTION] Единственное исключение из формата дат: параметр timestamp в запросе CheckTransaction приходит в формате EEE MMM dd HH:mm:ss z yyyy, например Mon Jun 16 06:12:41 UZT 2021. Этот формат зафиксирован исторически (по нему уже работает множество поставщиков) и изменению не подлежит — ваш парсер обязан его поддерживать. Все остальные даты, включая timestamp в CancelTransaction и все ответы вашего сервера, используют стандартный формат YYYY-MM-dd HH:mm:ss.

3.2 Авторизация и защита

3.3 Идемпотентность и Таймауты

Финансовые транзакции требуют строгой консистентности:


4. Операционная деятельность: Сверка и SLA


5. OpenAPI Спецификация для UWS

Спецификация доступна в файле OpenAPI (UWS).yaml. Она включает в себя описание всех JSON-RPC 2.0 методов: GetInformation, PerformTransaction, CheckTransaction, CancelTransaction, GetStatement, ChangePassword (необязательный), а также строгие JSON-схемы, коды ошибок и форматы.


6. Руководство по онбордингу и тестированию (UWS)

Для начала приема платежей через универсальный коннектор (UWS), выполните следующие шаги:

Шаг 1: Подготовка инфраструктуры

Шаг 2: Заполнение заявки (Анкеты)

Предоставьте менеджеру Paynet следующую информацию:

Шаг 3: Тестирование и Тест-кейсы

Перед запуском необходимо отработать стандартные тест-кейсы:

  1. Проверка абонента (GetInformation): Эмуляция успешного поиска абонента и эмуляция ошибки 302 (Клиент не найден).
  2. Проведение платежа (PerformTransaction): Успешное пополнение баланса абонента.
  3. Ограничения (PerformTransaction): Эмуляция ошибки 413 (Неверная сумма) или 101 (Квота исчерпана).
  4. Отмена (CancelTransaction): Проведение тестового платежа и его полная отмена. Возврат средств (частичные возвраты технически не поддерживаются). Эмуляция ошибок 77 (клиент уже израсходовал средства), 306 (отчетный период закрыт) и 203 (транзакция не найдена).
  5. Проверка статуса (CheckTransaction): Проверка статуса существующей транзакции (state 1) и несуществующей (state 3, успешный конверт — не ошибка). Обязательно проверьте парсинг timestamp в формате EEE MMM dd HH:mm:ss z yyyy.

Шаг 4: Запуск в Production (Go-Live)

После успешного прохождения всех тестов подписывается акт технической готовности, и ваши сервисы становятся доступны для оплаты миллионам пользователей Paynet!


7. Справочник кодов ошибок Paynet (Paynet Error Codes)

При возникновении бизнес-ошибки биллинг партнера возвращает JSON-RPC ответ с объектом error, содержащим code и message.

[!IMPORTANT] Все коды в этом разделе (201, 412, 413 и т.д.) — это коды ошибок Paynet уровня JSON-RPC, а не HTTP-статусы. Их часто путают с HTTP-кодами: на самом деле они возвращаются внутри объекта error в теле ответа, при этом сам HTTP-статус ответа остаётся 200 OK. Единственное исключение — аутентификация: при неверных логине/пароле возвращается HTTP 401 Unauthorized (см. примечание об ошибке 412 ниже).

Таблица маппинга бизнес-ошибок (Business Error Mapping)

Используйте эту таблицу, чтобы понять, какую ошибку возвращать в зависимости от вашего бизнес-кейса:

Бизнес-ситуация Рекомендуемый код ошибки Paynet
Проблемы с клиентом / вводом данных
Клиент ввел неверный номер устройства / лицевой счет 301, 302, 304 (Номер/Клиент/Товар не найден)
Кошелек пользователя не идентифицирован 113
Проблемы с услугами (serviceId)
Передан несуществующий serviceId 305 (Услуга не найдена)
Услуга временно не работает на вашей стороне 100 (Услуга временно не поддерживается)
Лимиты и суммы
Сумма превышает максимальный лимит операции 415
Превышен дневной лимит клиента 141
Превышен ежемесячный лимит клиента 140
Клиент передал неверную сумму (не соответствует тарифу) 413
Бизнес-ограничения
Клиент находится в вашем черном списке / запрет на оплату 501 (Транзакции запрещены)
Отмена и статусы транзакций
Paynet пытается отменить транзакцию, которая уже отменена 202 (Транзакция уже отменена)
Paynet отменяет транзакцию, но клиент уже израсходовал средства 77 (Недостаточно средств для отмены)
Вы отказываете в возврате: закрывающие документы сформированы, отчетный период закрыт (например, оплата в январе — возврат в марте) 306 (Допустимое время отмены истекло)
Paynet отменяет транзакцию, которой не было 203 (Транзакция не найдена)
Paynet спрашивает статус (CheckTransaction) транзакции, которой не было Не ошибка! Верните result с transactionState: 3
Paynet присылает дубликат транзакции (PerformTransaction) 201 (Транзакция уже существует) — далее Paynet вызовет CheckTransaction
Прочее
Запрос с IP-адреса вне белого списка Paynet 601 (Доступ запрещен) — лучше блокировать на уровне firewall
Неизвестное/неподдерживаемое значение команды 603 (Неправильный код команды)
Не передан обязательный параметр сервиса 411; ошибка конкретного параметра — 401410 (нумерация параметров определяется вашим сервисом и фиксируется в анкете)
Дата/время в нераспознаваемом формате 414

[!NOTE] Об ошибке 412 (Неверный логин или пароль): аутентификация выполняется исключительно на уровне HTTP — при неверных учетных данных возвращайте HTTP 401 Unauthorized, а не JSON-RPC ошибку. Код 412 — легаси из ранних версий протокола, в новых интеграциях не используется.

Полный справочник кодов ошибок Paynet

Код ошибки Paynet Описание
0 Проведено успешно
77 Недостаточно средств на счету клиента для отмены платежа
100 Услуга временно не поддерживается
101 Квота исчерпана
102 Системная ошибка
103 Неизвестная ошибка
113 Кошелёк не идентифицирован
140 Превышен ежемесячный лимит для данного аккаунта
141 Превышен дневной лимит для данного аккаунта
201 Транзакция уже существует
202 Транзакция уже отменена
203 Транзакция не найдена
301 Номер не существует
302 Клиент не найден
304 Товар не найден
305 Услуга не найдена
306 Допустимое время отмены транзакции истекло (отчетный период закрыт — партнер отказывает в возврате)
401 - 410 Ошибка валидации параметра 1 - 10
411 Не заданы один или несколько обязательных параметров
412 Неверный логин или пароль
413 Неверная сумма
414 Неверный формат даты и времени
415 Сумма превышает максимальный лимит
501 Транзакции запрещены для данного плательщика
601 Доступ запрещен
603 Неправильный код команды

Ошибки протокола JSON-RPC:

Код ошибки Описание
-32300 Ошибка возникает в том случае, если метод запроса не POST
-32700 Ошибка парсинга JSON (в ответе допускается "id": null)
-32600 В RPC-запросе отсутствуют обязательные поля или неверный тип
-32601 Запрашиваемый метод не найден
-32602 Отсутствуют обязательные поля параметров (уровень протокола; бизнес-аналог — 411)
-32603 Системная (внутренняя ошибка)

[!NOTE] Код 0 («Проведено успешно») — значение статуса, оно никогда не возвращается внутри объекта error.


8. История версий

Дата Версия Изменения
01.04.2022 1.0 Первоначальная версия спецификации UWS
20.09.2022 1.1 Обновленная версия
28.11.2023 3.3 CheckTransaction: параметр времени — timestamp
07.05.2025 3.4 CheckTransaction: уточнен формат timestamp (EEE MMM dd HH:mm:ss z yyyy). Актуальная версия

Портал и OpenAPI-спецификация соответствуют UWS v3.4 от 07.05.2025 с уточнениями core-команды Paynet: добавлен код ошибки 306 (допустимое время отмены истекло), зафиксировано требование TLS v1.3, поле status в ответе GetInformation подтверждено как обязательное.