> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.6mm.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.6mm.com/_mcp/server.

# Передача контрактов и сверка

Это руководство предназначено для **Agent Java SDK `v0.3.0`**, Java 8+ и помеченного публичного контракта. Примеры выполняются в серверной части партнера после инициализации `client` в [Быстрый старт](/ru/sdk/agent-sdk/java/quick-start).

## Пример предварительных условий

Фрагменты Java разделяют этот импорт. Инициализируйте `client` с помощью быстрого запуска и получите `platformUserId` из сохраненной привязки. Примеры идентификаторов пользователей/заказов необходимо заменить вашими собственными сохраненными значениями.

```java
import com.sixmm.agent.*;
import com.sixmm.agent.model.*;
import java.util.*;
```

## Перевод фиксированной суммы

Используйте `transfer` для переводов фиксированной суммы. `Direction.IN` означает передачу
с партнерской платформы на 6MM. `Direction.OUT` означает перенос с 6MM
вернуться на партнерскую платформу.

Используйте строки или `BigDecimal` для сумм. Не используйте `double` или `float`.

### Перенос через `agentUserId`

```java
import com.sixmm.agent.model.Direction;
import com.sixmm.agent.model.TransferRequest;
import com.sixmm.agent.model.TransferResponse;

TransferResponse resp = client.transfer(TransferRequest.fixed(
        "AGT-ORDER-1001",
        "agent-user-001",
        Direction.IN,
        "USDT",
        "10.00"));

System.out.println(resp.orderNo);
System.out.println(resp.orderStatus);
System.out.println(resp.agentUserId);
System.out.println(resp.platformUserId);
```

### Перенос через `platformUserId`

```java
TransferResponse resp = client.transfer(TransferRequest.fixedByPlatformUserId(
        "AGT-ORDER-1002",
        "1188041528",
        Direction.OUT,
        "USDT",
        "5.00"));
```

### Укажите оба идентификатора

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

```java
TransferRequest req = TransferRequest
        .fixed("AGT-ORDER-1003", "agent-user-001", Direction.IN, "USDT", "20.00")
        .withPlatformUserId("1188041528");

TransferResponse resp = client.transfer(req);
```

Поля запроса:

| Поле             | Тип          | Необходимый | Описание                                        |
| ---------------- | ------------ | ----------- | ----------------------------------------------- |
| `agentOrderNo`   | string       | Да          | Глобально уникальный партнерский номер заказа   |
| `agentUserId`    | string       | Условно     | Требуется, если `platformUserId` отсутствует    |
| `platformUserId` | string       | Условно     | Требуется, если `agentUserId` отсутствует       |
| `direction`      | перечисление | Да          | `IN` или `OUT`                                  |
| `currency`       | string       | Нет         | Заполняется из `defaultCurrency` при отсутствии |
| `amount`         | string       | Да          | Строка десятичной суммы                         |

Поля ответа:

| Поле             | Тип    | Описание                                       |
| ---------------- | ------ | ---------------------------------------------- |
| `orderNo`        | string | Номер заказа платформы                         |
| `orderStatus`    | string | `SUCCESS`, `FAILED`, `PROCESSING` и т. д.      |
| `agentUserId`    | string | Идентификатор пользователя на стороне партнера |
| `platformUserId` | string | 6MM идентификатор внешнего пользователя        |

## Подтверждение заказа и идемпотентность

После вызова `transfer` служба агента синхронно вызывает торговую
ядро на главном пути. В большинстве случаев ответ API уже содержит
синхронный результат торгового ядра.

| Результат    | Значение                                          | Партнерские действия                                                                      |
| ------------ | ------------------------------------------------- | ----------------------------------------------------------------------------------------- |
| `SUCCESS`    | Перенос выполнен успешно                          | Отметить локальный заказ как успешный                                                     |
| `FAILED`     | Передача была отклонена или не удалась            | Сохраните причину сбоя и покажите ее, когда это необходимо.                               |
| `PROCESSING` | Тайм-аут торгового ядра или неопределенность сети | Не повторяйте попытку с новым номером заказа. Подождите webhook или вызовите `queryOrder` |

Требования идемпотентности:

* Используйте один `agentOrderNo` для одной бизнес-операции.
* Если время ожидания HTTP истекло или произошел сбой в сети, сначала запросите тот же `agentOrderNo` .
* Webhooks можно повторить. Дедублируйте их с помощью ключа идемпотентности.

## Перенести все

`transferAllOut` перемещает доступный для вывода баланс пользователя на стороне 6MM обратно на
партнерская платформа.

```java
import com.sixmm.agent.model.TransferAllOutRequest;
import com.sixmm.agent.model.TransferAllOutResponse;

TransferAllOutResponse resp = client.transferAllOut(
        TransferAllOutRequest.of("AGT-ORDER-2001", "agent-user-001", "USDT"));

System.out.println(resp.orderStatus);
System.out.println(resp.amount);
```

От `platformUserId`:

```java
TransferAllOutResponse resp = client.transferAllOut(
        TransferAllOutRequest.byPlatformUserId("AGT-ORDER-2002", "1188041528", "USDT"));
```

В ответе `amount` — фактическая сумма перевода.

## Обратный порядок

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

```java
import com.sixmm.agent.model.ReverseOrderRequest;
import com.sixmm.agent.model.ReverseOrderResponse;

ReverseOrderResponse resp = client.reverse(ReverseOrderRequest.of(
        "AGT-ORDER-1001",
        "REV-ORDER-1001",
        "partner order rollback"));

System.out.println(resp.orderStatus);
```

Поля:

| Поле             | Тип    | Необходимый | Описание                                    |
| ---------------- | ------ | ----------- | ------------------------------------------- |
| `origOrderNo`    | string | Да          | Номер исходного заказа на передачу          |
| `reverseOrderNo` | string | Да          | Глобально уникальный номер обратного заказа |
| `reverseReason`  | string | Да          | Обратная причина                            |

Примечания:

* Реверс не является обычной операцией отмены.
* Обратные заказы также должны быть идемпотентны по номеру заказа.
* После того, как первоначальный ордер будет отменен, webhook может переместить исходный ордер
  `REVERSED` конечное состояние.

## Порядок запроса

```java
import com.sixmm.agent.model.OrderQueryType;
import com.sixmm.agent.model.QueryOrderRequest;
import com.sixmm.agent.model.QueryOrderResponse;

QueryOrderResponse resp = client.queryOrder(
        QueryOrderRequest.of("AGT-ORDER-1001", OrderQueryType.TRANSFER_IN));

System.out.println(resp.status);
System.out.println(resp.failReason);
```

Поддерживаемые значения `orderType`:

* `TRANSFER_IN`
* `TRANSFER_OUT`

Общие поля ответа:

| Поле             | Тип    | Описание                                       |
| ---------------- | ------ | ---------------------------------------------- |
| `orderType`      | string | Тип заказа                                     |
| `orderNo`        | string | Номер заказа партнера                          |
| `status`         | string | Статус заказа                                  |
| `direction`      | string | `IN` или `OUT`                                 |
| `transferMode`   | string | `FIXED_AMOUNT` или `ALL_OUT`                   |
| `currency`       | string | Валюта                                         |
| `amount`         | string | Количество                                     |
| `agentUserId`    | string | Идентификатор пользователя на стороне партнера |
| `platformUserId` | string | 6MM идентификатор внешнего пользователя        |
| `failReason`     | string | Причина отказа                                 |
| `createdAt`      | string | Время создания                                 |
| `completedAt`    | string | Время завершения                               |

## Список заказов

```java
import com.sixmm.agent.model.ListOrdersRequest;
import com.sixmm.agent.model.ListOrdersResponse;

ListOrdersRequest req = ListOrdersRequest.page(1, 20);
req.orderType = "TRANSFER_IN";
req.status = "SUCCESS";
req.startTime = "2026-06-01T00:00:00Z";
req.endTime = "2026-06-16T00:00:00Z";

ListOrdersResponse resp = client.listOrders(req);

System.out.println(resp.total);
resp.orders.forEach(order -> System.out.println(order.orderNo));
```

Рекомендации по пагинации:

* `page` начинается с 1.
* Оставьте `pageSize` на уровне 100 или ниже.
* Для заданий сверки постраничное выполнение и дедупликация с помощью `orderNo`.

## Источник и связанные руководства

* [Официальный источник v0.3.0](https://github.com/6mm-com/agent-java-sdk/tree/54aa3c1)
* [Обзор запроса и нумерация страниц](/ru/sdk/agent-sdk/java/perpetual-queries)
* [Финансирование кошелька](/ru/sdk/agent-sdk/java/funding-wallet)
* [Руководство по обновлению](/ru/sdk/agent-sdk/java/upgrade)

## Обратные вызовы событий фондов

`transfer.completed` может содержать `SUCCESS`, `FAILED` или исходное обновление заказа `REVERSED`; `reverse.completed` — терминальное событие разворота ордера. `transfer.dead` означает, что окончательное состояние остается неподтвержденным после повторных попыток и требует ручной сверки, а не подтвержденного сбоя. Само по себе название мероприятия не доказывает, что средства были зачислены.

Успешное подтверждение отличается от успешного перемещения средств: после записи действительного уведомления `targetStatus=FAILED` необходимо также вернуть HTTP 2xx. Сохранять дедупликацию событий средств с помощью `orderType:orderId:targetStatus` внутри продавца и области действия `environment`.

[Поля событий и примеры JSON](/ru/sdk/agent-sdk/java/webhook-events) · [Проверка подписи, ответы и повторные попытки](/ru/sdk/security/webhooks-idempotency)